为了账号安全,请及时绑定邮箱和手机立即绑定

面试中get和post的区别

标签:
Java
  1. get比post更不安全,因为参数直接暴露在URl中,所以不能用来传递敏感的信息。

  2. 对参数的数据类型,get只接受ASCLL字符,而post没有限制

  3. get在URl中传递的参数是有长度限制的,而post没有

  4. get请求会被浏览器主动cache,而post不会除非手动设置

  5. get在浏览器回退时无请求的,而post会再次请求

  6. get参数通过URl传递,post放在request body中

  7. get请求只能进行url编码,而post支持多种编码方式

  8. 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有没有去深入的了解。

图片

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消