SpringBoot中配置拦截器时,跨域失效

本文介绍在SpringBoot项目中遇到的跨域问题及解决方案。通过使用CorsFilter配置跨域,解决了因拦截器导致的部分请求跨域失效的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringBoot中配置拦截器时,跨域失效

前后段分离的项目,配置了跨域后,访问正常,但是配置了拦截器以后,有的访问正常,有的出现跨域问题,发现出现跨域问题的都是拦截器里面没有放行的请求。

@Configuration
public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {
    static final String ORIGINS[] = new String[] { "GET", "POST", "PUT", "DELETE" };
//这是最初跨域的配置,但是在拦截器里面失效了。用下面的方法就会得到解决,这里就注释掉了。
    //@Override
    //public void addCorsMappings(CorsRegistry registry) {
    //registry.addMapping("/**").allowedOrigins("*").allowCredentials(true).allowedMethods(ORIGINS)
    //          .maxAge(3600).allowedHeaders("*").exposedHeaders("access-control-allow-headers",
      //          "access-control-allow-methods",
      //        "access-control-allow-origin",
      //      "access-control-max-age",
      //    "X-Frame-Options", JwtUtils.TOKEN_HEADER);
    }

//改用过滤器CorsFilter 来配置跨域,由于Filter的位置是在Interceptor之前的,问题得到解决
    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        // 设置允许跨域请求的域名
        config.addAllowedOrigin("*");
        // 是否允许证书 不再默认开启
        // config.setAllowCredentials(true);
        // 设置允许的方法
        config.addAllowedMethod("*");
        // 允许任何头
        config.addAllowedHeader("*");
        config.addExposedHeader("token");
        UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
        configSource.registerCorsConfiguration("/**", config);
        return new CorsFilter(configSource);
    }

    @Bean
    public JwtInterceptor getJwtInterceptor() {
        return new JwtInterceptor();
    }

    //配置拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        System.out.println("我是拦截器。。。。。");
        registry.addInterceptor(getJwtInterceptor()).excludePathPatterns("/login");
    }


}

最后使用了CorsFilter 来配置跨域,问题就得到了解决。

<think>好的,我现在需要解决用户在Spring Boot中注册过滤器后自定义拦截器失效的问题。首先,我得理解用户的问题场景。用户可能在项目中同配置了过滤器和拦截器,结果发现拦截器没有按预期工作。接下来,我需要回忆一下过滤器和拦截器在Spring Boot中的工作机制以及它们之间的区别。 根据引用中的信息,过滤器是基于Servlet容器的,而拦截器是Spring MVC的一部分,基于Java反射机制。拦截器配置通常通过实现WebMvcConfigurer接口,而过滤器则是通过@Bean注册或使用FilterRegistrationBean。可能的问题点在于配置类的加载顺序或扫描包的问题。 用户提到的引用[2]指出,如果WebConfig类不在主应用类的包或其子包下,组件扫描可能无法发现它,导致拦截器不生效。所以首先需要检查配置类的位置是否正确。另外,引用[5]中的代码示例显示拦截器配置类需要用@Configuration注解,并且正确注册拦截器到InterceptorRegistry中。 另一个可能的问题是过滤器与拦截器的执行顺序相互影响。例如,如果过滤器处理了请求并提前返回,可能拦截器就没有机会执行。或者配置(如CORS)在过滤器中处理,可能影响到后续拦截器的执行。例如引用[3]和[4]提到配置拦截器冲突的情况,可能需要调整配置顺序或确保处理正确。 此外,如果同存在多个配置类,比如同配置了WebMvcConfigurer和FilterRegistrationBean,需要确认这些配置是否被正确加载。例如,拦截器配置类需要实现WebMvcConfigurer,而过滤器的配置可能需要使用@Bean或FilterRegistrationBean来调整顺序。 可能的解决方案步骤包括: 1. 检查拦截器配置类是否在主应用包的扫描范围内。 2. 确保拦截器配置类正确实现了WebMvcConfigurer并注册了拦截器。 3. 确认过滤器没有中断请求处理链,比如在过滤器中是否调用了chain.doFilter()。 4. 调整过滤器和拦截器的执行顺序,可能需要使用@Order注解或FilterRegistrationBean设置顺序。 5. 检查是否存在配置冲突,确保CORS配置正确处理预检请求。 6. 排除其他组件干扰,如Swagger的路径是否被拦截器错误拦截,需要添加排除路径。 另外,用户提到引用[4]中的问题,拦截器可能拦截了Swagger的请求,导致其他功能异常。因此,在注册拦截器,需要确保排除静态资源或特定路径,如Swagger相关的URL。 最后,可能需要检查日志,确认拦截器是否被正确注册,以及请求是否经过拦截器。如果拦截器没有被触发,可能是配置类未被加载,或者路径匹配不正确。</think>在Spring Boot中同配置过滤器和拦截器出现失效问题,通常由组件扫描范围、配置顺序或请求处理中断导致。以下是分步解决方案: --- ### 一、检查组件扫描范围 1. **确认配置类位置** 拦截器配置类(实现`WebMvcConfigurer`)必须位于主启动类所在包或其子包下,否则Spring Boot无法扫描到该配置[^2]。 **修正方法**:将配置类移动到正确包路径下,或手动添加`@ComponentScan(basePackages = "com.example.config")`。 2. **检查注解完整性** 确保拦截器配置类标注了`@Configuration`,拦截器类标注了`@Component`或通过`@Bean`显式声明[^5]。 --- ### 二、验证配置正确性 1. **拦截器注册代码示例** ```java @Configuration public class InterceptorConfig implements WebMvcConfigurer { @Autowired private CustomInterceptor customInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(customInterceptor) .addPathPatterns("/api/**") .excludePathPatterns("/swagger-ui/**"); // 排除Swagger路径[^4] } } ``` 2. **过滤器注册代码示例** ```java @Bean public FilterRegistrationBean<CustomFilter> customFilter() { FilterRegistrationBean<CustomFilter> bean = new FilterRegistrationBean<>(); bean.setFilter(new CustomFilter()); bean.addUrlPatterns("/*"); bean.setOrder(1); // 设置过滤器执行顺序 return bean; } ``` --- ### 三、处理执行顺序冲突 1. **确保过滤器传递请求链** 在过滤器的`doFilter`方法中必须调用`chain.doFilter(request, response)`,否则请求不会进入后续拦截器或控制器[^1]: ```java public class CustomFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { // 前置逻辑 chain.doFilter(request, response); // 关键!传递请求 // 后置逻辑 } } ``` 2. **调整过滤器与拦截器顺序** - 过滤器默认优先于拦截器执行,可通过`FilterRegistrationBean.setOrder()`调整顺序。 - 拦截器顺序由`addInterceptor`的调用顺序决定。 --- ### 四、处理配置冲突 若项目中配置,需确保**处理在过滤器和拦截器中正确协调**: 1. **推荐使用Spring官方配置** 在拦截器配置类中添加支持,而非在过滤器中处理[^3]: ```java @Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("GET", "POST"); } } ``` 2. **Spring Security处理** 若使用Spring Security,需在安全配置中放行OPTIONS预检请求[^3]: ```java @Override protected void configure(HttpSecurity http) throws Exception { http.cors().and() .authorizeRequests() .antMatchers(HttpMethod.OPTIONS).permitAll(); } ``` --- ### 五、验证请求路径匹配 1. **检查拦截器的路径模式** 使用`addPathPatterns("/api/**")`,需确认实际请求路径是否匹配。可通过日志打印请求URI: ```java public class CustomInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { System.out.println("拦截到请求:" + request.getRequestURI()); return true; } } ``` 2. **排除静态资源路径** 若拦截器影响了Swagger、CSS/JS等资源,需添加排除规则[^4]: ```java .excludePathPatterns("/swagger-ui.html", "/webjars/**", "/v3/api-docs/**"); ``` --- ### 六、最终验证步骤 1. 启动应用后访问`http://localhost:8080/actuator/beans`,检查拦截器和过滤器是否在Bean列表中。 2. 发送测试请求,观察控制台日志确认拦截器和过滤器的执行顺序。 3. 使用Postman测试请求(如OPTIONS预检请求)是否正常响应。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值