方式一:注解方式
// 將跨域訪(fǎng)問(wèn)的接口添加此注解, 也可放在Controller上
@CrossOrigin(origins = "*", maxAge = 3600)
方式二: 全局加, 在啟動(dòng)類(lèi)中添加以下代碼(效果同方式一)
@Bean
public CorsFilter corsFilter() {
final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
final CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.setAllowCredentials(true);
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
return new CorsFilter(urlBasedCorsConfigurationSource);
}
重點(diǎn):以上兩種方法會(huì)造成 攔截器 走兩遍, 如果有在header 中取值時(shí), 第一遍取不到, 導(dǎo)致報(bào)錯(cuò)
方式三 終極版
@Order(Ordered.HIGHEST_PRECEDENCE)
@WebFilter(filterName = "crossFilter", urlPatterns = "/*")
@Component
public class CrossFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest servletRequest = (HttpServletRequest) request;
HttpServletResponse servletResponse = (HttpServletResponse) response;
servletResponse.setHeader("Access-Control-Allow-Origin", servletRequest.getHeader("Origin"));
servletResponse.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS, PUT, DELETE,PATCH");
servletResponse.setHeader("Access-Control-Allow-Headers", "DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,SessionToken,Cookie");
servletResponse.setHeader("Access-Control-Max-Age", "3600");
servletResponse.setHeader("Access-Control-Allow-Credentials", "true");
servletResponse.setHeader("Access-Control-Expose-Headers", "*");
//判斷是否為可選擇性批量操作的請(qǐng)求,設(shè)置狀態(tài)碼返回
if ("OPTIONS".equals(servletRequest.getMethod())) {
servletResponse.setStatus(HttpStatus.ACCEPTED.value());
return;
}
filterChain.doFilter(request, response);
}
@Override
public void destroy() {
}
}