记一次跨域问题引出的内容

1. 目前碰到的关于加了注解还跨域的情况

  1. 前台给后台传递的参数有问题,比如axios传给后台一个参数,而这个参数本身没有定义或者不存在,这种情况属于粗心
  2. 请求的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-Typeapplication/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/jsonapplication/xml)(post)

注解@RequestBody接收的参数是来自requestBody中,即请求体。一般用于处理非 Content-Type: application/x-www-form-urlencoded编码格式的数据,比如:application/jsonapplication/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请求的完全过程

1.1 浏览器根据域名解析IP地址

1.2 浏览器与WEB服务器建立一个TCP连接

1.3 浏览器给WEB服务器发送一个HTTP请求

1.4 服务器端响应HTTP请求,浏览器得到HTML代码

1.5 浏览器解析HTML代码,并请求HTML代码中的资源

1.6 关闭TCP连接,浏览器对页面进行渲染呈现给用户

img

img

img

img

img

posted @ 2020-11-30 21:49  xsyz  阅读(183)  评论(0编辑  收藏  举报