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

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

@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**");
}
}

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

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

后端错误:

java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:468) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:260) ~[tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860) [tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1591) [tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.29.jar:9.0.29]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_191]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_191]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.29.jar:9.0.29]
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、加注解----对我没用。。。
@CrossOrigin        //跨域
public class BookController {
}
2、设置响应头----还是不行。。。
@PostMapping(path = "/add")
public JsonResult<Object> addBook(Book book, HttpServletResponse response) {
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Cache-Control", "no-cache");
}
3、不要参数,试一下,竟然好了。。。。看来出现这个问题的原因是参数的原因

前端请求:

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

后端接口:

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

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

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

那就继续试,这是我原来要传的参数:
 book: {
name: '',
author: '',
type: '',
publishHouse: '',
price: 0,
description: '',
number: 0,
sales: 0,
status: true,
image: ''
},
我又重新写了一个jsonData,作为参数来代替上面的book
bookTest: {},

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

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

后端代码:

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

下图的image有问题


2020.3.7更新:

问题已经找出,就出在了image字符串上,因为image这个字符串有特殊字符,必须先转码,传输到后端,再解码
前端:转码,对有特殊字符的字符串进行转码
 this.book.image= encodeURI(JSON.stringify(imageArray))
//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

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

解码前:后端接收到的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. JavaIO——File类

    1.File文件类 File类(描述具体文件或文件夹的类):是唯一一个与文件本身操作有关的程序类,可完成文件的创建.删除.取得文件信息等操作.但不能对文件的内容进行修改. (1)File类的基本使用 ...

  2. Android 基础UI组件(二)

    1.Spinner 提供一个快速的方法来从一组值中选择一个值.在默认状态Spinner显示当前选择的值.触摸Spinner与所有其他可用值显示一个下拉菜单,可以选择一个新的值. /** * 写死内容: ...

  3. Output of C++ Program | Set 10

    Predict the output of following C++ programs. Question 1 1 #include<iostream> 2 #include<st ...

  4. Oracle trunc和round的区别

    1.关于trunc 和round函数比较 整体概括: round函数 四舍五入trunc函数 直接截取 对于时间: Round函数对日期进行"四舍五入",Trunc函数对日期进行截 ...

  5. 【Java 8】函数式接口(二)—— 四大函数接口介绍

    前言 Java8中函数接口有很多,大概有几十个吧,具体究竟是多少我也数不清,所以一开始看的时候感觉一脸懵逼,不过其实根本没那么复杂,毕竟不应该也没必要把一个东西设计的很复杂. 几个单词 在学习了解之前 ...

  6. Linux目录结构和基础命令

    Linux目录和基础命令 目录 Linux目录和基础命令 1 Linux目录结构 1.1 Linux文件名命令要求 1.2 文件的类型 2. 基础命令 2.1 ls 2.2 cd和pwd 2.3 命令 ...

  7. 云原生时代之Kubernetes容器编排初步探索及部署、使用实战-v1.22

    概述 **本人博客网站 **IT小神 www.itxiaoshen.com Kubernetes官网地址 https://kubernetes.io Kubernetes GitHub源码地址 htt ...

  8. 接下来一段时间会对大家进行网络通信的魔鬼训练-理解socket

    引子 下一篇标题是<深入理解MQ生产端的底层通信过程>,建议文章读完之前.或者读完之后,再读一遍我之前写的<RabbitMQ设计原理解析>,结合理解一下. 我大学时流行过一个韩 ...

  9. [PROC FREQ] 单组率置信区间的计算

    本文链接:https://www.cnblogs.com/snoopy1866/p/15674999.html 利用PROC FREQ过程中的binomial语句可以很方便地计算单组率置信区间,SAS ...

  10. 『学了就忘』Linux服务管理 — 77、RPM包安装基于xinetd的服务的管理

    目录 1.基于xinetd服务的启动管理 (1)telnet服务安装 (2)telnet服务启动 2.基于xientd服务的自启动管理 现在Linux系统中基于xinetd的服务越来越少了,但Linu ...