什么http状态代码应该用来告诉客户端会话超时?

在网页中,如果会话(包含用户是否已经过authentication的信息)已经超时,那么它使用YUI连接pipe理器/数据源向服务器发送AJAX请求,那些只能通过authentication才能看到的ajax响应用户应该返回一个http状态码,告诉客户端会话已经超时,然后客户端将他redirect到login页面,或者询问他是否想要延长会话。

我的问题是,在这种情况下,什么http状态码最适合告诉客户端会话超时?

来自wiki的HTTP状态码列表

最好的我可以build议是一个带有WWW-Authenticate头的HTTP 401状态码。

403请求的问题是RFC 2616状态“授权不会帮助和请求不应该重复”。 (即,如果您通过身份validation无关紧要,您将无法访问该资源)。

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说:“我们不知道你是否被允许,因为你没有带你的ID。得到它,然后再试一次。“

比较维基百科的定义 :

HTTP 403 – 请求是合法请求,但服务器拒绝响应。

HTTP 401 – 与403 Forbidden类似,但专门用于可以进行身份​​validation但失败或尚未提供的情况。

那么419 – 这不是标准的,但维基百科的描述似乎适合:

419身份validation超时

不是HTTP标准的一部分,“身份validation超时”表示之前有效的身份validation已过期。 它被用作401未授权的替代scheme,以便区分被拒绝访问特定服务器资源的其他身份validation的客户端。

我相信适当的代码将是403 /禁止。 没有任何与会话有直接关系。

事实是,会话超时没有标准的HTTP状态码。 会话是在应用层实现的,而不是HTTP传输层。

有一个自定义的状态代码,微软已经用于会话超时:599,或者只是在5xx范围内构build自己的状态代码。

从状态码维基百科:

599networking连接超时错误(未知)此状态码未在任何RFC中指定,但Microsoft公司使用HTTP代理将代理后的networking连接超时信号发送给代理前的客户端。

我使用自定义状态代码599进行会话超时,然后在AJAX响应中检查它。

根据Bobo上面提供的Http状态码的维基百科链接:

 440 Login Timeout (Microsoft) A Microsoft extension. Indicates that your session has expired. 

从技术上讲,接受的答案是正确的:如果你已经知道你将要失败的请求,并且你正在问哪个失败代码返回,那么HTTP 401“Unauthorized(Unauthenticated)”是合适的,所以以提示重新authentication。

但首先,问问自己: 你是否应该拒绝?

考虑到用户可能只是访问你的网站的公共页面,在这种情况下,你将被打上一个“未经授权”的脸。 消息,并要求他们重新进行身份validation,以便查看他们通常无需身份validation即可看到的页面。 这不是很酷。

我的build议是忽略会话令牌未知的事实,并简单地继续生成新的会话令牌并为其创build新的会话。 会话的初始状态当然是“尚未authentication”的,所以如果用户试图访问一个非公开页面,那么页面会看到他们收到一个HTTP 401“Unauthorized(Unauthenticated) “并且必须authentication。 但是,如果用户login公共页面,他们将不会注意到任何不同。

对于非Ajax请求,我使用302redirect。

对于Ajax请求,我使用了200个已知的错误。 这样我可以利用数据对象。 我发现数据对象比parsingjqXHR获取信息更容易。 然后,我不需要担心什么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 }); 

代码408.“请求超时”看起来很完美 – RFC 2616解释了它的含义

客户端在服务器准备等待的时间内没有发出请求。

即正好是“超时”,就像你需要的一样!