cas无缝单点登录(原创)

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><!--/*--><br>          <!--以上原本是拦截根目录的,改成/login,就可以只有在点击访问登录链接时才会去拦截验证,即使在不登录的情况下也能正常打开网站-->

    </filter-mapping>

<!--以上原本是拦截根目录的,改成/login,就可以只有在点击访问登录链接时才会去拦截验证,即使在不登录的情况下也能正常打开网站--><br>这个注释关键所在。<br>但是即便是这样,还有一个很尴尬的问题,那就是在A网站登录后,在B网站打开后,依然不能登录,需要点击登录链接才会登录,这也是因为改了拦截目录的原因,那如何解决这个问题呢,那就让他自动点击这个登录链接,主动访问这个链接,那这里分为两种情况,一种是:如果,A网站登录后,打开B网站,应该让他去点击这个链接,让他自动登录。另一种情况是:未登录情况下,如果没有登录,那么还让他点击这个链接。未登录情况下,点击这个链接是会跳转到登录页面的,那就在登录页面上进行一个判断跳转过来的链接是手动点击的链接还是,自动点击链接过来的。那如何判断这个链接呢,那就开始进入我们的绕圈子吧。写这个的时候,我也绕了好几圈,晕了好几回,所以,你第一遍没看懂是正常了,呵呵。多看几遍,想几遍就明白整个流程了。<br><br>在上述背景情况下,我们要实现的是,在登录或未登录情况下,都能正常打开网站。<br>那我们如何去实现这个东西嗯,最主要是通过客户端js来实现的。<br><br>首先我们的登录链接要给一个链接参数:例如<br>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应用也是一样的。

不知道,大家有没有看懂,反正我自己写着都写蒙了,有什么问题大家再问我吧。

而且这个问题不是很好的解决方案,不知道大家有没有什么更好的方案。

努力生活,珍惜一切,知足最快乐!young joy..

分类: JAVA

猜你喜欢

转载自blog.csdn.net/wangshuminjava/article/details/81187779