在一次项目的技术选型中,选择了easyui+cas+shiro+spring的组合,cas实现了单点登录,这使得在一个应用中嵌入另一个应用的页面来展示数据所涉及到的授权方面变得简单。
由于shiro在判断登录成功后会自动跳转到登录前访问的页面,这就使得在easyui这样的框架下ajax异步加载某个片段页面或iframe页面时正好登录超时,进行登录后就直接跳转到了那一个片段页面或iframe页面的url上了,导致了系统使用上不太友好。
于是决定在每次登录成功后都跳转回首页,这时需要重写shiro官方提供的CasFilter,在onLoginSuccess方法里改用
WebUtils.getAndClearSavedRequest(request);
清除掉其所记录的登录前访问的url信息。
在另外一个同样使用cas服务的应用中,需要iframe引用访问我当前应用的某个需要授权访问的页面,这时跨应用的单点登录也是一次登录的过程,由于我上面对当前应用的登录修改成了登录成功就直接跳转至首页,结果导致访问另外一个应用引用我当前应用的页面时,iframe里引用的页面直接跳转到首页了。
基于上面出现的问题,我决定在进行登录时,由cas返回ticket的同时,也要返回一个标记表明是通过登录页正常登录的还是通过ticket进行单点登录的,于是就有了我下面所研究出的CAS登录后回传除了ticket参数以外的其他自定义参数。
一、重写CAS的以下这几个类:
SamlServic类和SimpleWebApplicationServiceImpl类都是在CAS原来的类的基础上新增getResponse的重载方法ÿ