在shiro学习中,输入了正确的用户名和密码,还是遇到了异常,几乎把所有的代码重新写了一遍,还是没有解决,最终发现是shiro的配置文件位置写错了,我的代码如下:
<!-- struts2 过滤器 --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> <!-- shiro的Filter --> <!-- 注意:shiro的配置一定要在struts2的前面 --> <filter> <!-- 去spring配置文件中寻找同名bean --> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
原因分析:
SecurityUtils在struts2加载静态资源的时候是要被加载的,如果将shiro filter的位置放在struts2 filter 的后面,则此资源是不会被加载的。至此会在SecurityUtils.GetSubject()时出现异常。
解决方法:
将shiro filter和struts2 filter配置的顺序调整,问题就解决了,正确代码如下
shiro filter在web.xml中的配置是和位置有关系的,必须写在struts2 filter配置的前面<!-- shiro的Filter --> <!-- 注意:shiro的配置一定要在struts2的前面 --> <filter> <!-- 去spring配置文件中寻找同名bean --> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- struts2 过滤器 --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping>
希望能对刚开始学习Apache Shiro 的选手有所帮助!