2015-11-04 62 views
5

我在弹簧引导应用程序中配置了以下代码。我的第二个过滤器是B,在我提出请求时不会调用。未启用Spring安全筛选器

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"); 
     } 
} 
+0

您能否扩展一下。你会得到什么错误信息?你已经尝试过什么来解决你的问题? – kebs

+0

以及没有错误..只是不调用过滤器B. – Harshana

+1

Ofcourse不,也不会永远......您的'doFilter'方法停止请求处理。你应该调用'filterchain.doFilter(request,response);'继续处理。你正在打破正确的处理。 –

回答

4

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

docs它说,

这一方法将按照下面的图案的典型实施方案:

  1. 检查请求
  2. 任选地用一个自定义实现包裹请求对象到 用于输入过滤的过滤器内容或标头
  3. 任选地包裹有一个自定义实现的响应对象 滤波器内容或标题为输出滤波
  4. 要么调用使用FilterChain 对象链中的下一个实体(chain.doFilter()),或不能在请求传/响应对 到过滤器链中的下一个实体以阻止请求 处理
  5. 在调用过滤器链中的下一个 实体之后,在响应上直接设置标头。
相关问题