未调用Spring Security过滤器

时间:2015-11-04 10:14:36

标签: java spring spring-security spring-boot

我在弹簧启动应用程序中配置了过滤器的代码。当我提出请求时,我的第二个过滤器是B,不会调用。

import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.servlet.configuration.EnableWebMvcSecurity;

@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.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        http.addFilterBefore(new A(), BasicAuthenticationFilter.class);
        http.addFilterAfter(new B(), new A().getClass());
    }
}

import org.springframework.web.filter.GenericFilterBean;
public class A extends GenericFilterBean {

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
            throws IOException, ServletException {
        System.out.println("filter A");
    }
}

import org.springframework.web.filter.GenericFilterBean;
public class B extends GenericFilterBean {

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
            throws IOException, ServletException {
        System.out.println("filter B");         
    }
}

编辑:

 public class A extends GenericFilterBean {

        @Override
        public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {
             System.out.println("filter A Before");
             arg2.doFilter(arg0,arg1);
             System.out.println("filter A After");
        }
}

1 个答案:

答案 0 :(得分:4)

您的配置正确无误。但是,如M. Deinum所述,您需要将请求从Filter A传递给Filter B。只是印刷不会工作。在您的代码中,它应该是arg2.doFilter()中的Filter A

来自docs它说,

  

此方法的典型实现将遵循以下模式:

  1. 检查请求
  2. 可选择使用自定义实现将请求对象包装到 过滤内容或标题以进行输入过滤
  3. 可选择使用自定义实现将响应对象包装到 过滤内容或标题以进行输出过滤
  4. 使用FilterChain调用链中的下一个实体 object(chain.doFilter()),或者不传递请求/响应对 到筛选器链中的下一个实体来阻止请求 处理
  5. 在调用下一个响应后直接在响应上设置标头 过滤器链中的实体。