博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HTTP POST GET 本质区别详解
阅读量:7110 次
发布时间:2019-06-28

本文共 1340 字,大约阅读时间需要 4 分钟。

0.参考文献

1.分析

  一般在浏览器中输入网址访问资源都是通过GET方式;在FORM提交中,可以通过Method指定提交方式为GET或者POST,默认为GET提交。Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。

  URL全称是资源描述符,我们可以这样认 为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的 、 、 、 4个操作。

  根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的,可以参见。

  1. 安全的是指没有明显的对用户有影响的副作用(包括修改该资源的状态)。HTTP方法里的GET和HEAD都是安全的。
  2. 幂等的是指一个方法不论多少次操作,结果都是一样。PUT(把内容放到指定URL),DELETE(删除某个URL代表的资源),虽然都修改了资源内容,但多次操作,结果是相同的,因此和HEAD,GET一样都是幂等的。

  所以根据HTTP协议,GET是安全的,也是幂等的,而POST既不是安全的,也不是幂等的。但在实际应用中,以上2条规定并没有这么严格。比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的。因为它总是返回当前的新闻。从根本上说,如果目标是当用户打开一个链接时,他可以确信从自身的角度来看没有改变资源即可。

  通常情况下我们都说POST的安全性要比GET的安全性高(注意:这里所说的安全性和上面GET提到的“安全”不是同个概念。上面“安全”的含义仅仅是不作数据修改,而这里安全的含义是真正的Security的含义),比如:通过GET提交数据,用户名和密码将明文出现在URL上,比如有一个常见的urllogin.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD,通过这个url我们就知道该用户的用户名是:hyddd,密码是idontknow。但是就因为这个原因说 POST 比 GET 安全是错的,因为POST和GET都是明文传输,用httpfox等插件,或者像WireShark 等类似工具就能观察到。

  POST和GET的差别其实是很大的。语义上,GET是获取指定URL上的资源,是读操作,重要的一点是不论对某个资源GET多少次,它的状态是不会改变的,在这个意义上,我们说GET是安全的(不是被密码学或者数据保护意义上的安全)。因为GET是安全的,所以GET返回的内容可以被浏览器,Cache服务器缓存起来(其中还有很多细节,但不影响这里的讨论)。

  而POST的语意是对指定资源“追加/添加”数据,所以是不安全的,每次提交的POST,参与的代码都会认为这个操作会修改操作对象资源的状态,于是,浏览器在你按下F5的时候会跳出确认框,缓存服务器不会缓存POST请求返回内容

本文转自xwdreamer博客园博客,原文链接http://www.cnblogs.com/xwdreamer/archive/2012/05/24/2517017.html,如需转载请自行联系原作者

你可能感兴趣的文章
我的友情链接
查看>>
Case_Compressed Mode_Background
查看>>
python 利用pexpect进行多机远程命令执行
查看>>
Python学习系列 (第一章):Python 的简介
查看>>
【转载】addShutdownHook的用处
查看>>
CSS3学习3----举例
查看>>
一个可以检测网络内主机类型的脚本
查看>>
利用Zabbix监控Lync的实时在线人数
查看>>
使用strace+pstack利器分析程序性能
查看>>
类和对象、实例的关系理解
查看>>
Nginx 负载均衡
查看>>
学习日志---非递归二叉树游标遍历(前中后层序)
查看>>
数据库同步自动断开问题的处理
查看>>
错误页定义方法
查看>>
Guid.NewGuid() 和 new Guid()的区别
查看>>
我的友情链接
查看>>
vim技巧
查看>>
DotNetTextBox V3.0 所见即所得编辑器控件 For Asp.Net2.0(ver 3.1.2Beta)
查看>>
mysql-5.6.25-linux-glibc2.5-i686.tar.gz错误
查看>>
nginx 服务并发过10万的linux内核优化配置
查看>>