首页 文章

注销:GET或POST?

提问于
浏览
331

This question is not about when to use GET or POST in general; 它是关于处理Web应用程序注销的推荐方法 . 我已经在一般意义上找到了关于GET和POST之间差异的大量信息,但我没有找到这个特定场景的明确答案 .

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

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

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

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

9 回答

  • 370

    使用 POST .

    在2010年,使用 GET 可能是一个可接受的答案 . 但是今天(2013年),浏览器会预先获取您接下来要访问的页面 .

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

    我要感谢我的银行注销GET请求,感谢Chrome团队提供便捷的URL预取.- Nick Craver(@Nick_Craver)2013年1月29日

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

  • 35

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

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

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


    Fielding Dissertation - Section 5.1.3

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

  • 1

    这里可能滥用的一种方式是,一个人(竞争对手可能:)在互联网上放置了一个带有 src="<your logout link>" ANYWHERE的图像标签,如果您网站的用户偶然发现该页面,他将在不知不觉中退出 .

  • 14

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

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

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

  • -1

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

  • 17

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

    CREAT令牌=>方法 POST

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

    DELETE令牌=>方法 DELETE

  • -2

    预缓存的场景是一个有趣的一个 . 但我猜测,如果很多网站都不担心这个,那么也许你也不应该这样做 .

    或者也许链接可以用javascript实现?

    编辑:据我所知,从技术上讲,GET应该是只读请求,不会改变应用程序状态 . POST应该用于更改状态的写入/编辑请求 . 但是,对于某些状态更改请求,其他应用程序问题可能更喜欢GET而不是POST,我认为这没有任何问题 .

  • 5

    好吧,如果你让你的web应用程序通过注销脚本放弃会话,你通常也不需要 . 通常会有一个会话变量,它对于您想要放弃的会话是唯一的 .

  • 38

    我不知道如何退出(降低用户权限)是一种破坏性行为 . 那是因为“注销”操作应仅对已经登录的用户可用,否则它将被淘汰 .

    浏览器cookie中包含的随机生成的字符串都代表您的用户会话 . 有很多方法可以摧毁它,因此有效退出只是为访客提供服务 .

相关问题