项目场景:
使用shiro进行权限认证时,登录地址第一次访问总是自动携带JESSIONID,现在需要把它去掉不能显示。
问题描述:
首先翻遍百度发现大多数解决方案就是在DefaultWebSecurityManager注入时设置sessionManager。该方法还需要 shiro 1.3.2以上才行,巧了我的1.3.0肯定不行,直接去pom改下版本号。
注解方式:
@Bean public DefaultWebSessionManager sessionManager(){ DefaultWebSessionManager sessionManager = new DefaultWebSessionManager(); sessionManager.setSessionIdUrlRewritingEnabled(false); return sessionManager; } @Bean public DefaultWebSecurityManager securityManager(){ DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setSessionManager(sessionManager()); return securityManager; }
xml方式:
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> <property name="sessionIdUrlRewritingEnabled" value="false"/> </bean> <!-- Shiro安全管理器 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="sessionManager" ref="sessionManager"/> </bean>
xml方式记得加包扫描,我的:
<context:component-scan base-package="config" />
然后运行项目,报错和之前一样,反正就是没有getter方法。
原因分析:
在debug时,发现项目里有三个版本的shiro,有两个是其他模块的,所以就没管,但是debug时发现行数对不上,下了源码后,发现this.sessionIdUrlRewritingEnabled = true;这行都打不上断点,然后rebuild项目,mvn clean install重新打包,重启idea都用上了,然后能打断点了,但是debug开始后,断点图标又变成圆圈斜杠,根本不是进的我当前项目的shiro版本。
最后只能猜测是不是多版本同时存在有什么问题。
解决方案:
发现三个版本中,有个版本为很老的1.2.4,但是整个项目根本没地方引入,然后看仓库还是shiro-all的方式引入的,于是暂时修改下名字,运行项目后果然能跑了!!!
最后百度发现shiro最好不要直接引入all,按需引入,不然在maven会出问题,参考链接:http://www.nutz.cn/yvr/t/5alnnrtujchnup2ul0fe5eidf0
坑的要死,搞了几小时!!!