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

注销:GET或POST?

如何解决《注销:GET或POST?》经验,为你挑选了6个好方法。

这个问题不是关于何时一般使用GET或POST; 它是关于处理Web应用程序注销的推荐方法.我已经在一般意义上找到了关于GET和POST之间差异的大量信息,但我没有找到这个特定场景的明确答案.

作为一个实用主义者,我倾向于使用GET,因为实现它比POST更简单; 只需删除一个简单的链接就可以了.这似乎是我能想到的绝大多数网站的情况,至少从头脑中可以看出来.甚至Stack Overflow也可以使用GET进行注销.

让我犹豫不决的是(尽管很老)一些论点,即一些网络加速器/代理通过访问和检索他们在页面中找到的每个链接来预先缓存页面,因此用户在点击它们时会得到更快的响应.我不确定这是否仍然适用,但如果是这种情况,那么从理论上讲,一旦有用这种加速器的用户在登录后就会被赶出应用程序,因为她的加速器会找到并检索注销链接,即使她从未点击过它.

到目前为止我所阅读的所有内容都建议POST应该用于"破坏性操作",而不改变应用程序内部状态的操作(如查询等)应该用GET处理.基于此,这里真正的问题是:

从应用程序注销被视为破坏性操作/是否会改变应用程序的内部状态?



1> David Murdoc..:

使用POST.

在2010年,使用GET可能是一个可接受的答案.但是今天(2013年),浏览器将预先获取他们"认为"您将访问的页面.

以下是在Twitter上讨论此问题的StackOverflow开发人员之一:

我要感谢我的银行作出注销GET请求,以及Chrome团队,为方便URL prefetching.-尼克Craver(@Nick_Craver)2013年1月29日,

有趣的事实:StackOverflow用于通过GET处理注销,但不再是.


@ Mark0978,点击链接.
@Red根据HTTP/1.1标准,这是服务器的错,而不是浏览器的错.预计GET在服务器端没有副作用.该标准甚至说"用户没有要求副作用,因此不能对他们负责".
在我的浏览器中,Stackoverflow注销看起来像
  • 注销 这是一个GET,而不是POST
    感谢这次更新,戴夫.我甚至没有注意到他们将他们的注销切换到了POST,我老实说也不知道Chrome内置了预取内容.最后,你引用的文件可能从未提供过我在我描述的问题的更好的例子.我的问题,证实了我的怀疑.我正在投票给你的答案并使其成为公认的答案.
    有趣。那可能是我最不喜欢的功能之一,然后注销,然后问我是否确定。猜测它可以阻止预取退出,但是Amazon,Ebay和Gmail都使用GET进行注销,而在告知用户注销和实际注销事件之间没有技巧页面。我可以想象在这两个页面之间会导致许多人错误地认为自己已注销。SO的问题是最小的,不涉及金钱,而且所有内容的99%都是公开的。

    2> Darrel Mille..:

    在REST中应该没有会话,因此没有什么可以破坏.REST客户端对每个请求进行身份验证.登录或退出,这只是一种幻觉.

    您真正要问的是浏览器是否应该继续在每个请求上发送身份验证信息.

    可以说,如果您的应用程序确实产生了登录的错觉,那么您应该能够使用javascript"注销".无需往返.


    论文 - 第5.1.3节

    从客户端到服务器的每个请求必须包含理解请求所需的所有信息,并且不能利用服务器上任何存储的上下文.因此,会话状态完全保留在客户端上


    但实际上,登录信息保存在标有"httponly"属性的cookie中,以防止某些xss风险,这意味着它只能从服务器重置(不能手动清除cookie)
    用户中的"手动"进入浏览器设置并选择"清除cookie"选项."注销"网站几乎是不可接受的方式.

    3> raveren..:

    GET这里可能滥用的一种方法是,一个人(竞争对手可能:) src=""在互联网上放置任意图像标签,如果您网站的用户偶然发现该页面,他将在不知情的情况下退出.


    src =是一个简单的浏览器请求,它不是来自服务器端,而是来自客户端.它携带所有cookie并来自用户IP.这就是广告跟踪像素有效的原因.确定此类漏洞的唯一方法是检查引荐来源.
    http://SuperLogout.com正是这样做的(在隐藏图像中加载`/ logout`网址),它可以工作.
    re:SuperLogout ......我不知道为什么我点击它.
    不,这不对.注销链接仅在发送正确的cookie数据时才有效,该数据不会来自其他域.即使会话ID存储在URL中,也不会因为每个会话的更改而无效.
    哇,我从未想过这个!那么,另一个原因是不使用GET,另一个原因我不明白为什么每个人都这样做.该死的,现在我很想在我的帖子中包含一个http://stackoverflow.com/users/logout"图像",看看会发生什么:-D

    4> VinayC..:

    为了正确,GET/POST(或其他动词)是对某些资源的操作(由URL寻址) - 因此它通常是关于资源的状态而不是关于应用程序状态.所以在真正的精神中,你应该有一个URL [host name]\[user name]\session,然后'DELETE'将是注销动作的正确动词.

    [host name]\bla bla\logout在完全不是REST的完整方式(IMO)中使用URL作为URL,那么为什么要讨论正确使用GET/POST呢?

    当然,我也在我的应用程序中使用GET注销URL :-)


    在那种情况下,我会争辩说在URL中使用[用户名]部分似乎是不必要的,因为用户总是从(即DELETE)*他们自己的*会话退出; 从来没有其他用户':-)

    5> Joel Etherto..:

    注销不会对应用程序本身产生任何影响.它会更改用户与应用程序相关的状态.在这种情况下,您的问题似乎更多地基于如何从用户启动命令以开始此操作.由于这不是"破坏性行为",因此确保会话被放弃或销毁,但您的应用程序或数据都没有被更改,允许两种方法启动注销过程并不是不可行的.任何用户发起的操作都应该使用该帖子(例如 - 用户单击"注销"),而get可以保留用于应用程序启动的注销(例如,检测潜在用户入侵的异常,通过注销GET强制重定向到登录页面).


    这是令人困惑的,因为注销改变了状态.POST是改变状态的动词.GET用于获取无状态数据.这令人困惑,因为我们希望POST请求具有有效负载.如下所述,DELETE在会话对象上最正确.

    6> 小智..:

    您好我的观点是,当您登录时检查用户名/密码,如果匹配,则创建登录令牌.

    CREAT令牌=>方法POST

    当您注销时,您将销毁令牌,因此对我来说,最合理的方法应该是DELETE

    DELETE token =>方法DELETE


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