开发者社区 问答 正文

自定义的Web Filter 怎么才能在shiro的Filter之后执行?

在springboot 1.5.21中自定义的Web Filter 怎么才能在shiro的Filter之后执行

本问题来自阿里云开发者社区的【11大垂直技术领域开发者社群】。https://developer.aliyun.com/article/706511 点击链接欢迎加入感兴趣的技术领域群。

展开
收起
初商 2019-09-19 19:08:55 1211 分享 版权
阿里云 AI 助理回答

在Spring Boot 1.5.21中,若要确保自定义的Web Filter在Shiro的Filter之后执行,可以通过调整过滤器链的顺序来实现。Shiro的过滤器是通过其内部的FilterChainResolver来管理的,而Spring Boot应用中的过滤器则是通过@Order注解或者在配置类中指定FilterRegistrationBean的order属性来控制执行顺序的。

以下是两种方法来确保你的自定义过滤器在Shiro过滤器之后执行:

方法1:使用@Order注解

如果你的自定义过滤器是一个Spring Bean,可以在类级别使用Spring的@Order注解来指定执行顺序。Shiro的默认过滤器链通常具有较高的优先级(较低的order值),因此你需要给你的过滤器设置一个更高的order值。

import org.springframework.core.annotation.Order;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@Order( Ordered.LOWEST_PRECEDENCE - 5 ) // 设置一个相对较低的优先级,确保在Shiro过滤器之后执行
public class CustomFilter implements Filter {
    //... 过滤器逻辑
}

这里的Ordered.LOWEST_PRECEDENCE - 5是为了确保自定义过滤器有比大多数其他过滤器更低的优先级,但具体数值可以根据实际情况调整。

方法2:通过FilterRegistrationBean配置

如果你不是直接在Spring中定义过滤器为Bean,或者希望更细粒度地控制过滤器注册,可以使用FilterRegistrationBean来配置你的自定义过滤器,并指定其执行顺序。

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class WebConfig {

    @Bean
    public FilterRegistrationBean<CustomFilter> customFilterRegistration() {
        FilterRegistrationBean<CustomFilter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new CustomFilter());
        registration.addUrlPatterns("/*"); // 指定过滤器适用的URL模式
        registration.setOrder(Ordered.LOWEST_PRECEDENCE - 5); // 设置执行顺序
        return registration;
    }
}

这里同样使用了较低的order值来确保自定义过滤器在Shiro过滤器之后执行。

请注意,实际操作时可能需要根据你的Shiro配置和项目具体情况调整order值,以确保正确的执行顺序。如果Shiro的配置也通过Spring管理,你可能还需要检查Shiro过滤器的order配置,确保它们按照预期排序。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答