get比post更不安全,因为参数直接暴露在URl中,所以不能用来传递敏感的信息。
对参数的数据类型,get只接受ASCLL字符,而post没有限制
get在URl中传递的参数是有长度限制的,而post没有
get请求会被浏览器主动cache,而post不会除非手动设置
get在浏览器回退时无请求的,而post会再次请求
get参数通过URl传递,post放在request body中
get请求只能进行url编码,而post支持多种编码方式
get比post更快
常见误区
误区1、get在URl中传递的参数是有长度限制的,而post没有
首先,HTTP协议并未规定get和post的长度限制,get的最大长度限制是因为浏览器和web服务限制了URL的长度,不同的浏览器和web服务器,限制的最大长度不一样。
即使get有长度限制,也是限制整个URL的长度,而不仅仅是参数值数据长度,就要看各个浏览器厂家的规定或者根据web服务器的处理能力来决定的。
以下就是对各种浏览器和web服务器的最大处理能力做一些说明:
IE (Browser):URL最大长度限制为2083个字符。
Firefox owser):对于Firefox浏览器URL的长度限制为65,536个字符。
afari (Browser):URL最大长度限制为 80,000个字符。
Opera (Browser):URL最大长度限制为190,000个字符。
oogle (chrome):URL最大长度限制为8182个字符。
che (Server):能接受最大url长度为8,192个字符。
Microsoft Internet Information Server(IIS):能接受最大url的长度为16,384个字符。
为了符合所有标准,url的最好不好超过最低标准的2083个字符(2k+35)。当然在做客户端程序时,url并不展示给用户,只是个程序调用,这时长度只受web服务器的影响了。对于中文的传递,一个汉字最终编码后的字符长度是9个字符。
最常见的form表单,浏览器默认的form表单,默认的content-type是application/x-www-form-urlencoded,提交的数据会按照key value的方式,jquery的ajax默认的也是这种content-type。当然在post方式中添加querystring一定是可以接收的到,但是在get方式中加body参数就不一定能成功接收到了。
误区2、post比get更安全
这里的安全是相对性,并不是真正意义上的安全,通过get提交的数据都将显示到url上,页面会被浏览器缓存,其他人查看历史记录会看到提交的数据,而post不会。另外get提交数据还可能会造成Cross-site request forgery攻击。
误区3、为什么get比post快
post请求包含更多的请求头,(如content-type),但这影响不了多少,最重要的是post在真正接受接受数据之前会先将请求头发送给服务器进行确认,然后才是真正的发送数据。
看看post的请求过程:
浏览器请求tcp连接(第一次握手)
服务器答应进行tcp连接(第二次握手)
浏览器确认,并发送post请求头(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)
服务器返回100 Continue响应
浏览器发送数据
服务器返回200 OK响应
get的请求过程:
浏览器请求tcp连接(第一次握手)
服务器答应进行tcp连接(第二次握手)
浏览器确认,并发送get请求头和数据(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)
服务器返回200 OK响应
误区4、GET产生一个TCP数据包;POST产生两个TCP数据包。
我在网上查了查,千万不要被某些内容引导你。
GET和POST还有一个重大区别,简单的说:
GET产生一个TCP数据包;POST产生两个TCP数据包。
长的说:
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
这个结论是错误的。
而实际上,不论哪一种浏览器,在发送 POST 的时候都没有带 Expect 头,server 也自然不会发 100 continue。通过抓包发现,尽管会分两次,body 就是紧随在 header 后面发送的,根本不存在『等待服务器响应』这一说。
注:误区4观点参考网上大神结论。
误区5、get和post都符合安全性和幂等性
幂等性:就是对数据库的操作次数,一次或者多次操作获得的结果是一样的,则认为符合幂等性。
安全性:对数据库的操作没有改变数据库中的数据,则认为符合安全性。
从数据库层面来看,GET请求方式是做查询操作,因此不会改变数据库中原有的数据,认为符合安全性。事实上GET请求可能会出现多次请求的结果(例如在两次请求中间对数据库中的数据作了更改),从这来说是不符合幂等性的定义,但是因为GET请求知识查询数据库,不会对数据库做任何更改,因此也认为是幂等的。
POST请求方式是既不幂等又不安全,首先POST请求方式往数据库中提交数据的,因此会改变数据库中的数据。其次,POST请求方式每次获得的结果都有可能不一样,因为POST请求是作用在上一级的URL上的,则每一次请求都会添加一份新资源(这也是POST和PUT方式的最大区别,PUT方式是幂等的)。
赶紧学,我们不希望下次见到你还是那些老套的区别,我们只想简单的知道你到底对get和post有没有去深入的了解。