本地环境运行无异常,移植后出现异常。
1,查看异常代码
org.apache.shiro.UnavailableSecurityManagerException: No SecurityManager accessible to the calling code, either bound to the org.apache.shiro.util.ThreadContext or as a vm static singleton. This is an invalid application configuration.
at org.apache.shiro.SecurityUtils.getSecurityManager(SecurityUtils.java:123)
at org.apache.shiro.subject.Subject$Builder.<init>(Subject.java:626)
at org.apache.shiro.SecurityUtils.getSubject(SecurityUtils.java:56)
at org.apache.shiro.web.filter.AccessControlFilter.getSubject(AccessControlFilter.java:97)
这里可以看出是getSubject出现异常。
2,debug断点测试
打断点以后发现
从ThreadContext中获取的为null,
3,查看chain-filters
发现自定义的filter在shirofilter之前加载了 ,所以在getSecurityManager时shiroFilter还未加载,为什么会优先加载自定义的filter,因为容器再加载filter时先加载spring自身管理的filter,自定义filter上我使用了@Component注解,是交给spring管理的。
4,解决办法
shiro有自定义的shiroFilter过滤器链,我们只需要把自定义的filter加入到shiroFilter中即可,即我们吧自定义filter交给shiro管理。