关于GET和POST的一些思考

       前几天看到同学分享的一道面试题:get方式有没有body?

      我的第一反应就是,当然没有啦,get不就是通过url后面的参数传递的吗,post才是通过请求体的body传递的。但想了一下,又不太确定,所以跑去找了一下资料,发现自己对GET和POST的误解还是挺大的。现在总结一下,也希望可以跟大家讨论一下,希望得到各位大神的指点。


GET和POST与数据如何传递无关

     GET和POST是由HTTP协议定义的。在HTTP协议中,Method和Data(URL, Body, Header)是正交的两个概念,就是说,使用哪个Method与应用层的数据如何传输是没有相互关系的。
  HTTP协议没有规定,如果Method是POST数据就要放在BODY中;也没有规定,如果Method是GET,数据(参数)就一定要放在URL中而不能放在BODY中。
  而且,现代的Web Server是支持GET中包含BODY这样的请求的。虽然这种请求不可能从浏览器发出,但是现在的Web Server并不是只为浏览器服务。

HTTP协议对GET和POST都没有对长度的限制  

      HTTP协议明确地指出了,HTTP头和BODY都没有长度的限制。而对于URL长度上的限制,有以下两方面的原因:


  1. 浏览器。浏览器会对URL长度做限制。根据搜索到的资料,IE对URL长度会限制在2048个字符内,但有个兄弟专门去验证了一下,是2047个字符,我在此表示佩服,就因为验证是不是长度确实为2048个字符做了很多努力,治学的态度非常严谨,此为传送门http://blog.csdn.net/kwsy2008/article/details/48251157  。


  2. 服务器。URL的长度过长,对服务器处理是一种负担。原本一个会话没有太多数据,如果有人恶意地构造几个几M大小的URL,并不停地访问你的服务器。服务器的最大并发数显然会下降。另一种攻击方式是,告诉服务器此次发送的请求体中Content-Length是一个很大的数,然后只给服务器发一点点数据,服务器就会保持此次连接,继续等待接收数据。哪怕你有超时设置,这种故意的次次访问超时也会大大耗费服务器的资源。有鉴于此,多数服务器出于安全、稳定等方面的考虑,会给URL长度加限制。但是这个限制是针对所有HTTP请求的,与GET、POST没有关系。


安不安全和GET、POST无关

        GET 发送数据时将参数通过URL发送,在URL中可以看到所传参数。但是如果是底层的调用,比如Ajax请求,就不会在浏览器的地址栏中有显示。GET请求返回的内容可以被浏览器缓存起来。

        POST 将数据部分通过“请求体”传递,数据不在URL显示。POST请求,浏览器在你按下F5的时候会跳出确认框,浏览器不会缓存POST请求返回的内容。

        此处从安全上来讲,与不显示的后端Ajax的GET请求,其实在安全性上是一样的。所以POST不见得会更安全,因为POST的设计之初,本来就不是为了安全而来的。



参考资料:http://www.cnblogs.com/nankezhishi/archive/2012/06/09/getandpost.html

                  http://blog.csdn.net/liujiahan629629/article/details/18511079

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值