SpringBoot使用@RequestBody 报错400 2019-10-26

前端和后端交互的时候,再三确定前端传送的数据在后面接受的对象里都有,但是报了这个错:

Access to XMLHttpRequest at 'http://localhost:8080/admin/login' from origin 'http://localhost:63342' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

大意就是请求被CORS策略阻止。

错误信息

然后看了下后端的代码,原因是获取使用@RequestBody注解出现了异常,跳转到了错误处理程序,错误处理程序返回错误,被浏览器拦截了。所以,请求是没有问题的,服务器处理出错了


查询了很多资料无过,但是最后发现注解里设置required设置为false @RequestBody(required=false) 就可以得到数据。具体原因不明,等待以后找到答案

其他:前端使用的是axios 发起请求:(一定使用data:{}格式,不要使用JSON.stringfy()方法)


请求体


2019/10/27找到了原因:

    vue 发送json ,会导致此次请求被认为是一次复杂的请求,所以会发送两次请求(为什么会发送两次请自行查询 ),第一次不带任何数据,服务端口的@RequeseBody  会默认请求的数据为空时报错。

解决办法:

1    如上: 加上required=false参数,不检查数据是否为空

2 使用拦截器,通过request.getMethod(),得到请求方法,如果是OPTIONS 就直接返回,特别注意返回时要带上响应头以允许这次跨域访问(为什么要允许跨域访问自行查询)


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 对于java中的思考的方向,1必须要看前端的页面,对于前端的页面基本的逻辑,如果能理解最好,不理解也要知道几点。 ...
    神尤鲁道夫阅读 836评论 0 0
  • > 翻译:疯狂的技术宅 ### 前言 CORS 与 cookie 在前端是个非常重要的问题,不过在大多数情况下,因...
    京程一灯阅读 731评论 0 1
  • 什么是跨域 跨域,是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript实...
    他方l阅读 1,077评论 0 2
  • 什么是跨域 跨域,是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript实...
    Yaoxue9阅读 1,325评论 0 6
  • 什么是跨域 跨域,是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript实...
    HeroXin阅读 853评论 0 4