Spring Boot环境下自定义shiro过滤器会过滤所有的url的问题

Posted 穷少年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot环境下自定义shiro过滤器会过滤所有的url的问题相关的知识,希望对你有一定的参考价值。

Spring Boot环境下自定义shiro过滤器会过滤所有的url的问题

在配置shiro过滤器时增加了自定义的过滤器,主要是用来处理未登录状态下返回一些信息

//自定义过滤器
Map<String, Filter> filtersMap = new LinkedHashMap<String, Filter>();
filtersMap.put("loginFilter", loginFilter);
shiroFilter.setFilters(filtersMap);

但是发现添加该过滤以后所有的url都会经过loginFilter,调试代码发现除了在shiroFilter中添加了loginFilter外,还会被Spring Boot注册到容器的filter chain中,默认过滤路径为/*,所以会过滤所有的url,要解决这个问题就是要取消Spring Boot自动注册到filter chain容器中。

下面是调试查看的容器过滤器列表,自定义loginFilter已经注册到容器的过滤器中了,当然shiro中也会有
[ApplicationFilterConfig[name=characterEncodingFilter, filterClass=org.springframework.boot.web.filter.OrderedCharacterEncodingFilter], ApplicationFilterConfig[name=hiddenHttpMethodFilter, filterClass=org.springframework.boot.web.filter.OrderedHiddenHttpMethodFilter], ApplicationFilterConfig[name=httpPutFormContentFilter, filterClass=org.springframework.boot.web.filter.OrderedHttpPutFormContentFilter], ApplicationFilterConfig[name=requestContextFilter, filterClass=org.springframework.boot.web.filter.OrderedRequestContextFilter],
ApplicationFilterConfig[name=shiroFilter, filterClass=org.apache.shiro.spring.web.ShiroFilterFactoryBean$SpringShiroFilter],
ApplicationFilterConfig[name=loginFilter2, filterClass=org.shaofan.shiro.LoginFilter2],
ApplicationFilterConfig[name=Tomcat WebSocket (JSR356) Filter, filterClass=org.apache.tomcat.websocket.server.WsFilter], null, null, null]

解决方法:

通过使用FilterRegistrationBean来进行Filter的注册,同时,设置enabled为false,就可以取消对应的Filter自动注册了,其实就是先手动注册再设置禁用。

@Bean
public FilterRegistrationBean loginFilter2Registration(LoginFilter loginFilter) {
FilterRegistrationBean registration = new FilterRegistrationBean(loginFilter);
registration.setEnabled(false);
return registration;
}

下面是启动的日志,也显示该过滤器没有注册

在这里插入图片描述
Spring Boot 文档中也有说明:Spring boot(Filter)文档相关

在这里插入图片描述

参考文章:Spring Boot:取消Filter自动注册

以上是关于Spring Boot环境下自定义shiro过滤器会过滤所有的url的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring Boot 配置 Shiro

spring-boot-shiro 客户过滤器不起作用

将多个 Shiro Realms 集成到 Spring Boot 环境中 Java

spring boot 集成shiro,设置好setLoginUrl后,报404

带有 JWT 的 Spring Boot 和 Apache Shiro - 我使用正确吗?

Shiro:Spring-boot如何集成Shiro(上)