后台代码:
/**
* 跨域请求拦截器
*/
@Log4j2
@Configuration
public class CrossInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
String origin = request.getHeader(HttpHeaders.ORIGIN);
if (origin != null) {
response.setHeader("Access-Control-Allow-Origin", "*");
// response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT, HEAD");
response.setHeader("Access-Control-Allow-Headers", "Content-Type, Token");
response.setHeader("Access-Control-Max-Age", "3600");
}
return true;
}
}
OPTIONS请求(预检请求)直接返回false,以便真正的请求能够访问
/**
* 跨域请求,时不时的发送一次options请求,单独响应
*/
public class OptionsInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if(request.getMethod().equals("OPTIONS")){
response.setStatus(HttpServletResponse.SC_OK);
return false;
}
return true;
}
}
注册拦截器
@Log4j2
@Configuration
public class AdminConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册TestInterceptor拦截器
registry.addInterceptor(new CrossInterceptor()).addPathPatterns("/**");
log.debug("CrossInterceptor拦截器注册成功!");
registry.addInterceptor(new OptionsInterceptor()).addPathPatterns("/**");
log.debug("Options请求拦截器注册成功!");
}
}
至此,跨域问题解决!