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 ...
随机推荐
- Chapter 2 JavaScript Basic
Has 5 primitive types: Undefined, Null, Boolean, String, Number. typeof operator Undefined return u ...
- OkHttp+Stetho+Chrome调试android网络部分(原创)
android网络调试一直是一个比较麻烦的部分,因为在不同序列的请求中,返回的数据会有不同的变化,如果能像web开发一样使用调试功能查看页面的访问数据该是多么美好的事情! 很幸运的是,现在Androi ...
- java请求POST发送json格式请求
public static String upload(String url){ try { HttpClient httpclient = new DefaultHttpClient(); Http ...
- poj3680 Intervals 区间k覆盖问题 最小费用最大流 建图巧妙
/** 题目:poj3680 Intervals 区间k覆盖问题 最小费用最大流 建图巧妙 链接:http://poj.org/problem?id=3680 题意:给定n个区间,每个区间(ai,bi ...
- 使用inotify+rsync实现服务器间文件同步
1. rsync 1.1 什么是rsync rsync是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件.它使用所谓的“Rsync演算法”来使本地和远程两个主机之间的文件达到 ...
- Linux利器:WinSCP,Putty,pscp和psftp
# Summary PuTTY (Telnet 和 SSH 客户端) PSCP (SCP 客户端, 命令行下通过 SSH 拷贝文件,类似于 Unix/Linux 下的 scp 命令) PSFTP (S ...
- php linux 创建文件夹权限问题
$path = "DataMsg/"; if(is_dir($path)==false){ @mkdir($path,0777); } windows 上创建没问题.但在linux ...
- linux之挂载硬盘
sudo gedit /etc/fstab中添加 UUID=190534e2-d8ae-4928-94b7-0f4d4209a3ab /data ext4 defaults ...
- IOS控件:分歧解决其(UILabel 和 IBAction)
#import <UIKit/UIKit.h> @interface demo7_dayViewController : UIViewController { // 用来显示程序结果 IB ...
- nodepad++ 快捷键加常用操作
常用快捷键 新建文件 Ctrl+N 打开文件 Ctrl+O 保存文件 Ctrl+S 另存为 Ctrl+Alt+S 全部保存 Ctrl+Shift+S 关闭当前文件 Ctrl+W 打印文件 Ctrl+P ...