彻底解决SpringBoot跨域和Swagger跨域问题
首发于个人的CSDN: https://blog.csdn.net/weixin_43438052/article/details/114006079
CROS跨域原理
跨域资源共享(CORS) 是一种机制,它使用额外的 HTTP 头来告诉浏览器 让运行在一个 origin (domain) 上的Web应用被准许访问来自不同源服务器上的指定的资源。当一个资源从与该资源本身所在的服务器不同的域或端口请求一个资源时,资源会发起一个跨域 HTTP 请求。
跨域资源共享( CORS )机制允许 Web 应用服务器进行跨域访问控制,从而使跨域数据传输得以安全进行。现代浏览器支持在 API 容器中(例如 XMLHttpRequest 或 Fetch )使用 CORS,以降低跨域 HTTP 请求所带来的风险。
跨域配置文件 CorsConfig
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
/**
* @version 1.0
* @classname CorsConfig
* @description 解决跨域问题,重写父类提供的跨域请求处理的接口
* @date 2021/2/23 22:06
* @created by MelodyJerry
*/
@Configuration
@EnableWebMvc
//public class CorsConfig implements WebMvcConfigurer { //控制台提示No mapping for GET时,替换下行
public class CorsConfig extends WebMvcConfigurationSupport {
/*
* 这里主要为了解决跨域问题,所以重写addCorsMappings方法
*/
@Override
//public void addCorsMappings(CorsRegistry registry) { //控制台提示No mapping for GET时,替换下行
protected void addCorsMappings(CorsRegistry registry) {
//设置允许跨域的路径
registry.addMapping("/**") //所有的当前站点的请求地址,都支持跨域访问
//设置允许跨域请求的域名,二选一allowedOrigins或allowedOrigins
//.allowedOrigins("*") //注意access-control-allow-origin时,allowedOrigins不能为*
//.allowedOrigins("域名") //如果是localhost则很难配置,因为在跨域请求的时候,外部域的解析可能是localhost、127.0.0.1、主机名
.allowedOriginPatterns("*") // 所有的外部域都可跨域访问
//放行哪些原始域(请求方式)
.allowedMethods("GET","HEAD","POST","PUT","DELETE","OPTIONS")
//设置允许的请求头
.allowedHeaders("*")
//暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息)
.exposedHeaders("access-control-allow-headers",
"access-control-allow-methods",
"access-control-allow-origin",
"access-control-max-age",
"X-Frame-Options")
//是否允许证书(是否支持跨域用户凭证),不再默认开启
.allowCredentials(true)
//跨域允许时间
.maxAge(3600);
}
/*
* 跨域配置后swagger2可能不能访问,需要增加如下配置
* 原因: 不能访问的原因的swagger的内置接口被拦截器拦下来了,需要将swagger加到拦截器的排除列表中。
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("doc.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
}
可能遇到
(1).allowedMethods("*")的问题
值得注意的是
.allowedMethods("*")
和Access-Control-Allow-Origin
同时配置的话,控制台会报下面这样的错误:
大概意思是:
allowCredentials
为true
时,allowedOrigins
不能包含特殊值“*
”,因为不能在“Access Control Allow Origin
”响应头上设置该值。要允许凭据指向一组源,请显式列出它们,或者考虑改用“allowedOriginPatterns
”。像这样的话有两种解决方法,建议用第2种:
.allowedOrigins("域名")
- 建议
.allowedOriginPatterns("*")
(2)报错o.s.web.servlet.PageNotFound :No mapping for GET
控制台出现上面的提示o.s.web.servlet.PageNotFound :No mapping for GET
,解决办法很简单:
将extends WebMvcConfigurationSupport
改为implements WebMvcConfigurer
(相应的protected void addCorsMappings
要改成public void addCorsMappings
)