当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《什么http状态代码应该用于告诉客户端会话超时?》经验,为你挑选了7个好方法。

在网页中,它使用YUI连接管理器/数据源向服务器发送AJAX请求,如果会话(包含用户是否已经过身份验证的信息)已经超时,那些只能通过身份验证查看的ajax响应用户应该返回一个http状态代码,告诉客户端会话已经超时,然后客户端只是将他重定向到登录页面或询问他是否要扩展会话.

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

来自wiki的HTTP状态代码列表



1> Iain Collins..:

我能建议的最好的是带有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令牌无效等事情,这样更清楚.



2> Jonathon Hil..:

我推荐一个HTTP 401.

403基本上说,"你不被允许,走开,不要回来",401说,"我们不知道你是否被允许,因为你没有携带你的身份证.得到它,然后再试一次."

比较维基百科的定义:

HTTP 403 - 请求是合法请求,但服务器拒绝响应它.

HTTP 401 - 类似于403 Forbidden,但特别适用于可能进行身份验证但已失败或尚未提供的情况.


401用于*HTTP认证*.RFC 2616说`响应必须包含WWW-Authenticate头字段`.因此,在没有*WWW-Authenticate标头字段*的情况下发送该代码是错误的*.

3> 小智..:

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

419身份验证超时

不是HTTP标准的一部分,419 Authentication Timeout表示先前有效的身份验证已过期.它被用作401 Unauthorized的替代方案,以区别于被拒绝访问特定服务器资源的其他经过身份验证的客户端.


知道这个来自哪里(除了维基百科)?如果它不在官方RFC中,谁定义了它?
它似乎也从该维基页面中删除

4> Jason..:

我相信适当的代码将是403/Forbidden.没有任何与会话直接相关的内容.


我不能同意这一点,RFC 2616明确指出,导致403响应的请求"不应该被客户重复"并且"授权将无济于事".
`授权无济于事 - 我认为这意味着*HTTP身份验证*无济于事.哪个是对的.发送Authorization标头不会改变任何内容.401和403都不是理想的,但我认为403比*401更好*401会话超时错误*因为RFC 2616明确指出`客户端可以用合适的授权头字段重复请求.但是,在这种情况下,客户**不应该重复请求(至少在没有临时步骤的情况下).不幸的是,我们无法用状态代码传达后一部分.
403告诉客户端(基本上)"除非你修改你的请求,否则不要再这样做",但是如果会话已经建立,则不需要修改.此外,在大多数情况下,您无法对(当前)请求执行任何操作以重新建立会话.

5> 小智..:

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

Microsoft已经使用了一个自定义状态代码用于会话超时:599,或者只是在5xx范围内组成您自己的状态代码.

来自状态代码Wiki:

599网络连接超时错误(未知)此状态代码未在任何RFC中指定,但由Microsoft Corp. HTTP代理用于将代理后面的网络连接超时发信号通知代理前面的客户端.

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


网络连接超时与会话超时非常不同.如果您要使用Microsoft扩展中的代码,为什么不按照[Faisal Mq的回答]使用"440登录超时(Microsoft)"(http://stackoverflow.com/a/22484262/1862009)

6> Faisal Mq..:

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

440 Login Timeout (Microsoft)

    A Microsoft extension. Indicates that your session has expired.



7> Vinay Pandya..:

当您发布链接时,在该链接中我找到了此HTTP状态代码440。您可以将440 HTTP状态代码用于会话过期。

440登录超时

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

401未经授权,当用户登录凭据错误时,我们可以使用。或在标头中传递的身份验证令牌无效。

403禁止当用户对请求的资源没有特定权限时,可以使用此选项。

因此,我认为我们应该使用440 Login Time-out

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有