本人新手一枚,剛畢業不久,因最近研究shiro與cas單點登陸問題,趕上了cas服務器成功登錄後返回到client出現的各類情況表示不勝其煩。web
博主一開始參考開濤的shiro集成cas,收穫頗豐,而後本身寫一個單點登陸Demo,其中趕上了很多的問題讓博主不多苦惱,spring
首先的web.xml配置過濾器瀏覽器
樓主一開始配置了3個過濾器,是爲了得到登陸成功後client得到server登陸時的用戶參數服務器
<!-- CAS服務器攔截器 該過濾器負責用戶的認證工做,必須啓用它 -->
<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:8443/cas/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:8080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CASFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>mybatis
<!-- 在Ticket的校驗工做前獲取ticket -->
<!-- <filter>
<filter-name>GetTicket</filter-name>
<filter-class>com.vacomall.filter.GetTicket</filter-class>
</filter>
<filter-mapping>
<filter-name>GetTicket</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> -->
<!-- 該過濾器負責對Ticket的校驗工做,必須啓用它 -->
<!-- <filter>
<filter-name>CAS Validation Filter</filter-name>
<filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
下面的URL是Cas服務器的認證地址
<param-value>https://localhost:8443/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
下面的URL是具體某一個應用的訪問地址
<param-value>http://localhost:8080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> -->
<!--
該過濾器使得開發者能夠經過org.jasig.cas.client.util.AssertionHolder來獲取用戶的登陸名。
好比AssertionHolder.getAssertion().getPrincipal().getName()。
-->
<!-- <filter>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
自動根據單點登陸的結果設置本系統的用戶信息(具體某一個應用實現)
<filter>
<filter-name>CasForInvokeContextFilter</filter-name>
<filter-class>com.vacomall.filter.CasForInvokeContextFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CasForInvokeContextFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> -->app
可是通過Cas20ProxyReceivingTicketValidationFilter過濾器以後,無論代碼如何修改,cas返回成功後的地址會通過2次重定向,以至於到jsp
<!-- cas過濾器 -->
<bean id="casFilter" class="com.vacomall.filter.MyCasFilter">
<!-- 配置驗證錯誤時的失敗頁面 -->
<property name="failureUrl" value="/casFailure.jsp"/>
<property name="successUrl" value="/index"></property>
</bean>url
後cas過濾器沒法獲取到ticket,以下貼圖spa
把上面3個過濾器註釋掉以後,url只通過一次重定向,並帶着ticket返回server
以後的問題就是返回失敗進入失敗頁面,進入cas服務端驗證再返回無限循環
查看源代碼以後,發現ticketValidator.validate(ticket, getCasService())拋出了異常,
ticket值與瀏覽器的值一致,沒有錯誤,那問題就出在了 getCasService()這個上面,
casService通過配置文件查看,才發現<property name="casService" value="https://localhost:8080/spring_mybatis/index"></property>
返回路徑錯誤,因本身多加了s,變成https以後沒法匹配返回路徑,才形成無限循環,至此問題解決。