1:问题出现缘由
web项目权限框架使用shiro,在和单点登录集成后,登录login添加了一些判断,如下:
Object authUser=UserUtils.getShiroSession().getAttribute("self_login_check");
if(null==authUser&&StringUtils.isBlank((String)UserUtils.getShiroSession().getAttribute("UserLoginInfo"))){
return "redirect:/";
}else{
if(SecurityUtils.getSubject().isAuthenticated()){
SecurityUtils.getSubject().logout();
}
}
return "system/user/login";
因为authUser在获取self_login_check的时候一直为 null 所以程序一直走 return “redirect:/" 这步
这步骤因为是tomcat在启动还有没有shiro主体,所以就直接跳转到login,这个时候就形成了一个 login 跳转到 / 而 / 跳转到login的死循环,所以tomcat就启动超时了,虽然tomcat的启动一直到最后给你的感觉都是正常启动了,但是就是超时,无法启动访问,就是死循环导致的。
这个死循环出现的前提是你在配置shiro的时候filterChainDefinitions 必须有 /**=authc 这个内容,不然死循环也不会出现。
2:修改出现的问题
直接更改判断变量 authUser的值即可,比如更改为:
if(null!=authUser&&StringUtils.isNotBlank((String)UserUtils.getShiroSession().getAttribute("UserLoginInfo"))){
即可解决问题。 这个解决问题的核心还是解决 死循环,死循环也是有集成shiro启动的时候走一系列过滤器造成的。