cas无缝单点登录(原创)
之前一直有一个问题残绕着自己,今天,终于很粗糙的解决了这个问题。
众所周知,按照cas单点登录,默认情况下,在不登录的情况下,打开网站是必须要跳转到登录页面的。那有什么方法可以控制吗,当然有,很简单,在 客户端应用中的web.xml文件中,很简单就能配置。关键代码如下:
<!-- 该过滤器负责用户的认证工作,必须启用它 -->
<filter>
<filter-name>CASFilter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>https://localhost:9443/cas/login</param-value>
</init-param>
<init-param>
<!--这里的server是服务端的IP -->
<param-name>serverName</param-name>
<param-value>http://localhost:8080/</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CASFilter</filter-name>
<url-pattern>/login</url-pattern><!--/*-->
<!--以上原本是拦截根目录的,改成/login,就可以只有在点击访问登录链接时才会去拦截验证,即使在不登录的情况下也能正常打开网站-->
</filter-mapping>
<!--以上原本是拦截根目录的,改成/login,就可以只有在点击访问登录链接时才会去拦截验证,即使在不登录的情况下也能正常打开网站-->
这个注释关键所在。
但是即便是这样,还有一个很尴尬的问题,那就是在A网站登录后,在B网站打开后,依然不能登录,需要点击登录链接才会登录,这也是因为改了拦截目录的原因,那如何解决这个问题呢,那就让他自动点击这个登录链接,主动访问这个链接,那这里分为两种情况,一种是:如果,A网站登录后,打开B网站,应该让他去点击这个链接,让他自动登录。另一种情况是:未登录情况下,如果没有登录,那么还让他点击这个链接。未登录情况下,点击这个链接是会跳转到登录页面的,那就在登录页面上进行一个判断跳转过来的链接是手动点击的链接还是,自动点击链接过来的。那如何判断这个链接呢,那就开始进入我们的绕圈子吧。写这个的时候,我也绕了好几圈,晕了好几回,所以,你第一遍没看懂是正常了,呵呵。多看几遍,想几遍就明白整个流程了。 在上述背景情况下,我们要实现的是,在登录或未登录情况下,都能正常打开网站。
那我们如何去实现这个东西嗯,最主要是通过客户端js来实现的。 首先我们的登录链接要给一个链接参数:例如
webl应用中:
<a id="sso_login" href="https://localhost:9443/cas/login?service=http://localhost:8080/nodoor3/index.do&&cas_user=no">登录</a>
加上了一个&&cas_user=no,可以在cas中的登录页面中判断,这个链接是从哪儿来的:看这个js
<script>
var bbs_url= window.location.href;
//判断url是否从login页面中跳转过来的。
if(bbs_url.indexOf("?")<0){//判断cas客户端中js是否添加了这个?cas_user=no这个参数
var sso_login=document.getElementById("sso_login");
var sso_href= sso_login.href;
var start = sso_href.indexOf("&");
//cas_url获取这个https://localhost:9443/cas/login?service=http://localhost:8080/nodoor3/index.do链接
var cas_url = sso_href.substring(0,start);
window.location=cas_url;//自动访问登录链接,如果A网站登录后,B网站通过这段js就会自动登录,反之则会跳转到cas中的login页面
}
</script>
如果没有登录跳转到cas中的登录页面怎么处理呢,且看。
cas客户端中casLoginView.jsp中js如何处理返回到原来的首页
<script> var srcc = window.location; //获取地址栏href
srcc = srcc.toString()
start = srcc.indexOf("&");
cas_url_start=srcc.indexOf("=");
if(start<0){//判断是否手动跳转过来的,加参数了说明是,手动跳转,则正常打开登录页面,没有参数,说明是自动跳转,则再返回到首页
//刚才跳转过来的https://localhost:9443/cas/login?service=http://localhost:8080/nodoor3/index.do
//cas_url是为了获取返回的链接,获取到http://localhost:8080/nodoor3/index.do链接再跳回到原来的链接。
var cas_url=srcc.substring(cas_url_start+1,srcc.length);
cas_url=cas_url+"?cas_user=no";//再加上这个参数,在web客户端中判断是否还需要自动访问链接
window.location=cas_url;
}
</script>
web2应用也是一样的。
不知道,大家有没有看懂,反正我自己写着都写蒙了,有什么问题大家再问我吧。
而且这个问题不是很好的解决方案,不知道大家有没有什么更好的方案。
cas无缝单点登录(原创)的更多相关文章
- CAS实现单点登录SSO执行原理及部署
一.不落俗套的开始 1.背景介绍 单点登录:Single Sign On,简称SSO,SSO使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. CAS框架:CAS(Centra ...
- Cas(07)——建立使用Cas进行单点登录的应用
建立使用Cas进行单点登录的应用 目录 1.1加入cas-client-core-xxx.jar到classpath 1.2配置Filter 1.2.1AuthenticationFilter 1.2 ...
- 如何利用tomcat和cas实现单点登录(1):配置tomcat的ssl和部署cas
如何利用tomcat和cas实现单点登录,借鉴了网上的很多教程,主要分为以下几个步骤: 一:下载好cas,tomcat之后,首先配置tomcat: 用鼠标右键点击"计算机"→选择& ...
- CAS实现单点登录流程
CAS实现单点登录 环境 客户端: www.app1.com CAS服务器: www.cas-server.com 1.浏览器:发起请求 www.app1.com 2. 客户端:Authenticat ...
- [精华][推荐]CAS SSO 单点登录框架学习 环境搭建
1.了解单点登录 SSO 主要特点是: SSO 应用之间使用 Web 协议(如 HTTPS) ,并且只有一个登录入口. SSO 的体系中有下面三种角色: 1) User(多个) 2) Web 应用( ...
- CAS SSO单点登录框架学习
1.了解单点登录 SSO 主要特点是: SSO 应用之间使用 Web 协议(如 HTTPS) ,并且只有一个登录入口. SSO 的体系中有下面三种角色: 1) User(多个) 2) Web 应用( ...
- [精华][推荐]CAS SSO单点登录服务端客户端实例
1.修改server.xml文件,如下: 注意: 这里使用的是https的认证方式,需要将这个配置放开,并做如下修改: <Connector port="8443" prot ...
- CAS的单点登录和oauth2的最大区别
CAS的单点登录时保障客户端的用户资源的安全 oauth2则是保障服务端的用户资源的安全 CAS客户端要获取的最终信息是,这个用户到底有没有权限访问我(CAS客户端)的资源. oauth2获取的最终信 ...
- Spring Security 集成CAS实现单点登录
参考:http://elim.iteye.com/blog/2270446 众所周知,Cas是对单点登录的一种实现.本文假设读者已经了解了Cas的原理及其使用,这些内容在本文将不会讨论.Cas有Ser ...
随机推荐
- PHPCMS v9.6.0后台getshell
思路来自于 http://www.cnbraid.com/2016/09/18/phpcms/ 这里自己复现了一下,自己写了一下 因为是后台的,还得登陆两次..所以不好用,主要是学习学习 漏洞来自于R ...
- (译)Getting Started——1.3.1 Incorporating the Data(合并数据)
在实现完应用的行为后,需要创建数据模型来支撑应用的界面.应用的数据模型定义了应用中数据的维护方法.数据模型可以是一个基本的dictionary类型,也可以是复杂的数据库,范围很广.好的数据模型可以更为 ...
- 免安装Oracleclient和PL/SQL
写在前面: Oracle是典型的C/S结构,服务端提供oracle服务的实例,主要用于数据库的管理,对象的管理与存储.数据的 存储.查询.数据库资源的监控.监听等一些服务. 而client仅仅是一个与 ...
- 修改storm ui 默认端口
vim conf/storm.yaml 在下面添加 ui.port: 8080
- 重载(Overload)
重载(Overload) 重载(overloading) 是在一个类里面,方法名字相同,而参数不同.返回类型可以相同也可以不同. 每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表. 最 ...
- python 2个版本如何共存
我们在安装Python3(>=3.3)时,Python的安装包实际上在系统中安装了一个启动器py.exe,默认放置在文件夹C:\Windows\下面.这个启动器允许我们指定使用Python2还是 ...
- spark(1.1) mllib 源码分析(三)-朴素贝叶斯
原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/4042467.html 本文主要以mllib 1.1版本为基础,分析朴素贝叶斯的基本原理与源码 一.基本原 ...
- openwrt U盘启动
参考链接: http://m.blog.csdn.net/blog/zcynical/44892785
- 边缘检测sobel算子
sobel算子 - sophia_hxw - 博客园http://www.cnblogs.com/sophia-hxw/p/6088035.html #1,个人理解 网上查了很多资料,都说sobel算 ...
- Java 面试题 自己写的答案
基本概念 操作系统中 heap 和 stack 的区别 栈(stack)与堆(heap)都是Java用来在内存中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 在函 ...