在一次项目的技术选型中,选择了easyui+cas+shiro+spring的组合,cas实现了单点登陆,这使得在一个应用中嵌入另外一个应用的页面来展现数据所涉及到的受权方面变得简单。ajax
因为shiro在判断登陆成功后会自动跳转到登陆前访问的页面,这就使得在easyui这样的框架下ajax异步加载某个片断页面或iframe页面时正好登陆超时,进行登陆后就直接跳转到了那一个片断页面或iframe页面的url上了,致使了系统使用上不太友好。spring
因而决定在每次登陆成功后都跳转回首页,这时须要重写shiro官方提供的CasFilter,在onLoginSuccess方法里改用框架
WebUtils.getAndClearSavedRequest(request);
清除掉其所记录的登陆前访问的url信息。异步
在另一个一样使用cas服务的应用中,须要iframe引用访问我当前应用的某个须要受权访问的页面,这时跨应用的单点登陆也是一次登陆的过程,因为我上面对当前应用的登陆修改为了登陆成功就直接跳转至首页,结果致使访问另一个应用引用我当前应用的页面时,iframe里引用的页面直接跳转到首页了。ui
基于上面出现的问题,我决定在进行登陆时,由cas返回ticket的同时,也要返回一个标记代表是经过登陆页正常登陆的仍是经过ticket进行单点登陆的,因而就有了我下面所研究出的CAS登陆后回传除了ticket参数之外的其余自定义参数。url
1、重写CAS的如下这几个类:3d
SamlServic类和SimpleWebApplicationServiceImpl类都是在CAS原来的类的基础上新增getResponse的重载方法:code
CasArgumentExtractor类和SamlArgumentExtractor类的extractServiceInternal方法都是返回上面本身写的类的实例。blog
SendTicketGrantingTicketAction类主要是添加一个参数标识(之因此在这添加是根据CAS的单点登陆访问流程决定的):文档
2、修改
配置文件里的
改为本身所写的类。
3、修改
配置文件里的
改为本身的类。
4、修改
配置文件里的
改为本身的类。
5、配置文件
里增长本身的条件判断
这是本人两三年前的干货了,当时把这步骤只是简单的记录到word文档里,若有不正确的地方,欢迎指正。
注:文中提到的CAS版本是3.5.2