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 ...
随机推荐
- 常用的几个linux命令
linux 命令众多,特别是每个命令后面的option更是很多,如果不经常使用,就容易忘记.下面是一些常用的命令和参数.其他不常用的,可以用help去现查现用. 1. 最常用的命令列表 下面列出几个在 ...
- 机器学习算法( 七、AdaBoost元算法)
一.概述 当做重要决定时,大家可能都会考虑吸取多个专家而不只是一个人的意见.机器学习处理问题时又何尝不是如此?这就是元算法(meta-algorithm)背后的思路.元算法是对其他算法进行组合的一种方 ...
- python -> lambda与def的差别
lambda能够定义一个匿名函数.而def定义的函数必须有一个名字. 这应该是lambda与def两者最大的差别. 与Javascript不同的是,python中匿名函数与非匿名函数须要使用不同的语法 ...
- Character流与Byte流的区别
Character流与Byte流的区别 (2012-09-25 16:15:49) 标签: 杂谈 分类: 大赛指导 Character流与Byte流的区别是 A) 每次读入的字节数不同 B) 前者带有 ...
- YARN源码分析(一)-----ApplicationMaster
转自:http://blog.csdn.net/androidlushangderen/article/details/48128955 YARN学习系列:http://blog.csdn.net/A ...
- 布局溢出屏幕解决-easyui
body样式easyui-layout 再加个滚轮
- 说明反转控制(IOC)和面向方向编程(AOP)在spring中的应用
说明反转控制(IOC)和面向方向编程(AOP)在spring中的应用 解答:Spring 核心容器(Core)提供Spring框架的基本功能.核心容器的主要组件是BeanFactory,它是工厂模式的 ...
- WPF之路——用户控件对比自定义控件UserControl VS CustomControl)
将多个现有的控件组合成一个可重用的“组”. 由一个XAML文件和一个后台代码文件. 不能使用样式和模板. 继承自UserControl类. 自定义控件(扩展) 在现有的控件上进行扩展,增加一些新的属性 ...
- gcc/g++ 实战之编译的四个过程
gcc和g++分别是GNU(一个开源组织)的c&c++编译器 对于.c后缀的文件,gcc把它当做是C程序,g++当做是C++程序:对于.cpp后缀的文件,gcc和g++都会当做c++程序. ...
- Windows查看网络端口被占用情况netstat命令
在windows命令行窗口下执行: C:\>netstat -aon|findstr "80" TCP 127.0.0.1:80 0.0.0.0:0 ...