java - 将 @Autowired 与在 Spring Boot 中配置的过滤器一起使用

标签 java spring spring-boot

我需要在过滤器中使用 Autowiring 。所以我使用@Component 注释我的过滤器类,

import org.springframework.web.filter.GenericFilterBean;
@Component
public class TokenAuthorizationFilter extends GenericFilterBean {
    @Autowired
    public EnrollCashRepository enrollCashRepository;
}

然后我在 SecurityConfig 中添加我的过滤器,

   @Configuration
    @EnableWebMvcSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {

        @Override
        public void configure(WebSecurity webSecurity) throws Exception
        {
            webSecurity.ignoring().antMatchers(HttpMethod.GET, "/health");
        }
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.addFilterBefore(new TokenAuthorizationFilter(), BasicAuthenticationFilter.class);  
            http.authorizeRequests().antMatchers("/api/**").authenticated();    
    }

我的问题是我的过滤器被 @Component 注释调用了两次。如果我删除 @Component 注释,它只会调用一次。

然后我在我的 Spring boot 主类中添加以下内容作为修复。然后我在 SecurityConfig 中注释掉 addFilterBefore 这行。

 @Bean
    public FilterRegistrationBean tokenAuthFilterRegistration() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new PITokenAuthorizationFilter());
        filterRegistrationBean.setOrder(1);
        filterRegistrationBean.setEnabled(false);
        return filterRegistrationBean;
    }

但是我的过滤器被调用了一次。但即使我将 setEnabled 设置为真或假,当我调用我的休息 api 时,我也会收到 403 禁止错误,http://localhost:8080/api/myservice

如何解决我可以在 Spring Filter 中使用 @Autowired 的情况?

编辑:添加 Controller 和过滤器类,

@RestController
@RequestMapping(value = "/api")
public class SpringToolController { 
    @RequestMapping(value = "/myservice", method = RequestMethod.GET)
    public HttpEntity<String> myService() {
        System.out.println("-----------myService invoke-----------");
        return new ResponseEntity<String>(HttpStatus.OK);
    }
}



public class TokenAuthorizationFilter extends GenericFilterBean {
    public TokenAuthorizationFilter(EnrollCashRepository enrollCashRepository) {
        this.enrollCashRepository = enrollCashRepository;
    }

    public EnrollCashRepository enrollCashRepository;

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("before PITokenAuthorizationFilter");
        chain.doFilter(servletRequest, servletResponse);
        System.out.println("after PITokenAuthorizationFilter");
    }

    public EnrollCashRepository getEnrollCashRepository() {
        return enrollCashRepository;
    }

    public void setEnrollCashRepository(EnrollCashRepository enrollCashRepository) {
        this.enrollCashRepository = enrollCashRepository;
    }

}

最佳答案

删除您的 FilterRegistrationBean 并在您的 SecurityConfig 中初始化 TokenAuthorizationFilter,如下所示:

@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public EnrollCashRepository enrollCashRepository;

    @Override
    public void configure(WebSecurity webSecurity) throws Exception
    {
        webSecurity.ignoring().antMatchers(HttpMethod.GET, "/health");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception 
    {
        http.addFilterBefore(tokenAuthorizationFilter(), BasicAuthenticationFilter.class);  
        http.authorizeRequests().antMatchers("/api/**").authenticated();    
    }

    private TokenAuthorizationFilter tokenAuthorizationFilter() 
    {
        return new TokenAuthorizationFilter(enrollCashRepository);
    }
}

删除 @Autowired@Component 注释并使用构造函数注入(inject)设置您的 EnrollCashRepository:

import org.springframework.web.filter.GenericFilterBean;

public class TokenAuthorizationFilter extends GenericFilterBean {

    private final EnrollCashRepository enrollCashRepository;

    public TokenAuthorizationFilter(EnrollCashRepository enrollCashRepository) 
    {
        this.enrollCashRepository = enrollCashRepository
    }
}

关于java - 将 @Autowired 与在 Spring Boot 中配置的过滤器一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33537388/

相关文章:

spring - 如何在 Spring Boot 中从 http 重定向到 https?

java - 从具有复杂结构的表中选择数据的sql查询

Java 创建自定义 map

java - 返回大幂 (mod 2^32)

java - 设备未连接异常

java - 如何让Spring Cloud Consul注册外网IP?

java - Spring DI 声明和实例化 Arraylist 的方式?

java - 如何从 Spring Security 中的 session 管理(超时/并发检查)中排除某些页面?

java - Spring Boot 中的 CrudRespository 方法在哪里实现?

java - 如何强制 SpringBoot 使用多个配置类中的一个且仅一个?