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

启动Spring应用时JwtRequestFilter代理失败问题求助

问题描述

启动应用时反复出现以下错误:

Unable to proxy interface-implementing method [public final void org.springframework.web.filter.OncePerRequestFilter.doFilter(jakarta.servlet.ServletRequest,jakarta.servlet.ServletResponse,jakarta.servlet.FilterChain) throws jakarta.servlet.ServletException,java.io.IOException] because it is marked as final, consider using interface-based JDK proxies instead.
Unable to proxy interface-implementing method [public final void org.springframework.web.filter.GenericFilterBean.init(jakarta.servlet.FilterConfig) throws jakarta.servlet.ServletException] because it is marked as final, consider using interface-based JDK proxies instead.

相关代码如下:

@Component
public class JwtRequestFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
        // 方法实现逻辑
    }
}
@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Autowired
    private JwtRequestFilter jwtRequestFilter;

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        // 安全配置逻辑
        return http.build();
    }
}

已尝试创建构造函数、移除@Autowired和@Component注解,问题仍存在;移除jwtRequestFilter后应用可正常启动。


解决方案

这个问题的核心是:Spring默认使用的CGLIB代理无法代理final方法,而JwtRequestFilter继承的OncePerRequestFilter类中包含final修饰的doFilter和init方法,导致代理生成失败。

有两种可行的解决方式:

  • 方式一:强制使用JDK动态代理
    通过配置让Spring切换为基于接口的JDK代理(OncePerRequestFilter实现了Filter接口,符合JDK代理要求)。可以通过配置文件添加:

    spring.aop.proxy-target-class=false
    

    或者如果项目用到AOP,在配置类上添加@EnableAspectJAutoProxy(proxyTargetClass = false)。

  • 方式二:调整Filter的注册方式
    不要将JwtRequestFilter作为Spring组件管理,而是在SecurityConfig中手动创建实例并注册,避免Spring为其生成代理:
    修改SecurityConfig代码:

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig {
    
        @Bean
        public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
            // 手动创建Filter实例并注册
            http.addFilterBefore(new JwtRequestFilter(), UsernamePasswordAuthenticationFilter.class);
            // 其他安全配置
            return http.build();
        }
    }
    

    同时移除JwtRequestFilter类上的@Component注解。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 02:52:06