Spring boot处理跨域问题
Spring boot处理跨域问题
- 方案一
- 方案二
- 推荐解决方案
- 注意
方案一
实现WebMvcConfigurer的addCorsMappings方法
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "HEAD", "POST","PUT", "DELETE", "OPTIONS")
.allowCredentials(true).maxAge(3600);
}
}
方案二
通过滤器进行全局设置
@Component
public class CorsFilter implements Filter {
static final String OPTIONS = "OPTIONS";
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
// 允许指定域访问跨域资源
response.setHeader("Access-Control-Allow-Origin", "*");
// 允许所有请求方式
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT, HEAD");
// 有效时间
response.setHeader("Access-Control-Max-Age", "3600");
// 允许的header参数
response.setHeader("Access-Control-Allow-Headers", "x-requested-with,satoken");
// 如果是预检请求,直接返回
if (OPTIONS.equals(request.getMethod())) {
response.getWriter().print("");
return;
}
chain.doFilter(req, res);
}
@Override
public void init(FilterConfig filterConfig) {
}
@Override
public void destroy() {
}
}
推荐解决方案
后端项目中配置耦合度较高,建议在nginx中配置。可以在nginx配置文件中加入以下配置:
location / {
# 配置跨域响应头
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE, PUT, HEAD';
# 其他配置...
}
注意
Access-Control-Allow-Origin 这个参数的值尽量不要设置成‘*’,会带来安全漏洞。攻击者可以从恶意网站跨域读取受害网站的敏感信息,所以我们需要把值设置为具体的受信任的域。
假设后端接口所在域为 http://blog.zhangsan.com,那么我们就可以把Access-Control-Allow-Origin的值设置为http://blog.zhangsan.com。