在过滤器中使用@Value注释的弹簧

2022-09-04 04:28:48

我目前正在处理一个Spring项目,我正在制作一个新的过滤器,用于检查请求中是否已发送有效的JWT。

我遇到了一个问题,我无法使用@Value注释从我的 application.yml 文件中获取值。如下所示。

@Component
@Order(2)
public class JwtConfiguration implements Filter {

    @Value("${jwt.secret}")
    private String jwtSecret;

我知道这工作正常,因为我在单元测试中有同样的东西。

我在某处读到过滤器不在应用程序上下文中,因此它无法访问配置,并且我将无法自动连接依赖项。

有谁知道从我的 application.yml 获取值到我的过滤器的好方法吗?

我也没有使用任何XML配置,并且更喜欢不使用它们的解决方案。

我使用的是 Spring Boot 版本 1.3.3。


答案 1

这可以通过实现 ServletContextInitializer 来实现。请参阅下面的示例代码。

@Configuration
public class WebConfigurer implements ServletContextInitializer {

    @Value("${jwt.secret}")
    private String jwtSecret;

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        EnumSet<DispatcherType> disps = EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.ASYNC);
        initFilter(servletContext, disps);
    }


    private void initFilter(ServletContext servletContext,
                                              EnumSet<DispatcherType> disps) {
        FilterRegistration.Dynamic myFilter =
            servletContext.addFilter("myFilter",
                new MyFilterClass(jwtSecret));

        // You can pass null as first parameter to below API calls
        myFilter.addMappingForUrlPatterns(disps, true, "/content/*");
        myFilter.addMappingForUrlPatterns(disps, true, "/app/*");
        myFilter.setAsyncSupported(true);
    }

}

编辑/更新:

我想还有另一种方法可以使用Java Config添加过滤器

您可以使用 FilterRegistrationBean 来注册筛选器。在这里,您可以使用setOrder方法设置订单。但是认为它会创建与过滤器一样多的ServletContextInitializer,因为FilterRegistrationBean是ServletContextInitializer See


答案 2

org.springframework.web.filter.DelegatingFilterProxy


推荐