由于项目需求要实现单点登出需要在网上找了N久终于实现单点登出。

使用cas-server-core-3.3.3.jar(CAS Server 3.3.3)

使用cas-client-core-3.1.3.jar(CAS Client 3.1.3)

项目结合CAS SpringSecurity SSH

普通项目(没有结合Spring Security)的可以在web.xml中加入如下代码

[xhtml] view plaincopy

 
  1. <filter>
  2. <filter-name>CAS Single Sign Out Filter</filter-name>
  3. <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>CAS Single Sign Out Filter</filter-name>
  7. <url-pattern>/*</url-pattern>
  8. </filter-mapping>
  9. <listener>
  10. <listener-class>
  11. org.jasig.cas.client.session.SingleSignOutHttpSessionListener
  12. </listener-class>
  13. </listener>

在我们的项目中由于结合了SpringSecurity 可以将filter加入到spring Security过滤链中,也可以直接向上面的一样加入web.xml中

首先在web.xml中加入监听器。

[xhtml] view plaincopy

 
  1. <!-- single sign out -->
  2. <listener>
  3. <listener-class>
  4. org.jasig.cas.client.session.SingleSignOutHttpSessionListener
  5. </listener-class>
  6. </listener>
  7. <!-- single sign out -->

然后把filter加入到spring Security过滤链中

[xhtml] view plaincopy

 
  1. <!-- single sign out -->
  2. <b:bean id="casSingleSignOutFilter" class="check.SingleSignOutFilter">
  3. <custom-filter before="CAS_PROCESSING_FILTER"/>
  4. </b:bean>
  5. <!-- single sign out -->

注意上面的class="check.SingleSignOutFilter"是我自定义的filter(由于CAS3.1.3定义的SingleSignOutFilter在某种意思上没有起到作用)详情请见http://www.javaeye.com/topic/546785

自己定义一个类

[java] view plaincopy

 
  1. package check;
  2. import java.io.IOException;
  3. import java.util.Enumeration;
  4. import javax.servlet.FilterChain;
  5. import javax.servlet.FilterConfig;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.ServletRequest;
  8. import javax.servlet.ServletResponse;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpSession;
  11. import org.apache.commons.logging.Log;
  12. import org.apache.commons.logging.LogFactory;
  13. import org.jasig.cas.client.session.HashMapBackedSessionMappingStorage;
  14. import org.jasig.cas.client.session.SessionMappingStorage;
  15. import org.jasig.cas.client.util.AbstractConfigurationFilter;
  16. import org.jasig.cas.client.util.CommonUtils;
  17. import org.jasig.cas.client.util.XmlUtils;
  18. public final class SingleSignOutFilter extends AbstractConfigurationFilter
  19. {
  20. private String artifactParameterName;
  21. private static SessionMappingStorage SESSION_MAPPING_STORAGE = new HashMapBackedSessionMappingStorage();
  22. private static Log log = LogFactory.getLog(SingleSignOutFilter.class);
  23. public SingleSignOutFilter()
  24. {
  25. this.artifactParameterName = "ticket";
  26. }
  27. public void init(FilterConfig filterConfig)
  28. throws ServletException
  29. {
  30. setArtifactParameterName(getPropertyFromInitParams(filterConfig, "artifactParameterName", "ticket"));
  31. init();
  32. }
  33. public void init() {
  34. CommonUtils.assertNotNull(this.artifactParameterName, "artifactParameterName cannot be null.");
  35. CommonUtils.assertNotNull(SESSION_MAPPING_STORAGE, "sessionMappingStorage cannote be null.");
  36. }
  37. public void setArtifactParameterName(String artifactParameterName) {
  38. this.artifactParameterName = artifactParameterName;
  39. }
  40. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  41. final HttpServletRequest request = (HttpServletRequest) servletRequest;
  42. final String logoutRequest = CommonUtils.safeGetParameter(request, "logoutRequest");
  43. Enumeration ff = request.getParameterNames();
  44. String a = request.getQueryString();
  45. if (CommonUtils.isNotBlank(logoutRequest)) {
  46. final String sessionIdentifier = XmlUtils.getTextForElement(logoutRequest, "SessionIndex");
  47. if (CommonUtils.isNotBlank(sessionIdentifier)) {
  48. final HttpSession session = SESSION_MAPPING_STORAGE.removeSessionByMappingId(sessionIdentifier);
  49. if (session != null) {
  50. String sessionID = session.getId();
  51. try {
  52. session.invalidate();
  53. } catch (final IllegalStateException e) {
  54. }
  55. }
  56. }
  57. }
  58. else{
  59. final String artifact = CommonUtils.safeGetParameter(request, this.artifactParameterName);
  60. final HttpSession session = request.getSession(false);
  61. if (CommonUtils.isNotBlank(artifact) && session!=null) {
  62. try {
  63. SESSION_MAPPING_STORAGE.removeBySessionById(session.getId());
  64. } catch (final Exception e) {
  65. }
  66. SESSION_MAPPING_STORAGE.addSessionById(artifact, session);
  67. }
  68. }
  69. filterChain.doFilter(servletRequest, servletResponse);
  70. }
  71. public void setSessionMappingStorage(SessionMappingStorage storage) {
  72. SESSION_MAPPING_STORAGE = storage;
  73. }
  74. public static SessionMappingStorage getSessionMappingStorage() {
  75. return SESSION_MAPPING_STORAGE;
  76. }
  77. public void destroy()
  78. {
  79. }
  80. }

完成。

这样即可实现单点登出。(所有java应用的单点退出)

1)这样实现的效果是在登出的时候CAS Server 分发给各个客户端让各个客户端都登出,这个得让FIlter来获取,例子:一个index页面有两个链接一个指向java应用,一个指向php应用在 java应用加filter 后能做出相应的动作退出动作,而对于php自己没加任何filter就没有退出。所以也得写个filter。

2)由于我们点击退出的时候请求CAS Server 而后Server分发任务让每个应用退出的消息,java程序通过filter来执行退出。PHP提供了一个phpCAS::handleLogoutRequests()来检验服务器发来的信息,

具体我们可以把这个代码放在phpbb3/include/function.php中的点击事件里面代码如下:

[php] view plaincopy

 
  1. if(!$admin && CAS_ENABLE){
  2. // initialize phpCAS
  3. phpCAS::client(CAS_VERSION_2_0, CAS_SERVER_HOSTNAME, CAS_SERVER_PORT, CAS_SERVER_APP_NAME);
  4. phpCAS::setNoCasServerValidation();
  5. // force CAS authentication
  6. phpCAS::handleLogoutRequests();//加的去看看有没有服务器端发出注销消息。
  7. phpCAS::forceAuthentication();

原文出自:http://blog.csdn.net/lishuangzhe7047/article/details/38587151

cas单点登出的更多相关文章

  1. CAS学习笔记四:CAS单点登出流程

    CAS 的登出包含两种情况,一种是CAS客户端登出,另一种是CAS单点登出,使用流程图说明这两者的不同.(一图胜千言) 总结自官方文档 CAS客户端登出流程 如图,客户端的登出仅仅是过期当前用户与客户 ...

  2. CAS学习笔记五:SpringBoot自动/手动配置方式集成CAS单点登出

    本文目标 基于SpringBoot + Maven 分别使用自动配置与手动配置过滤器方式实现CAS客户端登出及单点登出. 本文基于<CAS学习笔记三:SpringBoot自动/手动配置方式集成C ...

  3. CAS单点登出的原理

    单点登出功能跟单点登录功能是相对应的,旨在通过Cas Server的登出使所有的Cas Client都登出. Cas Server的登出是通过请求“/logout”发生的,即如果你的Cas Serve ...

  4. 源代码解读Cas实现单点登出(single sign out)功能实现原理

    关于Cas实现单点登入(single sing on)功能的文章在网上介绍的比较多,想必大家多多少少都已经有所了解,在此就不再做具体介绍.如果不清楚的,那只能等我把single sign on这块整理 ...

  5. 源代码解读Cas实现单点登出(single sign out)功能实现原理--转

    关于Cas实现单点登入(single sing on)功能的文章在网上介绍的比较多,想必大家多多少少都已经有所了解,在此就不再做具体介绍.如果不清楚的,那只能等我把single sign on这块整理 ...

  6. 单点登录CAS使用记(六):单点登出、单点注销

    单点登出基本上没有啥配置 直接在原来logout的时候,重定向到Cas-Server的logout方法 @RequestSecurity @RequestMapping(value = "l ...

  7. Cas(08)——单点登出

    单点登出 目录 1.1     Cas Client端配置单点登出 1.2     Cas Server端禁用单点登出 1.1     Cas Client端配置单点登出 单点登出功能跟单点登录功能是 ...

  8. springmvc shiro整合cas单点登入

    shiro cas分为登入跟登出 maven依赖: <dependency> <groupId>org.apache.shiro</groupId> <art ...

  9. jfinal集成cas单点认证实践

    本示例jfinal集成cas单点认证,采用获取到登录用户session信息后,在本地站点备份一份session信息,主要做以下几个步骤: 1.站点引入响应jar包: 2.在web.xml中配置对应过滤 ...

随机推荐

  1. SQLserver通过链接服务器连接oracle

    在SQLserver中一直使用的是DTS抽取数据,但是DTS微软只支持到2008,到了2012后就没有这个工具了,现在需要在SQLserver跟Oracle中间建立一个通道,借助这个通道,将Oracl ...

  2. ASP.NET MVC +EasyUI 权限设计(四)角色动作

    请注明转载地址:http://www.cnblogs.com/arhat 由于最近的事情比较多,一直忙于工作和照顾老婆,所以老魏更新的速度慢了,本来写文章就要占据工作和生活很多的时间,这也就是院子中很 ...

  3. Madwifi Mad coding:自底向上分析associated_sta的更新过程 —— RSSI和MACADDR等信息获取的底层原理

    Madwifi驱动工作在AP模式下时,可以在/proc/net/madwifi/ath0/associated_sta文件中得到所有接入的用户的MAC地址.实时平均RSSI,和last_rx三个信息. ...

  4. win7安装mysql

    转:http://blog.csdn.net/longyuhome/article/details/7913375 Win7系统安装MySQL5.5.21图解 大家都知道MySQL是一款中.小型关系型 ...

  5. HDU 5637 Transform 单源最短路

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5637 题意: http://bestcoder.hdu.edu.cn/contests/contes ...

  6. 【HDOJ】【4405】Aeroplane chess飞行棋

    概率DP/数学期望 kuangbin总结中的第4题 啊还是求期望嘛……(话说Aeroplane chess这个翻译怎么有种chinglish的赶脚……) 好像有点感觉了…… 首先不考虑直飞的情况: f ...

  7. action间传多个参数时注意问题

    通常我们action之间传参可以有多种形式,举例说明:示例1: <result name="test" type="redirect-action"> ...

  8. Java多线程——<四>让线程有返回值

    一.概述 到目前为止,我们已经能够声明并使一个线程任务运行起来了.但是遇到一个问题:现在定义的任务都没有任何返回值,那么加入我们希望一个任务运行结束后告诉我一个结果,该结果表名任务执行成功或失败,此时 ...

  9. centos6.5安装vmware-tools

    一.问题描述 为什么使用vmware-tools:传文件方便,可以从主机中直接拖拽文件到centos中(但实际上我们可以用:WinSCP):鼠标切换方便,鼠标指到什么地方,表名当前正在操作哪个环境(但 ...

  10. fedora下缺少autopoint包的解决办法

    编译过程中,报错,缺少autopoint包 然而无论是yum install autopoint 还是yum search autopoint都没有理想的答案 执行yum install gettex ...