在springboot 1.5.21中自定义的Web Filter 怎么才能在shiro的Filter之后执行
本问题来自阿里云开发者社区的【11大垂直技术领域开发者社群】。https://developer.aliyun.com/article/706511 点击链接欢迎加入感兴趣的技术领域群。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在Spring Boot 1.5.21中,若要确保自定义的Web Filter在Shiro的Filter之后执行,可以通过调整过滤器链的顺序来实现。Shiro的过滤器是通过其内部的FilterChainResolver来管理的,而Spring Boot应用中的过滤器则是通过@Order
注解或者在配置类中指定FilterRegistrationBean
的order属性来控制执行顺序的。
以下是两种方法来确保你的自定义过滤器在Shiro过滤器之后执行:
@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
是为了确保自定义过滤器有比大多数其他过滤器更低的优先级,但具体数值可以根据实际情况调整。
如果你不是直接在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配置,确保它们按照预期排序。