Spring boot處理跨域問題
- 方案一
- 方案二
- 推薦解決方案
- 注意
方案一
實現WebMvcConfigurer的addCorsMappings方法
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {@Overridepublic 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";@Overridepublic 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);}@Overridepublic void init(FilterConfig filterConfig) {}@Overridepublic 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。