未调用Spring Security过滤器

Har*_*ana 5 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");         
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

 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");
        }
}
Run Code Online (Sandbox Code Playgroud)

Mal*_*ana 4

你的配置是正确的。但您需要将您的请求从M. DeinumFilter A提到Filter B的传递到。仅打印是行不通的。在你的代码中它应该是这样的,在.arg2.doFilter()Filter A

文档中可以看出,

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

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