记一次跨域问题引出的内容
1. 目前碰到的关于加了注解还跨域的情况
- 前台给后台传递的参数有问题,比如axios传给后台一个参数,而这个参数本身没有定义或者不存在,这种情况属于粗心
- 请求的url有访问限制,比如需要登录才能访问,有次用gitee上的图片作为背景图,结构跨域,排查到最后,竟然是因为图片大于1m,大于1m查看需要登录
2.关于json的使用
json是用来传递对象的,axios默认会把data里面的数据转化成json数据,params里的是url地址栏的参数,
如果传递的是对象,可以使用json,如果是参数,要用params,通过地址栏传递,如果非要用过json,请在后台用一个对象接受,然后再把数据取出来
3. 关于@RequestParam和@RequestBody接受的参数的问题
参考文章:@RequestBody和@RequestParam区别
@RequestParam
( application/x-www-form-urlencoded
)(get
)
@RequestParam接收的参数是来自HTTP请求体或请求url的QueryString中。
RequestParam可以接受简单类型的属性,也可以接受对象类型。
@RequestParam有三个配置参数:
required
表示是否必须要传递此参数,默认为true
,必须。defaultValue
可设置请求参数的默认值。value
为接收url的参数名(相当于key值)。@RequestParam用来处理
Content-Type
为application/x-www-form-urlencoded
编码的内容,Content-Type
默认为该属性。@RequestParam也可用于其它类型的请求,例如:POST、DELETE等请求
参数必须是对象或包装类(或者赋初值)
控制器的参数一定要用
对象类型
或简单类型的包装类
。例如@RequestParam(value="lid") Integer id)不能写成@RequestParam(value="lid") int id),不能用简单int类型去接收请求中的整数。因为,若请求中的对象为空,则int类型的参数不能接收空对象,int类型的参数必须要有一个默认值的。若想用简单类型去接收请求中的值,需要赋值一个默认值,写成如下的形式:@RequestParam(value = "lid", required = false, defaultValue = "0") int id)
如果接收的是json数据,需要接收后转换
@PostMapping("/ali-receive")
public void aliReceive(@RequestParam("message") String message) {
ReceiveLog receiveLog = JSON.parseObject(message, ReceiveLog.class);
}
建议使用@RequestBody
接收json
数据
@RequestBody
(application/json
、application/xml
)(post
)
注解@RequestBody接收的参数是来自requestBody中,即请求体。一般用于处理非
Content-Type: application/x-www-form-urlencoded
编码格式的数据,比如:application/json
、application/xml
等类型的数据。就
application/json
类型的数据而言,使用注解@RequestBody可以将body里面所有的json数据传到后端,后端再进行解析。GET请求中,因为没有HttpEntity,所以@RequestBody并不适用。
POST请求中,通过HttpEntity传递的参数,必须要在请求头中声明数据的类型Content-Type,SpringMVC通过使用HandlerAdapter 配置的HttpMessageConverters来解析HttpEntity中的数据,然后绑定到相应的bean上。
总结:
在GET请求中,不能使用@RequestBody。
在POST请求,可以使用@RequestBody和@RequestParam,但是如果使用@RequestBody,对于参数转化的配置必须统一。
可以使用多个@RequestParam获取数据,@RequestBody不可以
@PathVariable
参考:@RequestParam和@PathVariable使用
使用@PathVariable接收参数,参数值需要在url进行占位(
restful风格
)对于mapping
@RequestMapping("/edit/{id}/{name}")
如果要取
id
@PathVariable("id")Integer id
4.axios发送请求时params和data的区别
params
是添加到url的请求字符串中的,用于get
请求。
data
是添加到请求体(body)中的, 用于post
请求。
get请求
:表单参数以name=value&name1=value1的形式附到url的后面;
post请求
:表单参数是在请求体中,也是name=value&name1=value1的形式在请求体中。
POST表单请求提交时,使用的Content-Type是application/x-www-form-urlencoded
而使用原生AJAX的POST请求如果不指定请求头RequestHeader,默认使用的Content-Type是text/plain;charset=UTF-8。在请求头中出现 request payload导致参数的方式改变了 ,那么解决办法就是:
headers: {'Content-Type':'application/x-www-form-urlencoded'}
或者使用ajax设置:
$.ajaxSetup({contentType: 'application/x-www-form-urlencoded'});
在html中form
的Content-type默认值:Content-type:application/x-www-form-urlencoded
5.http请求的过程
参考文章:HTTP请求的完全过程