当两个用户同时(或在任何时候)向我的服务器执行POST请求时,我遇到的问题只发生在我的WSGI staging服务器上,在这样做的过程中,两个用户中的一个被注销。我想知道是否有人有任何想法,什么会导致多个用户无法与服务器交互?
在以下情况下会发生错误:
1.我在同一台机器或不同的机器上打开两个不同的浏览器示例(一个私有/一个公共),然后转到我的stg URL。
1.我在每个浏览器上登录到两个不同的用户帐户(保存在我的数据库中)。
1.我同时点击每个浏览器上的一个按钮(并发请求到服务器)。POST或GET)
1.每个用户的sessionid都被覆盖,并且每个用户最终都被发送回登录页面。除了用户的cookie sessionid被覆盖之外,没有任何与之相关的“错误”。
我在Django中创建了一个应用程序。我正在使用会话引擎SESSION_ENGINE ='django.contrib.sessions.backends.signed_cookies'。
我确实使用了一个login_required装饰器:从django.contrib.auth.decorators导入login_required
到目前为止,我认为这是一个数据库连接,但事实并非如此;这是不是这样的,因为我可以通过我的本地机器(localhost)上的错误,而不会遇到它,这是奇怪的。
这仅仅是我使用的WSGI服务器上的一个问题。
编辑:看起来这真的只是一个与请求并发的问题。我可以让两个用户延迟发送post请求,直到每个post请求都被返回,并且都不会注销。仅当请求并发时才会出现此问题。这适用于所有请求类型。
编辑2:这是100%的问题,通过cookie持有的会话ID。什么会导致sessionid在并发请求上被覆盖?这是身份验证中的竞争条件吗??
编辑3:我怀疑这仍然是一个cookie/sessionid问题。我修复了我的django,只使用自定义用户模型,并通过默认方法进行身份验证。并发请求时会覆盖sessionid。
如果任何人有什么建议,检查我会洗耳恭听!
谢谢你,谢谢
1条答案
按热度按时间hujrc8aj1#
@ArunT @NickODell感谢您的帮助!
由于WSGI服务器的不同示例的密钥不同,因此服务器在并发调用时会覆盖sessionid。问题在于我分配密钥的方式
更具体地说,您不能为SK Bad代码生成随机密钥:
正确的方法是从管道变量中获取一组密钥!
谢谢你,谢谢