Springboot CORS跨域
java
@Configuration
public class WebConfig implements WebMvcConfigurer {
/**
* 处理跨域
*/
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOriginPatterns("*")
.allowedHeaders("*")
.allowCredentials(true)
.allowedMethods("*")
.maxAge(3600);
}
}全局配置需要自定义类实现 WebMvcConfigurer 接口,然后实现其中的 addCorsMappings 方法。
在addCorsMappings方法中:
- addMapping 表示对哪种格式的陆军进行跨域处理
- allowedHeaders 表示允许的请求头
- allowedMethods 表示允许的方法
- allowedOrigins 表示支持的域
- maxAge 表示探测请求的有效期
在拦截器允许OPTION请求
java
@Configuration
public class WebConfig implements WebMvcConfigurer {
/**
* 拦截器
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(jwtInterceptor())//添加拦截器
.addPathPatterns("/**");//拦截的路径
}
//注册拦截器
@Bean
public TokenInterceptor jwtInterceptor() {
return new TokenInterceptor();
}
} TokenInterceptor.class
java
public class TokenInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) throws Exception {
// httpServletResponse.setHeader("Access-Control-Allow-Origin", httpServletRequest.getHeader("Origin"));
// httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true");
// httpServletResponse.setHeader("Access-Control-Allow-Methods", "*");
// httpServletResponse.setHeader("Access-Control-Max-Age", "86400");
// //因为要携带自定义的Authorization 所以"Access-Control-Allow-Headers"要设置Authorization
// httpServletResponse.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
//只用下面一段判断即可
// OPTIONS则直接通过
if (HttpMethod.OPTIONS.toString().equals(httpServletRequest.getMethod())) {
httpServletResponse.setStatus(HttpStatus.OK.value());
return true;
}
// 从 http 请求头中取出 token
String token = httpServletRequest.getHeader("Authorization");
// token为空返回
if(StrUtil.isBlank(token)){
throw new LoginException("请先登录系统");
}
String[] temp=token.split(" ");
token = temp[1];
//解析token
User res = JwtUtils.deToken(token);
if(ObjectUtil.isEmpty(res)){
throw new LoginException("请先登录系统!");
}
//注册全局User
AuthUser.set(res);//当前登陆人的全局变量
return true;
}
//结束删除全局User
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
AuthUser.remove();
}
}