关键字:跨域,Access-Control-Allow-Origin,转码,解码

在做一个前后端分离项目,本来前端项目都可以正常访问后端接口,跨域是这么设置的,接口可以正常访问

  1. @Configuration
  2. public class WebConfig implements WebMvcConfigurer {
  3. @Override
  4. public void addCorsMappings(CorsRegistry registry) {
  5. registry.addMapping("/**");
  6. }
  7. }

但是在访问一个新的接口时,前端控制台错误:

Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

后端错误:

  1. java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
  2. at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:468) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
  3. at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:260) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
  4. at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.29.jar:9.0.29]
  5. at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860) [tomcat-embed-core-9.0.29.jar:9.0.29]
  6. at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1591) [tomcat-embed-core-9.0.29.jar:9.0.29]
  7. at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.29.jar:9.0.29]
  8. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_191]
  9. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_191]
  10. at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.29.jar:9.0.29]
  11. at java.lang.Thread.run(Thread.java:748) [na:1.8.0_191]

在网上找了一下解决方法,都是说跨域问题

参考:response设置响应头,解决跨域请求问题,No ‘Access-Control-Allow-Origin’ header is present on the requested resource

解决方法:

1、加注解----对我没用。。。
  1. @CrossOrigin //跨域
  2. public class BookController {
  3. }
2、设置响应头----还是不行。。。
  1. @PostMapping(path = "/add")
  2. public JsonResult<Object> addBook(Book book, HttpServletResponse response) {
  3. response.setHeader("Access-Control-Allow-Origin", "*");
  4. response.setHeader("Cache-Control", "no-cache");
  5. }
3、不要参数,试一下,竟然好了。。。。看来出现这个问题的原因是参数的原因

前端请求:

  1. this.$axios({method: 'post', url: '/book/add'}).then(res => {
  2. console.log(res.data)
  3. }).catch(res => {
  4. });

后端接口:

  1. @PostMapping(path = "/add")
  2. public JsonResult<Object> addBook() {
  3. }

又看到一篇文章说可能是参数太多:

参考:Error parsing HTTP request header Note: further occurrences of HTTP header parsing errors will ***

那就继续试,这是我原来要传的参数:
  1. book: {
  2. name: '',
  3. author: '',
  4. type: '',
  5. publishHouse: '',
  6. price: 0,
  7. description: '',
  8. number: 0,
  9. sales: 0,
  10. status: true,
  11. image: ''
  12. },
我又重新写了一个jsonData,作为参数来代替上面的book
  1. bookTest: {},

先给bookTest里面少放点参数,发起异步请求,竟然成功了。。。

  1. //给里面少放点数据
  2. this.bookTest.name = this.book.name;
  3. this.bookTest.author = this.book.author;
  4. this.bookTest.type = this.book.type;
  5. this.$axios({method: 'post', url: '/book/add', params: this.bookTest})
  6. .then(res => {
  7. console.log(res.data)
  8. }).catch(res => {
  9. });

后端代码:

  1. @RequestMapping(path = "/book")
  2. public class BookController {
  3. @PostMapping(path = "/add")
  4. public JsonResult addBook( Book newBook) {
  5. System.out.println("addBook");
  6. System.out.println(newBook);
  7. JsonResult<Object> result = new JsonResult<>();
  8. result = result.builder().data(newBook).message("添加成功").code("1").build();
  9. return result;
  10. }
  11. }
继续增加参数,除了this.bookTest.image = this.book.image;
  1. this.bookTest.name = this.book.name;
  2. this.bookTest.author = this.book.author;
  3. this.bookTest.type = this.book.type;
  4. this.bookTest.publishHouse = this.book.publishHouse;
  5. this.bookTest.price = this.book.price;
  6. this.bookTest.description = this.book.description;
  7. this.bookTest.number = this.book.number;
  8. this.bookTest.sales = this.book.sales;
  9. this.bookTest.status = this.book.status;
仍然可以接收参数,但是加上this.bookTest.image = this.book.image;就又开始报这个错误了,看来问题就是出在了这个image上。

下图的image有问题


2020.3.7更新:

问题已经找出,就出在了image字符串上,因为image这个字符串有特殊字符,必须先转码,传输到后端,再解码
前端:转码,对有特殊字符的字符串进行转码
  1. this.book.image= encodeURI(JSON.stringify(imageArray))
  2. //imageArray是一个数组,JSON.stringify()是把数组转为字符串,encodeURI()是转码的

转码前,image是这样的:

["/images/ac57249167ce4af5.jpg","/images/9d7bf84bdf40e030.jpg"]

转码后,image是这样的:

%22/images/ac57249167ce4af5.jpg%22%7D,%22/images/9d7bf84bdf40e030.jpg%22%7D%5D

后端:解码
  1. @PostMapping(path = "/a")
  2. public JsonResult add(Book book) {
  3. String imageJson= URLDecoder.decode(book.getImage(),"utf-8" );
  4. return null;
  5. }

解码前:后端接收到的book.getImage()就是前端转码后的样子:

%22/images/ac57249167ce4af5.jpg%22%7D,%22/images/9d7bf84bdf40e030.jpg%22%7D%5D

解码后:

["/images/ac57249167ce4af5.jpg","/images/9d7bf84bdf40e030.jpg"]

参考:java-encodeURI decodeURI 解决地址传参乱码问题

【SpringBoot】No 'Access-Control-Allow-Origin' header is present on the requested resource.的更多相关文章

  1. .Net Core 处理跨域问题Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource

    网页请求报错: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Or ...

  2. has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

    前端显示: has been blocked by CORS policy: Response to preflight request doesn't pass access control che ...

  3. WCF REST开启Cors 解决 No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access. The response had HTTP status code 405.

    现象: 编写了REST接口: [ServiceContract] public interface IService1 { [OperationContract] [WebInvoke(UriTemp ...

  4. Failed to load http://wantTOgo.com/get_sts_token/: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://fromHere.com' is therefore not allowed access.

    Failed to load http://wantTOgo.com/get_sts_token/: No 'Access-Control-Allow-Origin' header is presen ...

  5. java、ajax 跨域请求解决方案('Access-Control-Allow-Origin' header is present on the requested resource. Origin '请求源' is therefore not allowed access.)

      1.情景展示 ajax调取java服务器请求报错 报错信息如下: 'Access-Control-Allow-Origin' header is present on the requested ...

  6. 跨域问题解决----NO 'Access-Control-Allow-Origin' header is present on the requested resource.Origin'http://localhost:11000' is therfore not allowed access'

    NO 'Access-Control-Allow-Origin' header is present on the requested resource.Origin'http://localhost ...

  7. 【MongoDB】The Access control of mongodb

    In this blog we mainly talk about the access control including limitation of ip, setting listen port ...

  8. 【HTTP】HTTP access control (CORS)

    https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS Cross-site HTTP requests are H ...

  9. Access to XMLHttpRequest at 'http://localhost:8090/user/getotp' from origin 'null' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

    ajax跨域请求错误 解决: springboot中: 加注解 @CrossOrigin

随机推荐

  1. 转 Android中Activity的启动模式(LaunchMode)和使用场景

    转载请注明出处:http://blog.csdn.net/sinat_14849739/article/details/78072401本文出自Shawpoo的专栏我的简书:简书 一.为什么需要启动模 ...

  2. spring生成EntityManagerFactory的三种方式

    spring生成EntityManagerFactory的三种方式 1.LocalEntityManagerFactoryBean只是简单环境中使用.它使用JPA PersistenceProvide ...

  3. js实现递归菜单无限层

    /*动态加载菜单*/ function dynamicMenu(data){ if (userID != "admin"){ //1.清空所有菜单 $("#menuLis ...

  4. Linux 网卡配置文件,命令详细设置

    1.配置文件/etc/hosts(本地主机ip地址映射,可以有多个别名)./etc/services(端口号与标准服务之间的对应关系)./etc/sysconfig/network(设置主机名,网关, ...

  5. Python multiprocessing 基础使用和小trick

    最近进行数据预处理时(噪声插入),单进程严重影响实验周期,故学习了multiprocessing并发执行不同数据集的处理,加快执行效率.现于此进行一些简单记录以供日后参考. 1. 基础: From m ...

  6. opencv学习(四)——轨迹栏作为调色板

    轨迹栏作为调色板 在这里,我们将创建一个简单的应用程序,以显示指定的颜色.有一个显示颜色的窗口,以及三个用于指定B.G.R颜色的轨迹栏.滑动轨迹栏,并相应地更改窗口颜色.默认情况下,初始颜色将设置为黑 ...

  7. gitlab 备份&恢复

    Gitlab 成功运行起来之后,最终的事情就是定期的备份,遇到问题后的还原. 备份配置 默认 Gitlab 的备份文件会创建在/var/opt/gitlab/backups文件夹中,格式为时间戳_日期 ...

  8. GIS应用|快速开发在线路径导航应用

    导航应用可用于路径规划及仿真,并且常作为一个重要模块融入到各类企业管理业务中,如面向物流管理.商品配送.车辆监控等场景,那么如何开发一个简单的在线路径导航应用呢?SuperMap Online为您解答 ...

  9. 车载以太网第二弹|测试之实锤 -DoIP测试开发实践

    前言 车载以太网测试之实锤系列,之前我们已经从环境设备组成.被测对象组成再到测试过程和测试结果分析,分享了完整的PMA测试 .IOP测试 .TC8中的TCP/IP协议一致性测试 .也分享了1000BA ...

  10. 转:UITableView学习笔记

    UITableView学习笔记        作者:一片枫叶 看TableView的资料其实已经蛮久了,一直想写点儿东西,却总是因为各种原因拖延,今天晚上有时间静下心来记录一些最近学习的 TableV ...