这个问题之前就发现过,最近有几个哥们一直在问我这个怎么搞,我手上在做另一个项目,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. Codeforces Round #324 (Div. 2) B

    B. Kolya and Tanya time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  2. java equals 与 hashCode

    转:http://m.blog.csdn.net/blog/pengchua/2297547# 如果你为某个类写了equals方法,那么应该同时编写hashCode方法.如果没有提供hashcode方 ...

  3. 静态页面之间的转发与json与ajax做到动态数据

    我们见过很多使用jsp ,php,asp的动态网页技术的网站了,我们知道如果一个网站内容更新频率极低,而内容量不是十分庞大时,这样的网站(一次开发完成后不会需要较多的维护成本)的完全可以使用全部使用静 ...

  4. .NET 4.0中使用sqlite

    原文发布时间为:2011-12-10 -- 来源于本人的百度文章 [由搬家工具导入] http://www.csharpcity.com/sqlite-ado-net-c-4-0/ Getting S ...

  5. PHP开发笔记(一)

    Location of the Android sdk has not been setup in the preference. 分析与解决: 第一次安装好adt后, 选择android sdk的路 ...

  6. 关于__GNU_SOURCE 这个宏---如何开启【转】

    关于__GNU_SOURCE 这个宏 转自:http://blog.csdn.net/stevenliyong/article/details/4160181 版权声明:本文为博主原创文章,未经博主允 ...

  7. List<?>和List<Class<?>>区别及泛型相关

    ?表示是任意类型,但是编译器不能确定他是什么类型,所以你add的时候什么参数也不能传给它Class<?>表示任意类型的Class对象,list里面可以添加任何类型的Class对象,其它的对 ...

  8. 移动web开发问题和优化小结

    之前在微信公众号上看到的一篇文章,直接给拷过来了....原文链接http://mp.weixin.qq.com/s/0LwTz-Mw2WumSztIrHucdQ 2.Meta标签 页面在手机上显示时, ...

  9. Kubernetes UI配置

    #配置,在控制节点上操作#这里的镜像在谷歌上面需要FQ下载#######################################生成windows证书,将生成的证书IE.p12导入到IE个人证 ...

  10. 【QC】安装

    QC不支持win8 1. 开启win8自带的IIS服务. 在控制面板-程序-启用或关闭Windows功能-Internet Information Service