bob*_*obo 74 php ajax yui http-status-codes
在网页中,它使用YUI连接管理器/数据源向服务器发送AJAX请求,如果会话(包含用户是否已经过身份验证的信息)已经超时,那些只能通过身份验证查看的ajax响应用户应该返回一个http状态代码,告诉客户端会话已经超时,然后客户端只是将他重定向到登录页面或询问他是否要扩展会话.
我的问题是,在这种情况下,什么http状态代码最适合告诉客户端会话超时?
Iai*_*ins 60
我能建议的最好的是带有WWW-Authenticate标头的HTTP 401状态代码.
403请求的问题是RFC 2616声明"授权无效,请求不应重复".(即,无论您是否经过身份验证都无关紧要,您都无法访问该资源).
401请求的问题是它声明它们"必须包含WWW-Authenticate头字段".正如有人所指出的它似乎并没有违反该规范的WWW-Authenticate头使用自定义的值.
我在RFC 2617中看不出为什么HTTP 401状态与这样的自定义WWW-Authenticate标头结合起来不合适的原因:
WWW-Authenticate: MyAuthScheme realm="http://example.com"
Run Code Online (Sandbox Code Playgroud)
该OAuth规范实际上似乎只做这一点,因为他们推荐这个(虽然他们使我想起了RFC的奇解释):
WWW-Authenticate: OAuth realm="http://server.example.com/"
Run Code Online (Sandbox Code Playgroud)
这看起来似乎并没有被RFC明确规定,但我实际上看不到它是被它禁止的(它似乎与任何必须或绝不冲突,不应该或不应该发生冲突).
我希望有一个更具体的HTTP状态代码,用于超时和CSRF令牌无效等事情,这样更清楚.
Jas*_*son 12
我相信适当的代码将是403/Forbidden.没有任何与会话直接相关的内容.
小智 10
事实是,会话超时没有标准的HTTP状态代码.会话在应用程序层中实现,而不是在HTTP传输层中实现.
Microsoft已经使用了一个自定义状态代码用于会话超时:599,或者只是在5xx范围内组成您自己的状态代码.
来自状态代码Wiki:
599网络连接超时错误(未知)此状态代码未在任何RFC中指定,但由Microsoft Corp. HTTP代理用于将代理后面的网络连接超时发信号通知代理前面的客户端.
我使用自定义状态代码599进行会话超时,然后在AJAX响应中检查它.
根据Bobo上面提供的Http状态代码的维基百科链接:
440 Login Timeout (Microsoft)
A Microsoft extension. Indicates that your session has expired.
Run Code Online (Sandbox Code Playgroud)
当您发布链接时,在该链接中我找到了此HTTP状态代码440。您可以将440 HTTP状态代码用于会话过期。
440登录超时
The client's session has expired and must log in again.
Run Code Online (Sandbox Code Playgroud)
401未经授权,当用户登录凭据错误时,我们可以使用。或在标头中传递的身份验证令牌无效。
403禁止当用户对请求的资源没有特定权限时,可以使用此选项。
因此,我认为我们应该使用440 Login Time-out。