问题:
    
    
    前后端分离,后端使用的Spring boot+Spring security
    
    调试过程中前端需要跨域访问后端的接口获取数据,尝试了网上提供的N种跨域方案都是返回302
    
    调试发现,登录拦截器这边获取不到用户的登录信息,所以一直重定向到登录页面
   
    
     解决过程:
    
    
    参考资料:
    
    
     https://www.cnblogs.com/yuarvin/p/10923280.html
    
    
    
     https://www.jianshu.com/p/5c637bfcc674
    
   
    应该是预检OPTIOINS请求没有携带登录信息,所以一直被重定向
    
    尝试这样处理了一下,如果是OPTIONS请求则直接返回204,结束该请求,问题得到解决
   
下面贴一下我在项目中的配置:
@Component
public class CorsInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // 此处配置的是允许任意域名跨域请求,可根据需求指定
        response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS");
        response.setHeader("Access-Control-Max-Age", "3600");
        //这个我是根据项目来定的
        response.setHeader("Access-Control-Allow-Headers", "Content-Type, Range, X-E4M-With, X-Request-With");
        // 如果是OPTIONS则结束请求
        if (HttpMethod.OPTIONS.toString().equals(request.getMethod())) {
            response.setStatus(HttpStatus.NO_CONTENT.value());
            return false;
        }
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }
}
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
	...........................
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    	// 跨域拦截器
        registry.addInterceptor(corsInterceptor)
                .addPathPatterns("/**");
         // 登录拦截器
        registry.addInterceptor(userExpiredInterceptor)
                .addPathPatterns("/**").excludePathPatterns("/webservice/**", "/", "/error", "/getImage");
        
        super.addInterceptors(registry);
    }
    
    ............................
   
}
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        ...............................................
        //开启跨域 cors()
        http.cors().and().csrf().disable().authorizeRequests()
                //处理跨域请求中的Preflight请求
                .requestMatchers(CorsUtils::isPreFlightRequest).permitAll();
		..............................................
    }
如有错误,请指正,谢谢!
 
版权声明:本文为weixin_37290284原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
