在一个网页中,它使用YUI连接管理器/数据源将AJAX请求发送到服务器,如果会话(其中包含有关用户是否已通过身份验证的信息)已经超时,则那些只能通过身份验证查看的ajax响应用户应返回一个http状态代码,告诉客户端会话已超时,然后客户端要么将其重定向到登录页面,要么询问他是否要扩展会话。
我的问题是,在这种情况下,哪种HTTP状态代码最适合告诉客户端会话已超时?
在一个网页中,它使用YUI连接管理器/数据源将AJAX请求发送到服务器,如果会话(其中包含有关用户是否已通过身份验证的信息)已经超时,则那些只能通过身份验证查看的ajax响应用户应返回一个http状态代码,告诉客户端会话已超时,然后客户端要么将其重定向到登录页面,要么询问他是否要扩展会话。
我的问题是,在这种情况下,哪种HTTP状态代码最适合告诉客户端会话已超时?
Answers:
我所能建议的最好是带有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似乎没有对此进行专门的保护,但是我实际上看不到它被它禁止(它似乎与任何“必须”,“不得”,“应该”或“不应”条件都没有冲突)。
我希望对于超时和CSRF令牌无效之类的问题,有一个更具体的HTTP状态代码,这样更清楚了。
我建议使用HTTP 401。
403基本上说:“您不允许,走开,再也不回来”,而401则说:“我们不知道是否允许您,因为您没有携带身份证。得到它,然后再试一次。”
比较Wikipedia的定义:
HTTP 403-该请求是合法请求,但服务器拒绝响应。
HTTP 401-与403 Forbidden相似,但专门用于可以进行身份验证但已失败或尚未提供身份验证的情况。
response MUST include a WWW-Authenticate header field
。因此,在没有WWW-Authenticate标头字段的情况下发送该代码是错误的。
419怎么样-它不是标准的,但是Wikipedia上的描述似乎合适:
419身份验证超时
419身份验证超时不是HTTP标准的一部分,它表示先前有效的身份验证已过期。它用作“ 401未经授权”的替代方法,以区别于被拒绝访问特定服务器资源的已通过身份验证的客户端。
HttpServletResponse
如果您知道任何其他可靠的来源,最好参考Java @John。
我相信适当的代码将是403 / Forbidden。没有与会话直接相关的任何会话。
authorization will not help
-我认为这意味着HTTP身份验证无济于事。哪个是对的。发送授权标头将不会更改任何内容。401和403都不是理想的,但是我认为403比401更好。401会话超时是错误的,因为RFC 2616明确指出client MAY repeat the request with a suitable Authorization header field
。但是,在这种情况下,客户端不应该重复请求(至少不是没有临时步骤)。不幸的是,我们无法将后半部分与状态代码进行通信。
事实是,会话超时没有标准的HTTP状态代码。会话是在应用程序层而不是HTTP传输层中实现的。
Microsoft已经使用了一个自定义状态代码来进行会话超时:599,或者只是在5xx范围内组成您自己的状态代码。
从状态码Wiki:
599网络连接超时错误(未知)此状态代码未在任何RFC中指定,但是由Microsoft Corp.使用HTTP代理向代理前面的客户端发送信号,将代理后面的网络连接超时发出信号。
我将自定义状态代码599用于会话超时,然后在AJAX响应中进行检查。
440 Login Timeout (Microsoft)
按照Faisal Mq的答案使用?
根据Bobo上面提供的Http状态代码的Wikipedia链接:
440 Login Timeout (Microsoft)
A Microsoft extension. Indicates that your session has expired.
从技术上讲,接受的答案当然是正确的:如果您已经确定将要失败该请求,并且正在询问要返回的失败代码,那么HTTP 401“未经授权(未经验证)”是合适的选择,以便提示重新认证。
但首先,问问自己: 您是否应该使请求失败?
考虑到用户可能只是访问您网站的公共页面,在这种情况下,您将用“未经授权!”将他们拍在脸上。消息,并要求他们重新进行身份验证,以查看通常无需身份验证即可看到的页面。那不酷。
我的建议是忽略会话令牌未知的事实,而只是继续生成一个新的会话令牌并为其创建一个新的会话。会话的初始状态当然将是“尚未认证”,因此,如果用户尝试访问非公共页面,则该页面将看到该页面,他们收到HTTP 401“未授权(未认证)” ”,并且必须进行身份验证。但是,如果用户登陆公共页面,他们将不会发现任何不同。
对于非Ajax请求,我使用302重定向。
对于Ajax请求,我将200用于已知错误。这样,我就可以利用数据对象。我发现该数据对象比解析jqXHR获取信息更容易使用。然后,我不必担心尝试重新使用哪些HTTP状态代码根据自己的情况。
jQuery示例:
$.ajax({
//send data to server
})
.done(function(data, textStatus, jqXHR) {
if (data.success) {
//then process return data
}
else {
//get error type or message from data object
//could use custom error codes
}
})
.fail(function(jqXHR, textStatus, errorThrown) {
//handle unknown errors
});