【问题标题】:Spring Security filter not invoked未调用 Spring Security 过滤器
【发布时间】: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


【解决方案1】:

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

来自docs 它说,

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 2019-04-13
    • 2018-12-13
    • 1970-01-01
    • 2012-09-28
    • 2016-06-24
    相关资源
    最近更新 更多