前言:以前认为get和post只不过是http两种发送请求的方式,他们的区别也就那样,熟悉的很。但今天在SpringBoot学习过程中却让我有了新的认识。写下这篇文章来记录一下
1.Get和Post是什么?
get和post是Http协议中两种发送请求的方式
GET- 从指定的资源请求数据
POST-向指定的资源提交要被处理的数据
2.HTTP是什么?
HTTP是基于TCP/IP的关于数据在万维网中如何通信的协议
3.Get和Post区别
url可见性
get传参方式是通过地址栏URL传参,可以直接看到get传递的参数,post传递的参数URL不可见。get把请求的数据在URL后面通过?连接,通过&进行参数分割。参数与键值对形式传递。Post将参数存放在HTTP的包内
传输数据大小
get传递数据是通过URL进行传递,传递的数据长度受URL大小的限制,URL 最大长度是2048个字符。post没有长度限制
后退页面
get后退不会有影响,post后退会重新进行提交
缓存
get请求可以被缓存,Post不可以被缓存
编码方式
get请求只支持URL编码,post支持多种编码方式。get请求传递中文会乱码
历史记录
get请求的记录会留在历史记录,post请求不会留在历史记录
字符类型
get支持ASCII字符,post没有字符型限制
4.post相比较get传参方式的优点
post安全性比get传参方式好
a. post数据存在HTTP包中,一般不会被查找到
b. post不会被浏览器缓存
c. 不会留在历史记录中
post传送数据没有字符和编码限制,能发送的数据类型更多
post传送数据没有大小限制,比get可以发送更多的数据
post缺点:速度比get传输慢,get效率更高
5.为什么get的效率比post高
get产生一个TCP数据包,post产生两个TCP数据包。但并不是所有的浏览器post都会请求两次,火狐只请求一次。(get直接发送数据,post先将请求头发送服务器确认,然后发送真正的数据)
get会将数据进行缓存
6.传统JavaWeb接收参数方式
传统Servlet中,我们在前端页面使用$.ajax(),$.get(),或$.post()发送请求到servlet中时,servlet使用 request.getParameter("name", name ) 通用
7.SpringBoot接收参数方式
接下来就是重点了,也就是我遇到的问题之所在。话不多说,上图。
信息显示不出来
为什么使用get可以拿到数据而post不行呢? 都是SpringSecurity框架惹的祸,SpringSecurity配置csrf(),csrf()会拦截所有的post请求,这涉及到了csrf攻击。解决方案也比较简单,直接设置http.csrf().disable()
由于spring的RequestParam注解接收的参数是来自于requestHeader中,即请求头,也就是在url中,格式为xxx?username=123&password=456,t通常用于Get请求向Post和Delete等其他类型的请求也可以使用
而RequestBody注解接收的参数则是来自于requestBody中,即请求体中。
一般用于处理application/json、application/xml等类型的数据,通常用于接收post和delete请求
所以使用get还是post传参还是比较讲究的。
问题:post请求可以用@RequestParam接收吗
前端使用json发送post请求,后端不使用@RequestParam,转而使用@Param注解
两种注解应用场景