这个问题不是关于何时一般使用GET或POST; 关于哪个是推荐用于处理Web应用程序注销的问题。我已经在一般意义上找到了大量关于GET和POST之间差异的信息,但我没有找到这个特定场景的明确答案。
作为一个实用主义者,我倾向于使用GET,因为实现它比POST更简单;只需删除一个简单的链接就可以了。这似乎是我能想到的绝大多数网站的情况,至少从头脑中可以看出来。甚至Stack Overflow也可以通过GET处理注销。
让我犹豫不决的事情是(尽管很老)一些网络加速器/代理通过去检索他们在页面中找到的每个链接来预先缓存页面,因此用户点击它们时会得到更快的响应。我不确定这是否仍然适用,但如果是这种情况,那么从理论上说,一旦这些加速器中的一个加速器的用户在登录后就会被赶出应用程序,因为她的加速器会找到并检索注销链接,即使她从未点击它。到目前为止,我所阅读的所有内容都建议 POST应该用于“破坏性操作”,而不会改变应用程序内部状态的操作(如查询等)应该使用GET 。基于此,这里真正的问题是:
退出应用程序是否被视为破坏性操作/是否会改变应用程序的内部状态?
答案 0 :(得分:406)
使用POST
。
2010年,使用GET
可能是一个可以接受的答案。但是今天(2013年),浏览器会预先获取他们“认为”您将访问的网页。
以下是在Twitter上讨论此问题的StackOverflow开发人员之一:
我要感谢我的银行注销GET请求,感谢Chrome团队提供便捷的网址预取.- Nick Craver(@Nick_Craver)January 29, 2013
有趣的事实:StackOverflow曾用于通过GET处理注销,但现在不再处理注销了。
答案 1 :(得分:39)
在REST中应该没有会话,因此没有什么可以破坏的。 REST客户端对每个请求进行身份验证。登录或退出,这只是一种幻觉。
您真正要问的是浏览器是否应该继续在每次请求时发送身份验证信息。
可以说,如果您的应用程序确实产生了登录的错觉,那么您应该能够使用javascript“注销”。不需要往返。
Fielding Dissertation - Section 5.1.3
从客户端到服务器的每个请求 必须包含所有信息 必须了解这个要求, 并且不能利用任何 存储的上下文在服务器上。会议 因此,国家完全保持 客户
答案 2 :(得分:36)
这里可以滥用GET
的一种方式是,一个人(竞争对手可能:)在互联网上放置了src="<your logout link>"
任意地的图像标签,如果您网站的用户偶然发现该页面,他会在不知不觉中退出。
答案 3 :(得分:18)
要正确,GET / POST(或其他动词)是某些资源上的操作(由URL寻址) - 因此它通常与资源的状态有关,而不是与应用程序状态有关。所以在真正的精神中,你应该有一个诸如[host name]\[user name]\session
的URL,然后'DELETE'将是用于退出操作的正确动词。
使用[host name]\bla bla\logout
作为URL并不是真正的REST完整方式(IMO),那么为什么要讨论正确使用GET / POST呢?
当然,我也在我的应用程序中使用GET注销网址: - )
答案 4 :(得分:14)
注销不会对应用程序本身产生任何影响。它会更改用户与应用程序相关的状态。在这种情况下,您的问题似乎更多地基于如何从用户启动命令以开始此操作。由于这不是“破坏性行为”,因此确保会话被放弃或销毁,但您的应用程序或数据都没有被更改,允许两种方法启动注销过程并不是不可行的。任何用户发起的操作都应该使用该帖子(例如 - 用户单击“注销”),而get可以保留用于应用程序启动的注销(例如,检测潜在用户入侵的异常,通过注销GET强制重定向到登录页面)。
答案 5 :(得分:10)
您好我的观点是,当您登录时,请检查用户名/密码,如果匹配,则创建登录令牌。
CREAT令牌=&gt;方法 POST
当您注销时,您将销毁令牌,因此最合理的方法应该是DELETE
DELETE token =&gt;方法 DELETE
答案 6 :(得分:1)
预缓存的场景很有趣。但我猜测,如果很多网站都不担心这个,那么也许你也不应该这样做。
或许链接可以用javascript实现?
编辑:据我所知,从技术上讲,GET应该是只读请求,不会改变应用程序状态。 POST应该用于更改状态的写入/编辑请求。但是,对于某些状态更改请求,其他应用程序问题可能更喜欢GET而不是POST,我认为这没有任何问题。
答案 7 :(得分:0)
最近我正在研究一个使用GET登出的项目 下面是Nodejs Express中的代码,它工作得很好
您的router.js
const express = require("express");
router.get("/signout", signout);
您的controller.js
exports.signout = (req, res) => {
res.clearCookie('t'); //clearing cookie, which is
//assign to the user during sign in.
res.json({message : 'Signout success'});
};
答案 8 :(得分:-1)
如果您让Web应用程序通过注销脚本放弃会话,那么您通常也不需要。通常会有一个会话变量,对于您想要放弃的会话而言是唯一的。
答案 9 :(得分:-2)
我不知道如何退出(撤消用户权限)是一种破坏性行为。那是因为“注销”操作应仅对已经登录的用户可用,否则它将被淘汰。
浏览器Cookie中包含的随机生成的字符串都代表您的用户会话。有很多方法可以摧毁它,因此有效退出只是为访问者提供服务。