重复登录
- cas配置了非https访问之后,登录了,可以访问一次子服务但是不可以访问其他的子服务,这是因为浏览器和cas服务端的cookie凭证TGC是https的,访问其他的子服务浏览器会重定向到cas获取一个凭证,这时候不会携带这个TGCcookie,浏览器对于cas服务器来说是没有登录的解决方法是设置cas服务器的cookie生成器为非https的如图webapps\cas\WEB-INF\springconfiguration\ticketGrantingTicketCookieGenerator.xml,这个配置对于4.1.0以下版本cas有用,但是对于以上的不知道配置文件在哪儿,如果知道可以告诉我
<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
c:casCookieValueManager-ref="cookieValueManager"
p:cookieSecure="false"
p:cookieMaxAge="-1"
p:cookieName="TGC"
p:cookiePath="/cas"/>
循环跳转
- cas使用自定义的SessionManager,在cas登录成功之后,从cas获取ticket,shiro校验放行跳转到目标页面然后又要重新登录,跳转到cas获取凭证shiro再次校验这样重复跳转。
- tomcat接收到请求,执行过滤器链ApplicationFilterChain,这时候Spring代理的ShiroFilter,shiroFilter本身,和配置的casFilter都在这个链之上,所以casFilter执行了两次,第一次在shiroFilter内部filterChain,这个时候标记shiro本身的session登录成功,第二次在ApplicationFilterChain执行这个时候标记一个新创建的httpSession登录成功。如果这两个session对应的cookie名称相同那么httpSession的cookie会覆盖ShiroSession的cookie.但是shiro拿httpSession的id去找自身的session就找不到了所以请求需要重新登录。然后就出现循环跳转。解决方法sessionManage设置cookie名称与tomcat的默认cookie名称(JSESSONID)不同
@Bean
public SessionManager sessionManager(){
DefaultWebSessionManager dwsm = new DefaultWebSessionManager();
dwsm.setSessionDAO(redisSessionDAO());
SimpleCookie simpleCookie = new SimpleCookie();
simpleCookie.setName("xxxxx");
simpleCookie.setPath("/");
dwsm.setSessionIdCookie(simpleCookie);
return dwsm;
}