Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在过滤器中使用@Value注释的Spring_Java_Spring_Spring Mvc - Fatal编程技术网

Java 在过滤器中使用@Value注释的Spring

Java 在过滤器中使用@Value注释的Spring,java,spring,spring-mvc,Java,Spring,Spring Mvc,我目前正在从事一个Spring项目,我正在制作一个新的过滤器,用于检查请求中是否发送了有效的JWT 我遇到了这样一个问题:我无法使用@value注释从application.yml文件中获取值 @Component @Order(2) public class JwtConfiguration implements Filter { @Value("${jwt.secret}") private String jwtSecret; 我知道这很好,因为我在单元测试中有相同的东西

我目前正在从事一个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。

org.springframework.web.filter.DelegatingFilterProxy

这可以通过实现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);
    }

}
@配置
公共类WebConfigure实现ServletContextInitializer{
@值(“${jwt.secret}”)
私有字符串jwtSecret;
@凌驾
启动时公共void(ServletContext ServletContext)引发ServletException{
EnumSet disps=EnumSet.of(DispatcherType.REQUEST、DispatcherType.FORWARD、DispatcherType.ASYNC);
initFilter(servletContext,disps);
}
私有void initFilter(ServletContext ServletContext,
枚举集disps){
FilterRegistration.DynamicMyFilter=
servletContext.addFilter(“myFilter”,
新MyFilterClass(jwtSecret));
//您可以将null作为第一个参数传递给下面的API调用
addMappingForUrlPatterns(disps,true,“/content/*”;
addMappingForUrlPatterns(disps,true,“/app/*”);
myFilter.setAsyncSupported(true);
}
}
编辑/更新:

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

您可以使用FilterRegistrationBean来注册过滤器。在这里,您可以使用setOrder方法设置顺序。但我认为它将创建尽可能多的ServletContextInitializer,因为FilterRegistrationBean是ServletContextInitializer

我将描述在Spring boot中使用DelegatingFilterProxy执行此操作的方法:

1) 将此bean添加到application.java:

@Bean
public FilterRegistrationBean securityFilterChainRegistration() {
    DelegatingFilterProxy delegatingFilterProxy = new DelegatingFilterProxy();
    delegatingFilterProxy.setTargetBeanName(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME);
    FilterRegistrationBean registrationBean = new FilterRegistrationBean(delegatingFilterProxy);
    registrationBean.setName(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME);
    registrationBean.addUrlPatterns("/*");
    return registrationBean;
}
2) 创建过滤器Bean:

@Component(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME)
public class TokenFilter extends GenericFilterBean {
@Value("${path.to.client.id}") String clientId;

@Autowired
RequestDumperFilter requestDumperFilter;

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {

    // do stuff.
}}

基本上就是这样。现在,您可以使用您最喜欢的保护资源的方法。例如,我在我的应用程序类中添加了
@EnableGlobalMethodSecurity(prespenabled=true)
注释,并使用
@PreAuthorize(“hasRole('ROLE\u USER')”)之类的内容保护资源

您的过滤器是servlet过滤器吗?如何将其添加到过滤链?是否使用Spring boot?@SangramJadhav是的,版本1.3。3@JEY我以为它们只是被一些春天的魔法自动拾取的。我们有另一个做CORS检查的,它看起来很有效。当使用spring boot时,它们是自动添加的。但我不确定是否必须使用@Bean而不是组件扫描来声明它们。请详细说明。事实上,我不知道是否要更新或标记此答案。我在这里找到了有关如何使用DelegatingFilterProxy的说明。嗨,谢谢你的回答,我使用了你的代码并对其进行了一些调整,现在我所有的测试都通过了!我有一个关于@Order注释的问题。使用此配置器仍能满足此要求吗?我的其他过滤器会受到影响吗?我认为@Order注释在这里没有用处,因为我们直接将过滤器添加到servlet上下文中。我还假设servlet上下文将遵循插入顺序。如果在web.xml中声明过滤器,就会发生这种情况。因此,如果您想要特定的顺序,请逐个添加上述代码中的所有过滤器,以获得反馈。我用它来添加我的所有过滤器,它们以正确的顺序执行。现在一切似乎都对我有利。