这个问题不是什么时候一般使用GET或POST; 它是关于这是建议的一个用于处理注销一个Web应用程序。 我发现很多对一般意义上的GET和POST之间的区别的信息,但我没有找到这个特定的场景了肯定的答案。
作为一个实用主义者,我倾向于使用GET,因为执行它比POST方法简单; 刚落,一个简单的链接,你就大功告成了。 这似乎是用的情况下,绝大多数的网站我能想到的,从我的头顶至少。 即使堆栈溢出手柄注销与GET。
让我犹豫的东西是(虽然旧)的论点,即通过去和检索每一个他们在页面找到相关链接,这样用户得到更快的反应时,她点击了一些网络加速器/代理预缓存页面。 我不知道这是否仍然适用,但如果是这样的话,那么在理论上与这些加速器之一的用户会得到当她登录踢出应用的,因为她的加速器会发现和检索注销链接即使她从来没有点击就可以了。
我已阅读到目前为止的所有建议,POST应该用于“破坏性行动”,而不会改变应用程序的内部状态式的查询和such-行动应该用GET来处理 。 在此基础上,这里真正的问题是:
被注销视为一种破坏性行为的应用程序的/它改变应用程序的内部状态?
使用POST
。
在2010年,使用GET
可能是一个可以接受的答案。 但是,今天(2013年),浏览器将预取的网页,他们“想”你下次访问。
这里的StackOverflow的开发商谈到在Twitter上这个问题之一:
我要感谢我的银行作出注销GET请求,以及Chrome团队,为方便URL prefetching.-尼克Craver( @Nick_Craver ) 2013年1月29日,
有趣的事实:StackOverflow上用于处理注销通过GET,但现在不是了。
在REST应该没有会话,因此没有什么破坏。 REST客户端在每次请求验证。 登录,或缩小,它只是一种错觉。
你真正问的是应在浏览器继续发送每个请求的认证信息。
可以说,如果你的应用并创造被记录在幻想,那么你应该能够为“注销”使用JavaScript。 无需往返。
菲尔丁论文- 5.1.3
从客户端到服务器的每个请求都必须包含所有必要了解该请求的信息,并且不能采取在服务器上存储的任何方面的优势。 因此,会话状态完全保存在客户端上
一种方法GET
可能被滥用这里是一个人(竞争对手可能:)放在一个图像标记与src="<your logout link>"
ANYWHERE在互联网上,如果你的网站的用户绊倒在该网页上,他会不知不觉中退出。
是正确的,GET / POST(或其他动词)的一些资源(通过URL地址)的行动 - 因此它的普遍看好资源的状态,而不是应用程序状态如此。 因此,在真正的精神,你应该有一个URL,如[host name]\[user name]\session
,然后“删除”将是注销行动正确的动词。
使用[host name]\bla bla\logout
的不是一个真正的REST全路(IMO)的URL,那么,为什么有关它的正确使用GET / POST的争论?
当然,我也用GET在我的应用程序的注销URL :-)
注销无助于应用程序本身。 它改变了相对于应用程序的用户的状态。 在这种情况下,似乎你的问题更多的是基于应该如何命令从用户发起,开始这个动作。 由于这是不是“破坏性行动”,确保会议被弃置或毁灭,但无论你的应用程序或数据被改变,这不是不可行,让这两种方法来启动注销程序。 该职位应被任何用户发起的行动中(如 - 用户点击“退出”),同时获得可用于应用程序启动日志奏保留(如 - 异常强行检测潜在用户的入侵重定向到登录页面,注销GET )。
你好我的角度来看,当你登录你检查用户名/密码,如果这些都符合你创建登录令牌。
CREAT令牌=>方法POST
当你登出你distroy令牌所以我是最合理的方法应该是DELETE
删除令牌=>方法DELETE
预缓存的情况是一个有趣的一个。 但我猜测,如果很多网站的公司,所以不要担心这个问题,那么也许你也不应该。
或许链接可以在JavaScript中实现?
编辑:据我所知,技术上是一个GET应该是只读的请求,不改变应用程序的状态。 一个POST应该更改状态的写/编辑请求。 然而,其他应用程序的问题可能更愿意克服POST一些状态改变的请求,我不认为有任何问题与此有关。
那么,如果你让你的web应用程序放弃通过注销脚本的会话,你通常不需要任何。 通常有一个会话变量这就是你想要放弃的会话唯一的。
我没有看到从登录电子(去提升用户权限)是一个多么desctructive行动。 那是因为“退出”的行动应该是只提供给那些已经登录的用户否则它会过时。
包含浏览器的Cookie随机生成的字符串是代表所有用户会话。 有吨的方式来摧毁它,以便有效地注销仅仅是你的访问者的服务。