【发布时间】:2015-11-04 10:14:35
【问题描述】:
我有以下代码用于在 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");
}
}
【问题讨论】:
-
你能扩展一下吗?你得到什么错误信息?您已经尝试过什么来解决您的问题?
-
没有错误..它只是没有调用过滤器B。
-
当然不会,也永远不会...您的
doFilter方法会停止请求处理。您应该致电filterchain.doFilter(request,response);继续处理。您正在破坏正确的处理。 -
感谢您的指出。顺便说一句,我添加了 chain.doFilter(request, response);在 Filter 类中的每个 doFilter 方法中。但是在过滤器C之后,我的过滤器A从头开始调用,它应该在chain.doFilter(request,response)行之后打印“filter A After”? (见我的编辑问题)
-
我对此有点困惑。我认为过滤器不会回到以前的位置。也可以解释一下,Filter C 和 flow 吗?
标签: java spring spring-security spring-boot