Skip to content

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();
    }

}