当前位置: 首页 > 知识库问答 >
问题:

Spring靴中的过滤器顺序

宦高岑
2023-03-14

如何在Spring启动中指定过滤器的顺序?我需要在Spring Security过滤器之后插入我的MDC过滤器。我几乎尝试了一切,但我的过滤器总是第一位的。这不起作用:

@Bean
@Order(Ordered.LOWEST_PRECEDENCE)
public UserInsertingMdcFilter userInsertingMdcFilter() {
    return new UserInsertingMdcFilter();
}

这也不管用:

@Bean
public FilterRegistrationBean userInsertingMdcFilterRegistrationBean() {
    FilterRegistrationBean registrationBean = new FilterRegistrationBean();
    UserInsertingMdcFilter userFilter = new UserInsertingMdcFilter();
    registrationBean.setFilter(userFilter);
    registrationBean.setOrder(Integer.MAX_VALUE);
    return registrationBean;
}

共有3个答案

彭海阳
2023-03-14

这里有一个与Spring Boot 2/Spring Security 5兼容的答案,它允许您将过滤器插入过滤器链中的任意位置。

我的用例是一个定制的日志javax。servlet。我想在任何Spring Security过滤器之前执行的过滤器;但是,以下步骤应允许您将过滤器放置在现有Spring过滤器链中的任何位置:

将您最喜欢的远程调试器连接到您的应用程序,并在FilterChainProxydoFilter(Servlet请求,Servlet响应)方法中设置断点org.springframework.security.web.FilterChainProxy。截至Spring Security 5.1.6,即第311行。在调试器中,通过检查this.additionalFilters找出现有的过滤器。在我的申请中,顺序是这样的:

0: WebAsyncManagerIntegrationFilter
1: SecurityContextPersistenceFilter
2: HeaderWriterFilter
...

您可能已经有了一个带有@Override-configure(HttpSecurity-http)方法的websecurity配置适配器HttpSecurity公开addFilterBeforeaddFilterAfter方法,允许您相对于链中的现有类放置筛选器。您的筛选器(实例)是这些方法的第一个参数,您希望在其之前或之后插入的筛选器类是第二个参数。

在我的例子中,我希望我的自定义日志过滤器是链中的第一个(我的代码片段是Kotlin,我将把Java实现留给您):

override fun configure(http: HttpSecurity) {
    http
        .addFilterBefore(MyCustomLoggingFilter(), WebAsyncManagerIntegrationFilter::class.java)
        .authorizeRequests()
        .antMatchers(
        ...
        )
}

使用上面步骤1中描述的调试方法验证您的过滤器是否在过滤器链中的预期位置。

希望这能帮助到其他人。

左恺
2023-03-14

这在Spring Boot 1.2中已修复。安全链现在默认为订单0

它也可以通过属性设置:

security.filter-order=0 # Security filter chain order.

https://github.com/spring-projects/spring-boot/issues/1640

钱元徽
2023-03-14

Spring的人又帮忙了。看https://github.com/spring-projects/spring-boot/issues/1640https://jira.spring.io/browse/SEC-2730

SpringSecurity不会对它创建的过滤器bean设置顺序。这意味着,当Boot为其创建FilterRegistrationBean时,它将获得最低优先级的默认顺序。

如果您希望自己的过滤器符合Spring Security的要求,您可以为Spring Security的过滤器创建自己的注册并指定顺序。

所以我问题的答案是:

@Bean
public FilterRegistrationBean securityFilterChain(@Qualifier(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME) Filter securityFilter) {
    FilterRegistrationBean registration = new FilterRegistrationBean(securityFilter);
    registration.setOrder(Integer.MAX_VALUE - 1);
    registration.setName(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME);
    return registration;
}

@Bean
public FilterRegistrationBean userInsertingMdcFilterRegistrationBean() {
    FilterRegistrationBean registrationBean = new FilterRegistrationBean();
    UserInsertingMdcFilter userFilter = new UserInsertingMdcFilter();
    registrationBean.setFilter(userFilter);
    registrationBean.setOrder(Integer.MAX_VALUE);
    return registrationBean;
}
 类似资料:
  • 我正在使用keycloak来保护我的rest服务。我引用的是这里给出的教程。我创建了其余部分和前端。现在,当我在后端添加keycloak时,当我的前端调用api时,我会得到CORS错误。 我调用的示例REST API 前端keycloak.json属性包括 我得到的CORS错误

  • 我正在我的web应用程序中使用spring cloud sleuth。不幸的是,我接到呼叫的第三方正在X-B3-TraceId标头中发送UUID。但是,spring中的TraceFilter在从字符串转换为十六进制时可能会检测出错误,因为UUID中有“-”字符。因此,我决定编写自己的过滤器,它将在TraceFilter之前拦截请求,并从标头中删除跟踪id。这是我的配置: 这是spring clou

  • 我在我的网络应用程序中偶然发现了一个错误,在我发现发生了什么之前,这个错误让我抓耳挠腮(最终扯了扯头发)。 基本上,我在我的网站上定义了两个过滤器。xml和两个类似的映射: 它们都是Spring MVC过滤器。我的问题是,我得到的表单数据没有被解释为UTF-8,尽管事实上编码过滤器应该在其他任何东西有机会从中读取之前将请求编码设置为UTF-8。 我最后注意到,表单方法过滤器在编码过滤器之前执行,尽

  • 不论是客户端,还是服务器,都可以添加多个过滤器。假设我们按照添加的顺序把它们叫做 filter1, filter2, … filterN。那幺它们的执行顺序是这样的。 在客户端的执行顺序 +------------------- OutputFilter -------------------+ | +-------+ +-------+ +-------

  • 我正在Spring Boot编写一个web应用程序,它有一个必须在Spring的安全过滤器之后执行的过滤器。 我已经通过java config配置了过滤器链,并将自定义过滤器的顺序设置为高于spring security的值。在Tomcat上运行应用程序时,这可以按预期工作;然而,这在WebLogic 12c中不起作用。WebLogic以与Tomcat相反的方式执行过滤器链(反之亦然)。 以前有没

  • 我有一个spring boot应用程序,需要从RequestParam中筛选响应体 例子: 客户端查询示例: 返回不带字段过滤器的所有人员 http://localhost:8080/person 返回所有的人和响应只包含firstName和lastName:http://localhost:8080/person?filters=firstName, lastName 我已经找到了这个API"j