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

问题描述 投票:68回答:11

在一个网页,它使用YUI连接管理器/数据源,以AJAX请求发送到服务器,如果(包含用户是否已经认证的信息)会话已经超时,只能通过认证查看这些Ajax响应用户应该返回一个HTTP状态代码,告诉客户端会话已经超时,那么客户端或者简单重定向他到登录页面,或问他,如果他想延长会议。

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

List of HTTP status codes from wiki

php ajax yui http-status-codes
11个回答
60
投票

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

与403所请求的问题是在RFC 2616状态“授权不会帮助和请求不应该重复。” (即不要紧,如果你验证过了,你是不是会得到访问该资源,永远)。

与401所请求的问题是它指出,他们“必须包含一个WWW-Authenticate头场”。作为someone has noted它似乎并没有违反该规范的WWW-Authenticate头使用自定义的值。

我看不到任何理由RFC 2617为什么一个HTTP 401状态用一个自定义的WWW-Authenticate头这样的合并没有好:

WWW-Authenticate: MyAuthScheme realm="http://example.com"

oAuth spec实际上似乎只做这一点,因为他们推荐这个(虽然他们使我想起了RFC的奇解释):

WWW-Authenticate: OAuth realm="http://server.example.com/"

这似乎不是由RFC具体制裁,但我不能真正看到它是由它禁止(它似乎并不冲突与任何必须或不能,该不该条件)。

我希望能有一个更具体的HTTP状态代码的超时和喜欢的事情CSRF令牌是无效所以这是更清晰。


-2
投票

对于非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
});

-3
投票

代码408“请求超时”,似乎是完美的 - RFC 2616解释这意味着

客户端没有产生服务器已准备等待的时间内的请求。

即,完全是“超时”,就像你需要!


30
投票

我会建议一个HTTP 401。

而403基本上说,“你不允许的,走不回来”,401说,“我们不知道,如果你允许或不是因为你没带身份证。去得到它,然后再试一次。”

比较Wikipedia's definitions

HTTP 403 - 请求是合法的请求,但服务器拒绝对此作出回应。

HTTP 401 - 类似于403禁止,但专为使用在认证是可能的但发生故障或尚未提供。


18
投票

约419什么 - 它不是标准,而是description on Wikipedia似乎适合:

419验证超时

不是HTTP标准的一部分,419验证超时表示先前有效的认证已过期。它被用来作为一种替代401未授权的顺序,否则验证客户端来区分被拒绝访问特定的服务器资源。


13
投票

我认为适当的代码将是403 /禁止。有没有任何直接相关的会议。


10
投票

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

目前,微软已经使用了会话超时自定义状态码:599,或仅仅弥补在5XX范围内自己的状态代码。

从状态代码的Wiki:

599网络连接超时错误(未知)此状态码不以任何RFC中指定,而是使用由微软公司HTTP代理发信号通知网络中的代理前面的代理之后超时连接到客户端。

我用的是自定义状态码599会话超时,然后在Ajax响应进行检查。


8
投票

按照由波波上面提供Http Status Codes的维基百科链接:

440 Login Timeout (Microsoft)

    A Microsoft extension. Indicates that your session has expired.

5
投票

当你发布一个链接,该链接,我发现这个HTTP状态代码440,您可以使用440 HTTP状态代码会话过期。

440登录超时

 The client's session has expired and must log in again.

401未授权的情况下,用户登录证书是错误的,我们可以使用。或在头中传递的身份验证令牌无效。

403禁止我们可以用这个当用户不具有请求的资源特定的权限。

所以在我看来,我们应该使用440登录超时。


0
投票

技术上,公认的答案是正确的:如果你已经确切知道你将要失败的请求,你问哪个故障代码返回,然后HTTP 401“未授权(未经身份验证)”是一个合适的,所以以提示重新验证。

但首先,问自己:你应该请求失败?

考虑到用户可能简单地访问您的网站的公共页面,在这种情况下,你会被他们拍打在脸上用“未授权”!消息,并要求重新进行身份验证,才能看到一个页面,他们通常能够看到不进行认证。这不是很酷。

我的建议是忽略的事实是会话令牌是未知的,只是继续生成一个新的会话令牌,并为它创建一个新的会话。当然,本次会议的初始状态将是“还未完成认证”,因此,如果用户试图访问一个非公开页面,则该页面会看到它,他们收到一个HTTP 401“未授权(未经身份验证) “必须进行身份验证。但是,如果用户登陆一个公共页面上,他们不会注意到有什么不同。


0
投票

我会用302重定向响应,以“位置”头重定向到像资源路径“/ AUTH-需要”

客户端可以路线与登录/密码形式的模态资源路径,避免转院用户到另一个页面。

© www.soinside.com 2019 - 2024. All rights reserved.