文章目录
1.问题描述
前端向后台发送请求发现报错:
报错: Access to XMLHttpRequest at ‘http://localhost:8082/doLogin’ from origin ‘http://localhost:8080’ 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.
2.问题产生
跨域访问(CORS)
CORS是一种访问机制,英文全称是Cross-Origin Resource Sharing,即我们常说的跨域资源共享,通过在服务器端设置响应头,把发起跨域的原始域名添加到Access-Control-Allow-Origin 即可。
当它请求的一个资源是从一个与它本身提供的第一个资源的不同的域名时,一个资源会发起一个跨域HTTP请求(Cross-site HTTP
request)。
一般都是异步请求会有这个问题,比如:Ajax,XMLHttpRequest等
3.解决方案
1. 在WebMvcConfig添加(推荐使用)
@Override
public void addCorsMappings(CorsRegistry registry) {
//允许跨域访问资源定义
registry.addMapping("/**")
//(只允许本地的指定端口访问)允许所有
.allowedOrigins("http://localhost:8080")
// 允许发送凭证: 前端如果配置改属性为true之后,则必须同步配置
.allowCredentials(true)
// 允许所有方法
.allowedMethods("*")
.allowedHeaders("*");
}
2.直接采用SpringBoot的注解@CrossOrigin
1.Controller层在需要跨域的类或者方法上加上该注解即可。
其中@CrossOrigin中的2个参数:
- origins: 允许可访问的域列表
- maxAge:准备响应前的缓存持续的最大时间(以秒为单位)
@CrossOrigin(origins = "http://domain2.com", maxAge = 3600)
Controller层在需要跨域的类或者方法上加上该注解即可。
2.spring注解@CrossOrigin不起作用的原因
1、是springMVC的版本要在4.2或以上版本才支持@CrossOrigin
2、非@CrossOrigin没有解决跨域请求问题,而是不正确的请求导致无法得到预期的响应,导致浏览器端提示跨域问题。
3、在Controller注解上方添加@CrossOrigin注解后,仍然出现跨域问题,解决方案之一就是:
在@RequestMapping注解中没有指定Get、Post方式,具体指定后,问题解决。