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應用也是一樣的。

不知道,大家有沒有看懂,反正我自己寫着都寫蒙了,有什么問題大家再問我吧。

而且這個問題不是很好的解決方案,不知道大家有沒有什么更好的方案。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM