在网页中,它使用YUI连接管理器/数据源向服务器发送AJAX请求,如果会话(包含用户是否已经过身份验证的信息)已经超时,那些只能通过身份验证查看的ajax响应用户应该返回一个http状态代码,告诉客户端会话已经超时,然后客户端只是将他重定向到登录页面或询问他是否要扩展会话.
我的问题是,在这种情况下,什么http状态代码最适合告诉客户端会话超时?
来自wiki的HTTP状态代码列表
我能建议的最好的是带有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"
该OAuth规范实际上似乎只做这一点,因为他们推荐这个(虽然他们使我想起了RFC的奇解释):
WWW-Authenticate: OAuth realm="http://server.example.com/"
这看起来似乎并没有被RFC明确规定,但我实际上看不到它是被它禁止的(它似乎与任何必须或绝不冲突,不应该或不应该发生冲突).
我希望有一个更具体的HTTP状态代码,用于超时和CSRF令牌无效等事情,这样更清楚.
我推荐一个HTTP 401.
403基本上说,"你不被允许,走开,不要回来",401说,"我们不知道你是否被允许,因为你没有携带你的身份证.得到它,然后再试一次."
比较维基百科的定义:
HTTP 403 - 请求是合法请求,但服务器拒绝响应它.
HTTP 401 - 类似于403 Forbidden,但特别适用于可能进行身份验证但已失败或尚未提供的情况.
那么419 - 它不是标准的,但维基百科上的描述似乎适合:
419身份验证超时
不是HTTP标准的一部分,419 Authentication Timeout表示先前有效的身份验证已过期.它被用作401 Unauthorized的替代方案,以区别于被拒绝访问特定服务器资源的其他经过身份验证的客户端.
我相信适当的代码将是403/Forbidden.没有任何与会话直接相关的内容.
事实是,会话超时没有标准的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.
当您发布链接时,在该链接中我找到了此HTTP状态代码440。您可以将440 HTTP状态代码用于会话过期。
440登录超时
The client's session has expired and must log in again.
401未经授权,当用户登录凭据错误时,我们可以使用。或在标头中传递的身份验证令牌无效。
403禁止当用户对请求的资源没有特定权限时,可以使用此选项。
因此,我认为我们应该使用440 Login Time-out。