SpringBoot的跨域问题的解决思路。
1.
这个很古老了,但是spring5之后基本不会再有这个问题,因为spring5最低支持jdk8.0,jdk8.0之后就不会有这个问题了。对于比较老的项目可以用这个办法。
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
.allowCredentials(true)
.maxAge(3600)
.allowedHeaders("*");
}
}
2.
这种办法,是基于过滤器的方式,方式简单明了,就是在response中写入这些响应头,好多文章都是第一种和第二种方式都叫你配置,其实这是没有必要的,只需要一种即可。
@WebFilter(filterName = "CorsFilter ")
@Configuration
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin","*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, PATCH, DELETE, PUT");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
chain.doFilter(req, res);
}
}
3
这个是最小粒度的cors控制办法了,精确到单个请求级别。
public class GoodsController {
@CrossOrigin(origins = "http://localhost:4000")
@GetMapping("goods-url")
public Response queryGoodsWithGoodsUrl(@RequestParam String goodsUrl) throws Exception {}
}
4
预检请求,这里主要是JWT的时候会出现,预检请求会被JWT的拦截器拦截,从而导致跨域问题。
5
tomcat配置的问题,也会出现跨域问题,比如tomcat的上下文配置出现问题的时候(少打一个字母)。
6
总结思路,被调用方,需要允许跨域,即支持跨域。调用方修改,隐藏跨域。就是通过一个代理,假装一个自己是一个不跨域的域名去访问。