已经配置了 WebConfig 之后,还是出现跨域
java
package com.imis.datamanagement.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
//跨域配置:不可设置为*,不安全, 前后端分离项目,可能域名不一致(前端是8080,后端是8888)
//注意我们用了nginx之后就不需要写端口号了:配置跨域,如果有多个域名就写多个
registry.addMapping("/**").allowedOrigins("localhost:8080");
}
}
No 'Access-Control-Allow-Origin' header is present on the requested resource.
或者:Request header field content-type is not allowed by Access-Control-Allow-Headers in preflight response.
在后端进行处理
- 编写过滤器类:
java
/*
* @Time : 2022/10/26 18:47
* @Author : hao
* @File : RequestFilter.java
* @Software : IntelliJ IDEA
*/
package com.imis.datamanagement.handler;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebFilter(filterName = "requestFilter",urlPatterns = {"/*"})
public class RequestFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpServletRequest request = (HttpServletRequest)servletRequest;
String origin = request.getHeader("Origin");
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
// response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Authorization"); //这个不全面!
response.setHeader("Access-Control-Allow-Headers", "content-type, xfilecategory, xfilename, xfilesize, Authorization"); //这个全面!
response.setHeader("Access-Control-Allow-Credentials", "true");
String method = request.getMethod();
if(method.equalsIgnoreCase("OPTIONS")){
servletResponse.getOutputStream().write("Success".getBytes("utf-8"));
}else{
filterChain.doFilter(servletRequest, servletResponse);
}
}
@Override
public void destroy() {
}
}
2.在项目启动类上加注解:
java
import org.springframework.boot.web.servlet.ServletComponentScan;
@ServletComponentScan
如果还不行,在前端进行处理:
方式一:没有统一接口的写法
js
axios.post(
"url",
{
data,
},
{
headers: { "Content-Type": "application/json;charset=UTF-8" }, //加上这个,application/json;charset=UTF-8为json格式,application/x-www-form-urlencoded为form表单格式
}
);
方式二:统一接口的写法
在 request 的 index.js 文件中:
js
const service = axios.create({
// baseURL: "/static/json",
baseURL: "localhost:8888",
headers: { "Content-Type": "application/json;charset=UTF-8" },
transformRequest: [
//这个好像是可有可无的!
function (data) {
// Do whatever you want to transform the data
let ret = "";
for (let it in data) {
ret +=
encodeURIComponent(it) + "=" + encodeURIComponent(data[it]) + "&";
}
return ret;
},
],
});
//或者也可以在这里设置
service.interceptors.request.use(
(config) => {
config.headers["Content-Type"] = "application/json;charset=utf-8"; //这里
if (store.state.token) {
config.headers["Authorization"] = getToken();
}
return config;
},
(error) => {
Promise.reject(error);
}
);