CAS单点登出问题及解决 一 (文章摘自笔者发在自己公司内部论坛的文章:谢绝转载)
背景:目前很多业务反应,在使用
portal过程中,如果需要切换账号,做完登出操作后,需要清除 cookies,才能使下一次登录人正常使用其他业务系统。
原因:在 portal做完登出操作后, cas-server端接受到了登出的请求,并向 cas-client端发送登出并清除 session的请求。然而在我们的 cas-client并未成功接收到请求。
在我们的web.xml中 配置的有CAS Single SignOut Filter和shiroFilter ,我们的shiroFilter在CAS Single Sign Out Filter之前,我们所有的请求都会被shiroFilter所拦截,CASSingle Sign Out Filter无法过滤请求,所以我们的cas-clienT监听不到cas-server
发过来的登出请求 。
解决方案:我们要将
CAS Single Sign Out Filter拷贝到 shiroFilter
之前 。
<!-- CAS Single Sign Out --> <listener> <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class> </listener> <filter> <filter-name>CAS Single Sign Out Filter</filter-name> <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class> <init-param> <param-name>casServerUrlPrefix</param-name> <param-value>http://xxx/casserver/</param-value> </init-param> </filter> <filter-mapping> <filter-name>CAS Single Sign Out Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- shiro filter --> <filter> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <init-param> <param-name>targetFilterLifecycle</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> </filter-mapping>