You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何ContentCachingFilter未仅作用于/search/*,而是全部URL?

问题分析与解决方案

你遇到的问题根源是同时使用了@Component和@WebFilter注解:@Component会让Spring把该过滤器注册为全局过滤器,直接忽略@WebFilter的urlPatterns配置,导致过滤器对所有URL生效。下面提供两种可靠的解决方式:


方案一:用FilterRegistrationBean手动注册(推荐)

这种方式能精准控制过滤器的作用路径和执行顺序,避免注解冲突问题。

步骤1:修改过滤器类,移除冲突注解

去掉@Component和@WebFilter,仅保留过滤器逻辑:

public class ContentCachingFilter extends OncePerRequestFilter {

    @Override 
    protected void doFilterInternal(HttpServletRequest httpServletRequest,
                                    HttpServletResponse httpServletResponse,
                                    FilterChain filterChain) throws ServletException, IOException {
        CachedBodyHttpServletRequest cachedBodyHttpServletRequest = 
                new CachedBodyHttpServletRequest(httpServletRequest);

        filterChain.doFilter(cachedBodyHttpServletRequest, httpServletResponse);
    }
}

步骤2:添加配置类注册过滤器

创建配置类,通过FilterRegistrationBean指定路径和优先级:

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<ContentCachingFilter> contentCachingFilterRegistration() {
        FilterRegistrationBean<ContentCachingFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new ContentCachingFilter());
        // 指定仅作用于/search开头的路径
        registrationBean.addUrlPatterns("/search/*");
        // 设置为最高优先级,保证/search请求时第一个执行
        registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
        return registrationBean;
    }
}

方案二:保留@Component,内部手动判断路径

如果不想调整注册方式,可在过滤器内部添加路径判断,非/search请求直接放行:

@Component     
@Order(Ordered.HIGHEST_PRECEDENCE)
public class ContentCachingFilter extends OncePerRequestFilter {

    @Override 
    protected void doFilterInternal(HttpServletRequest httpServletRequest,
                                    HttpServletResponse httpServletResponse,
                                    FilterChain filterChain) throws ServletException, IOException {
        String requestURI = httpServletRequest.getRequestURI();
        // 仅对/search开头的请求执行缓存逻辑
        if (!requestURI.startsWith("/search")) {
            filterChain.doFilter(httpServletRequest, httpServletResponse);
            return;
        }

        CachedBodyHttpServletRequest cachedBodyHttpServletRequest = 
                new CachedBodyHttpServletRequest(httpServletRequest);

        filterChain.doFilter(cachedBodyHttpServletRequest, httpServletResponse);
    }
}

内容的提问来源于stack exchange,提问作者meg1311

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 16:13:32