这个问题之前就发现过,最近有几个哥们一直在问我这个怎么搞,我手上在做另一个项目,cas就暂时搁浅了几周。现在我们来一起改一下你的应用(client2/3)的web.xml来解决这个2b问题,首先看下错误描述:

问题: 我登录了client2,又登录了client3,现在我把client2退出了,在client3里面我F5刷新了一下,结果页面报错:

未能够识别出目标 'ST-41-2VcnVMguCDWJX5zHaaaD-cas01.example.org'票根

  1. <span style="font-family:Microsoft YaHei;font-size:12px;">type Exception report
  2. message org.jasig.cas.client.validation.TicketValidationException:
  3. description The server encountered an internal error that prevented it from fulfilling this request.
  4. exception
  5. javax.servlet.ServletException: org.jasig.cas.client.validation.TicketValidationException:
  6. 鏈兘澶熻瘑鍒嚭鐩爣 'ST-41-2VcnVMguCDWJX5zHaaaD-cas01.example.org'绁ㄦ牴
  7. org.jasig.cas.client.validation.AbstractTicketValidationFilter.doFilter(AbstractTicketValidationFilter.java:155)
  8. org.jasig.cas.client.session.SingleSignOutFilter.doFilter(SingleSignOutFilter.java:99)
  9. org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
  10. org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
  11. root cause
  12. org.jasig.cas.client.validation.TicketValidationException:
  13. 鏈兘澶熻瘑鍒嚭鐩爣 'ST-41-2VcnVMguCDWJX5zHaaaD-cas01.example.org'绁ㄦ牴
  14. org.jasig.cas.client.validation.Cas20ServiceTicketValidator.parseResponseFromServer(Cas20ServiceTicketValidator.java:73)
  15. org.jasig.cas.client.validation.AbstractUrlBasedTicketValidator.validate(AbstractUrlBasedTicketValidator.java:188)
  16. org.jasig.cas.client.validation.AbstractTicketValidationFilter.doFilter(AbstractTicketValidationFilter.java:132)
  17. org.jasig.cas.client.session.SingleSignOutFilter.doFilter(SingleSignOutFilter.java:99)
  18. org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
  19. org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
  20. note The full stack trace of the root cause is available in the Apache Tomcat/7.0.37 logs.</span>

猜都能猜出来,我注销了,ticket已经失效了,现在我又发回到server端,它就报错了。(客户端发过去就报错了),以下就是cas ticket失效处理的一个很简单的解决办法,复杂的话,需要修改client源码进行异常处理。

1.所以针对这个情况,我只能在web.xml中下手了,(你也可以修改客户端的jar包中的一些Java类,自己去做这个异常处理,接收所有在cas使用过程中会出错的处理,全部跳转到错误页面中,让掉线的人重新登录。在这里,我们采用web.xml配置一下)

2.这是官网解释:https://wiki.jasig.org/display/CASC/Configuring+the+Jasig+CAS+Client+for+Java+in+the+web.xml 它的解释:

The correct order of the filters in web.xml is necessary:

  1. AuthenticationFilter
  2. TicketValidationFilter (whichever one is chosen)
  3. HttpServletRequestWrapperFilter
  4. AssertionThreadLocalFilter

意思是说,过滤器链不要错,我之前的那篇教程里cas客户端配置web.xml没有使用这几个过滤器,现在我们重新使用它。

3.这是一个哥们之前解释的:我贴出来。

单点登出,客户端配置。我尝试使用SAML作为认证和Ticket校验,但是调试时发现单点登出取标识的方式只能识别CAS的认证和校验。
认证:org.jasig.cas.client.authentication.AuthenticationFilter
校验:org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
过滤器顺序:
1. CAS Single Sign Out Filter
2. CAS Validation Filter
3. CAS Authentication Filter
4. CAS HttpServletRequest Wrapper Filter
5. CAS Assertion Thread Local Filter
特别注意Validation在Authentication之前,因为我使用的是Cas20ProxyReceivingTicketValidationFilter。根据CAS文档描述:If
you are using proxy validation, you should map the validation filter
before the authentication filter.

4.ok,放上我的web.xml文件,废掉之前的cas验证过滤器(CAS Filter)。使用另一个过滤器(CAS Authentication Filter),并且增加另外三个过滤器(CAS Validation Filter,CAS HttpServletRequest Wrapper Filter,CAS
Assertion Thread Local Filter),注意过滤器的顺序.

  1. <span style="font-family:Microsoft YaHei;font-size:12px;"><?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://java.sun.com/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  5. <!-- 解决中文乱码问题 -->
  6. <filter>
  7. <filter-name>spring filter</filter-name>
  8. <filter-class>
  9. org.springframework.web.filter.CharacterEncodingFilter
  10. </filter-class>
  11. <init-param>
  12. <param-name>encoding</param-name>
  13. <param-value>UTF-8</param-value>
  14. </init-param>
  15. </filter>
  16. <filter-mapping>
  17. <filter-name>spring filter</filter-name>
  18. <url-pattern>/*</url-pattern>
  19. </filter-mapping>
  20. <!-- 解决中文乱码问题 -->
  21. <!--1.用于单点退出 -->
  22. <listener>
  23. <listener-class>
  24. org.jasig.cas.client.session.SingleSignOutHttpSessionListener
  25. </listener-class>
  26. </listener>
  27. <filter>
  28. <filter-name>CAS Single Sign Out Filter</filter-name>
  29. <filter-class>
  30. org.jasig.cas.client.session.SingleSignOutFilter
  31. </filter-class>
  32. </filter>
  33. <filter-mapping>
  34. <filter-name>CAS Single Sign Out Filter</filter-name>
  35. <url-pattern>/*</url-pattern>
  36. </filter-mapping>
  37. <!--2.负责Ticket校验-->
  38. <filter>
  39. <filter-name>CAS Validation Filter</filter-name>
  40. <filter-class>
  41. org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
  42. </filter-class>
  43. <init-param>
  44. <param-name>casServerUrlPrefix</param-name>
  45. <param-value>
  46. http://192.168.168.141:8080/casServer
  47. </param-value>
  48. </init-param>
  49. <init-param>
  50. <param-name>serverName</param-name>
  51. <param-value>192.168.168.141:8080</param-value>
  52. </init-param>
  53. <init-param>
  54. <param-name>useSession</param-name>
  55. <param-value>true</param-value>
  56. </init-param>
  57. <init-param>
  58. <param-name>exceptionOnValidationFailure</param-name>
  59. <param-value>false</param-value>
  60. </init-param>
  61. <init-param>
  62. <param-name>redirectAfterValidation</param-name>
  63. <param-value>true</param-value>
  64. </init-param>
  65. </filter>
  66. <filter-mapping>
  67. <filter-name>CAS Validation Filter</filter-name>
  68. <url-pattern>/*</url-pattern>
  69. </filter-mapping>
  70. <!-- 3. 单点登录验证 -->
  71. <filter>
  72. <filter-name>CAS Authentication Filter</filter-name>
  73. <filter-class>
  74. org.jasig.cas.client.authentication.AuthenticationFilter
  75. </filter-class>
  76. <init-param>
  77. <param-name>casServerLoginUrl</param-name>
  78. <param-value>
  79. http://192.168.168.141:8080/casServer/login
  80. </param-value>
  81. </init-param>
  82. <init-param>
  83. <param-name>serverName</param-name>
  84. <param-value>http://192.168.168.141:8080</param-value>
  85. </init-param>
  86. </filter>
  87. <filter-mapping>
  88. <filter-name>CAS Authentication Filter</filter-name>
  89. <url-pattern>/*</url-pattern>
  90. </filter-mapping>
  91. <!-- 3.用于单点登录 去服务器端认证(之前使用的这种)
  92. <filter>
  93. <filter-name>CAS Filter</filter-name>
  94. <filter-class>
  95. edu.yale.its.tp.cas.client.filter.CASFilter
  96. </filter-class>
  97. <init-param>
  98. <param-name>
  99. edu.yale.its.tp.cas.client.filter.loginUrl
  100. </param-name>
  101. <param-value>
  102. http://192.168.168.141:8080/casServer/login
  103. </param-value>
  104. </init-param>
  105. <init-param>
  106. <param-name>
  107. edu.yale.its.tp.cas.client.filter.validateUrl
  108. </param-name>
  109. <param-value>
  110. http://192.168.168.141:8080/casServer/serviceValidate
  111. </param-value>
  112. </init-param>
  113. <init-param>
  114. <param-name>
  115. edu.yale.its.tp.cas.client.filter.serverName
  116. </param-name>
  117. <param-value>192.168.168.141:8080</param-value>
  118. </init-param>
  119. </filter>
  120. -->
  121. <!--4.  CAS HttpServletRequest Wrapper Filter 这个是HttpServletRequet的包裹类,让他支持getUserPrincipal,getRemoteUser方法来取得用户信息-->
  122. <filter>
  123. <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
  124. <filter-class>
  125. org.jasig.cas.client.util.HttpServletRequestWrapperFilter
  126. </filter-class>
  127. </filter>
  128. <filter-mapping>
  129. <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
  130. <url-pattern>/*</url-pattern>
  131. </filter-mapping>
  132. <!--5. CAS Assertion Thread Local Filter  这个类把Assertion信息放在ThreadLocal变量中,这样应用程序不在web层也能够获取到当前登录信息-->
  133. <filter>
  134. <filter-name>CAS Assertion Thread Local Filter</filter-name>
  135. <filter-class>
  136. org.jasig.cas.client.util.AssertionThreadLocalFilter
  137. </filter-class>
  138. </filter>
  139. <filter-mapping>
  140. <filter-name>CAS Assertion Thread Local Filter</filter-name>
  141. <url-pattern>/*</url-pattern>
  142. </filter-mapping>
  143. <servlet>
  144. <servlet-name>Query</servlet-name>
  145. <servlet-class>servlet.Query</servlet-class>
  146. </servlet>
  147. <servlet-mapping>
  148. <servlet-name>Query</servlet-name>
  149. <url-pattern>/query</url-pattern>
  150. </servlet-mapping>
  151. <welcome-file-list>
  152. <welcome-file>index.jsp</welcome-file>
  153. </welcome-file-list>
  154. </web-app>
  155. </span>

5.如果这样做了,你还需要一件事情,就是前台获取用户信息的方式改了,我的index.jsp改成了这个:

  1. <span style="font-family:Microsoft YaHei;font-size:12px;"><%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <%@page import="edu.yale.its.tp.cas.client.filter.CASFilter"%>
  3. <%@page import="org.jasig.cas.client.util.AssertionThreadLocalFilter"%>
  4. <%@page import="org.jasig.cas.client.util.HttpServletRequestWrapperFilter"%>
  5. <%@page import="org.jasig.cas.client.authentication.AttributePrincipal"%>
  6. <%@page import="org.jasig.cas.client.util.AbstractCasFilter"%>
  7. <%@page import="org.jasig.cas.client.validation.Assertion"%>
  8. <body>
  9. <h1>
  10. 登录成功,这是客户端2
  11. </h1>
  12. <br />
  13. 欢迎您:
  14. <%
  15. //String username = (String) session.getAttribute(CASFilter.CAS_FILTER_USER);
  16. //String username2 = (String)AssertionHolder.getAssertion().getPrincipal().getName();
  17. String username = "";
  18. AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal();
  19. if(principal != null){
  20. username = principal.getName();//获取用户名
  21. }
  22. %>
  23. 用户名:<%=username%></span>

ok,我的应用之间如果一个退出,另一个就算带ticket参数也不不再报错了,就算是测试组的兄弟拿到那段ticket复制粘贴到另一个浏览器中进行访问,也不会报错。

ps:

也有兄弟说可以通过修改C:\tomcat7\webapps\casServer\WEB-INF\spring-configuration\ticketExpirationPolicies.xml这个文件中的

  1. <!-- Expiration policies -->
  2. <util:constant id="SECONDS" static-field="java.util.concurrent.TimeUnit.SECONDS"/>
  3. <bean id="serviceTicketExpirationPolicy" class="org.jasig.cas.ticket.support.MultiTimeUseOrTimeoutExpirationPolicy"
  4. c:numberOfUses="1" c:timeToKill="${st.timeToKillInSeconds:10}" c:timeUnit-ref="SECONDS"/>

其中那个

c:numberOfUses="1" //使用ticket多少次

c:timeToKill="${st.timeToKillInSeconds:10}" //多少秒过期,默认10秒,你把这个改成10分钟玩玩。

这个方法我没有尝试,所以希望想尝试想折腾和想玩的兄弟狠狠的点击这个链接:http://bbs.csdn.net/topics/390111112

SSO单点登录系列6:cas单点登录防止登出退出后刷新后退ticket失效报500错的更多相关文章

  1. cas sso单点登录系列6_cas单点登录防止登出退出后刷新后退ticket失效报500错

    转(http://blog.csdn.net/ae6623/article/details/9494601) 问题: 我登录了client2,又登录了client3,现在我把client2退出了,在c ...

  2. [置顶] SSO单点登录系列6:cas单点登录防止登出退出后刷新后退ticket失效报500错

    这个问题之前就发现过,最近有几个哥们一直在问我这个怎么搞,我手上在做另一个项目,cas就暂时搁浅了几周.现在我们来一起改一下你的应用(client2/3)的web.xml来解决这个2b问题,首先看下错 ...

  3. SSO单点登录一:cas单点登录防止登出退出后刷新后退ticket失效报500错,也有退出后直接重新登录报票根验证错误

    问题1: 我登录了client2,又登录了client3,现在我把client2退出了,在client3里面我F5刷新了一下,结果页面报错: 未能够识别出目标 'ST-41-2VcnVMguCDWJX ...

  4. cas单点登录防止登出退出后刷新后退ticket失效报500错

    https://www.cnblogs.com/wangyang108/p/5844447.html

  5. SSO单点登录系列4:cas-server登录页面自定义修改过程(jsp页面修改)

    落雨 cas 单点登录 SSO单点登录系列4:cas-server登录页面自定义修改过程,全新DIY. 目标:    下面是正文: 打开cas的默认首页,映入眼帘的是满眼的中文and英文混杂体,作为一 ...

  6. cas sso单点登录系列2:cas客户端和cas服务端交互原理动画图解,cas协议终极分析

    转:http://blog.csdn.net/ae6623/article/details/8848107 1)PPT流程图:ppt下载:http://pan.baidu.com/s/1o7KIlom ...

  7. SSO单点登录系列1:cas客户端源码分析cas-client-java-2.1.1.jar

    落雨 cas 单点登录 希望能给以后来研究cas的兄弟留下一点思路,也算是研究了两天的成果,外国人的代码写的很晦涩,翻译下来也没有时间继续跟进,所以有错误的还请大家跟帖和我讨论,qq 39426378 ...

  8. SSO单点登录系列2:cas客户端和cas服务端交互原理动画图解,cas协议终极分析

    落雨 cas 单点登录 一.用户第一次访问web1应用. ps:上图少画了一条线,那一条线,应该再返回来一条,然后再到server端,画少了一步...谢谢提醒.而且,重定向肯定是从浏览器过去的.我写的 ...

  9. cas系列(一)--cas单点登录基本原理

    (这段时间打算做单点登录,因此研究了一些cas资料并作为一个系列记录下来,一来可能会帮助一些人,二来对我自己所学知识也是一个巩固.) 一.为什么要实现单点登录 随着信息化不断发展,企业的信息化过程是一 ...

随机推荐

  1. Java面试题之类的静态代码块和静态属性等的加载顺序

    如以下面试题: /** * @author hjs * @date 2019/3/62:41 * @Dec */public class B { public static B t1 = new B( ...

  2. WKWebview 和 WebViewJavascriptBridge

    WKWebview 和 WebViewJavascriptBridge https://www.cnblogs.com/L-vincen/p/6681435.html 链接在这里,有很多不错的文章,大 ...

  3. 51nod 1583 犯罪计划——矩阵乘法优化dp

    文泽想在埃及做案n次,并且想在最后不用得到惩罚.案件的被分成几种类型.比如说,案件A,当案件A被重复犯两次时,案件A将被认为不是犯罪案件,因此犯案人不用得到惩罚.也就是说,案件A被犯偶数次时,犯案人将 ...

  4. jquery.uploadify不支持MVC的Authorize

    原文发布时间为:2011-10-18 -- 来源于本人的百度文章 [由搬家工具导入] 为什么jquery.uploadify不支持MVC的Authorize呢,因为flash的cookie跟服务端的不 ...

  5. 【IDEA】使用intellij的idea集成开发工具中的git插件

    注意:这里并没有介绍git客户端的安装,如果要安装客户端,大家可以参考如下的链接: http://www.runoob.com/git/git-install-setup.html 1.在使用这个id ...

  6. mysql server5.7 找不到my.ini,只有my-default.ini【mysql全局配置文件】

    起因是在尝试将csv文件导入mysql的table时,出现如下错误: “The MySQL server is running with the --secure-file-priv option s ...

  7. MySQL 5.7主从复制与主主复制实现细节分析

    0.简介: MySQL作为世界上使用最为广泛的数据库之一,免费是其原因之一.但不可忽略的是它本身的功能的确很强大.随着技术的发展,在实际的生产环境中,由单台MySQL数据库服务器不能满足实际的需求.此 ...

  8. jdbc连接警告不安全

    Mon Jun 11 10:46:26 CST 2018 WARN: Establishing SSL connection without server's identity verificatio ...

  9. Laravel 添加自定义辅助函数

    1. 在 app 目录下新建一个文件 helpers.php 2. 在 composer.json 文件的 autoload 字典中添加 "files":["app/he ...

  10. [BZOJ1191][HNOI2006]超级英雄Hero 类似二分图的最大匹配

    1191: [HNOI2006]超级英雄Hero Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4740  Solved: 2162[Submit][ ...