这个问题不是关于何时一般使用GET或POST; 它是关于处理Web应用程序注销的推荐方法.我已经在一般意义上找到了关于GET和POST之间差异的大量信息,但我没有找到这个特定场景的明确答案.
作为一个实用主义者,我倾向于使用GET,因为实现它比POST更简单; 只需删除一个简单的链接就可以了.这似乎是我能想到的绝大多数网站的情况,至少从头脑中可以看出来.甚至Stack Overflow也可以使用GET进行注销.
让我犹豫不决的是(尽管很老)一些论点,即一些网络加速器/代理通过访问和检索他们在页面中找到的每个链接来预先缓存页面,因此用户在点击它们时会得到更快的响应.我不确定这是否仍然适用,但如果是这种情况,那么从理论上讲,一旦有用这种加速器的用户在登录后就会被赶出应用程序,因为她的加速器会找到并检索注销链接,即使她从未点击过它.
到目前为止我所阅读的所有内容都建议POST应该用于"破坏性操作",而不改变应用程序内部状态的操作(如查询等)应该用GET处理.基于此,这里真正的问题是:
从应用程序注销被视为破坏性操作/是否会改变应用程序的内部状态?
使用POST
.
在2010年,使用GET
可能是一个可接受的答案.但是今天(2013年),浏览器将预先获取他们"认为"您将访问的页面.
以下是在Twitter上讨论此问题的StackOverflow开发人员之一:
我要感谢我的银行作出注销GET请求,以及Chrome团队,为方便URL prefetching.-尼克Craver(@Nick_Craver)2013年1月29日,
有趣的事实:StackOverflow用于通过GET处理注销,但不再是.
在REST中应该没有会话,因此没有什么可以破坏.REST客户端对每个请求进行身份验证.登录或退出,这只是一种幻觉.
您真正要问的是浏览器是否应该继续在每个请求上发送身份验证信息.
可以说,如果您的应用程序确实产生了登录的错觉,那么您应该能够使用javascript"注销".无需往返.
论文 - 第5.1.3节
从客户端到服务器的每个请求必须包含理解请求所需的所有信息,并且不能利用服务器上任何存储的上下文.因此,会话状态完全保留在客户端上
GET
这里可能滥用的一种方法是,一个人(竞争对手可能:) src="
在互联网上放置任意图像标签,如果您网站的用户偶然发现该页面,他将在不知情的情况下退出.
为了正确,GET/POST(或其他动词)是对某些资源的操作(由URL寻址) - 因此它通常是关于资源的状态而不是关于应用程序状态.所以在真正的精神中,你应该有一个URL [host name]\[user name]\session
,然后'DELETE'将是注销动作的正确动词.
[host name]\bla bla\logout
在完全不是REST的完整方式(IMO)中使用URL作为URL,那么为什么要讨论正确使用GET/POST呢?
当然,我也在我的应用程序中使用GET注销URL :-)
注销不会对应用程序本身产生任何影响.它会更改用户与应用程序相关的状态.在这种情况下,您的问题似乎更多地基于如何从用户启动命令以开始此操作.由于这不是"破坏性行为",因此确保会话被放弃或销毁,但您的应用程序或数据都没有被更改,允许两种方法启动注销过程并不是不可行的.任何用户发起的操作都应该使用该帖子(例如 - 用户单击"注销"),而get可以保留用于应用程序启动的注销(例如,检测潜在用户入侵的异常,通过注销GET强制重定向到登录页面).
您好我的观点是,当您登录时检查用户名/密码,如果匹配,则创建登录令牌.
CREAT令牌=>方法POST
当您注销时,您将销毁令牌,因此对我来说,最合理的方法应该是DELETE
DELETE token =>方法DELETE