这个问题之前就发现过,最近有几个哥们一直在问我这个怎么搞,我手上在做另一个项目,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. jquery.jbox JBox-v2.3修改版

    原版jquery.jbox是个不错的jquery扩展,使用简单,功能很多.可惜的是作者把javascript加密了,并且2011年以后就不再更新.如果项目中用到了新的jquery版本,甚至jbox就没 ...

  2. Tomcat学习笔记(二)

    Servlet浅析 javax.servlet.Servlet是一个接口,所有的Servlet必须实现接口里面的方法. 该接口在tomcat/bin中的servlet-api.jar包中. Servl ...

  3. DP———7.导弹拦截(emmm冷静分析一波也不叫DP吧,不过有一种DP的方法写)

    最少拦截系统 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  4. FOJ ——Problem 1759 Super A^B mod C

     Problem 1759 Super A^B mod C Accept: 1368    Submit: 4639Time Limit: 1000 mSec    Memory Limit : 32 ...

  5. myeclipse maven web项目配置

    启用maven:window-->preference-->MyEclipse-->Maven4MyEclipse, 勾选复选框(Enable Mave4MyEclipse feat ...

  6. myeclipse 常规web项目创建

    配置jdk 我的jdk C:\Program Files\Java\jdk1.7.0_67    window --> preferences -->     Java --> In ...

  7. Andriod布局

    布局[ViewGroup]   像素单位的变化:是用dip,而不是px,主要用于宽高的设置 在Android中支持的描述大小区域的类型有以下几种. px(pixels)——像素:不同的设备显示效果相同 ...

  8. 【数据库】E-R模型

    E-R模型 实体:客观存在并可相互区别的事物称为实体.可以是具体的人.事.物或抽象的概念. 属性:实体所具有的某一特性称为属性.一个实体可以由若干个属性来刻画. 联系:现实世界中事物内部以及事物之间的 ...

  9. (28)C#委托,匿名函数,lambda表达式,事件

    一.委托 委托是一种用于封装命名和匿名方法的引用类型. 把方法当参数,传给另一个方法(这么说好理解,但实际上方法不能当参数,传入的是委托类型),委托是一种引用类型,委托里包含很多方法的引用 创建的方法 ...

  10. hadoop之深入浅出

    分布式文件系统与HDFS lHDFS体系结构与基本概念*** l数据量越来越多,在一个操作系统管辖的范围存不下了,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,因此迫切需要一种系统来管 ...