当前位置:   article > 正文

CAS4.0.0链接Redis4.0.6_cas 自定义abstractdistributedticketregistry

cas 自定义abstractdistributedticketregistry

前言

    最近,部门要求为原有CAS服务配置redis,将CAS的TGT存储到Redis中,从而提高CAS服务的性能。我上网查询了许多资料,却因为创建JedisPool时出现的BUG,而纠结痛苦了好长时间。己所不欲,勿施于人,我节选了CAS配置文档中,关于链接Redis的部分,分享出来,希望能帮助大家。

2.5.1、版本信息

CAS服务器版本为4.0.0
Redis数据库版本为4.0.6

2.5.2、Redis相关的配置

    Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
    本文是基于Java语言的开发,使用Java语言调用Redis的相关服务,需要调用相关jar包——jedis-2.9.0.jar。将该jar包复制到cas服务器工程中,路径 cas/WEB-INF/lib 下。
    Redis数据库的安装略,请自行百度安装。
    建议安装一个Redis客户端——RedisDesktopManager,用来查看数据库信息。

2.5.3、CAS服务器的改造

2.5.3.1、自定义CAS链接Redis类

    在myeclipse中创建Java web工程,工程名随意。将Redis的连接包jedis-2.9.0.jar 和CAS服务的cas-server-core-4.0.0.jar导入到工程中,cas-server-core-4.0.0.jar在你下载的cas-server-4.0.0-release的 .../cas-server-4.0.0/modules下。
在工程中创建名为 org.jasig.cas.ticket 的包,在该包下创建名为RedisTicketRegistry的类,在该类中定义CAS与Redis交互的方法。该类需要继承CAS自身的抽象类——AbstractDistributedTicketRegistry。代码如下:
  1. package org.jasig.cas.ticket;
  2. import java.io.ByteArrayInputStream;
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.ObjectInputStream;
  5. import java.io.ObjectOutputStream;
  6. import java.util.Collection;
  7. import org.jasig.cas.ticket.Ticket;
  8. import org.jasig.cas.ticket.TicketGrantingTicket;
  9. import org.jasig.cas.ticket.registry.AbstractDistributedTicketRegistry;
  10. import redis.clients.jedis.Jedis;
  11. import redis.clients.jedis.JedisPool;
  12. import redis.clients.jedis.JedisPoolConfig;
  13. /**
  14. * 使用Redis存储Ticket
  15. * @author xyong
  16. */
  17. public class RedisTicketRegistry extends AbstractDistributedTicketRegistry
  18. {
  19. private static int redisDatabaseNum;
  20. private static String hosts;
  21. private static int port;
  22. private static int connTimeout;
  23. //private static String redisPassword;
  24. /**
  25. * ST最大空闲时间
  26. */
  27. private static int st_time;
  28. /**
  29. * TGT最大空闲时间
  30. */
  31. private static int tgt_time;
  32. private static JedisPool cachePool;
  33. static
  34. {
  35. //redisDatabaseNum = SysPropertiesUtil.getPropertyInt("redis_database_num");
  36. redisDatabaseNum = 7; //选择存储的redis数据库,redis默认有15个数据库。我的幸运数字是7,所以我选用第七个数据库。
  37. //hosts = SysPropertiesUtil.getProperty("redis_hosts");
  38. hosts = "10.4.123.100";
  39. //port = SysPropertiesUtil.getPropertyInt("redis_port");
  40. port = 6379;
  41. //connTimeout = SysPropertiesUtil.getPropertyInt("redis_conn_timeout");
  42. //redisPassword = SysPropertiesUtil.getProperty("redis_password");
  43. //st_time = SysPropertiesUtil.getPropertyInt("st_time");
  44. st_time = 10000; //10秒
  45. //tgt_time = SysPropertiesUtil.getPropertyInt("tgt_time");
  46. tgt_time = 7200000; //7200秒,2个小时
  47. JedisPoolConfig config = new JedisPoolConfig();
  48. config.setMaxTotal(1000);
  49. //config.setTestOnBorrow(true);
  50. cachePool = new JedisPool(config, hosts, port);
  51. }
  52. @Override
  53. public void addTicket(Ticket ticket)
  54. {
  55. Jedis jedis = cachePool.getResource();
  56. jedis.select(redisDatabaseNum);
  57. int seconds = 0;
  58. String key = ticket.getId();
  59. if (ticket instanceof TicketGrantingTicket)
  60. {
  61. seconds = tgt_time / 1000;
  62. }
  63. else
  64. {
  65. seconds = st_time / 1000;
  66. }
  67. ByteArrayOutputStream bos = new ByteArrayOutputStream();
  68. ObjectOutputStream oos = null;
  69. try
  70. {
  71. oos = new ObjectOutputStream(bos);
  72. oos.writeObject(ticket);
  73. }
  74. catch (Exception e)
  75. {
  76. logger.error("adding ticket to redis error.");
  77. }
  78. finally
  79. {
  80. try
  81. {
  82. if (null != oos)
  83. oos.close();
  84. }
  85. catch (Exception e)
  86. {
  87. logger.error("oos closing error when adding ticket to redis.");
  88. }
  89. }
  90. jedis.set(key.getBytes(), bos.toByteArray());
  91. jedis.expire(key.getBytes(), seconds); //设置redis失效时间
  92. jedis.close();
  93. }
  94. @Override
  95. public boolean deleteTicket(String ticketId)
  96. {
  97. if (ticketId == null)
  98. {
  99. return false;
  100. }
  101. Jedis jedis = cachePool.getResource();
  102. jedis.select(redisDatabaseNum);
  103. jedis.del(ticketId.getBytes());
  104. jedis.close();
  105. return true;
  106. }
  107. @Override
  108. public Ticket getTicket(String ticketId)
  109. {
  110. return getProxiedTicketInstance(getRawTicket(ticketId));
  111. }
  112. private Ticket getRawTicket(final String ticketId)
  113. {
  114. if (null == ticketId)
  115. {
  116. return null;
  117. }
  118. Jedis jedis = cachePool.getResource();
  119. jedis.select(redisDatabaseNum);
  120. Ticket ticket = null;
  121. byte[] bytes = jedis.get(ticketId.getBytes());
  122. if (bytes == null || bytes.length < 1)
  123. {
  124. return null;
  125. }
  126. ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
  127. ObjectInputStream ois = null;
  128. try
  129. {
  130. ois = new ObjectInputStream(bais);
  131. ticket = (Ticket) ois.readObject();
  132. }
  133. catch (Exception e)
  134. {
  135. e.printStackTrace();
  136. logger.error("getting ticket to redis error.");
  137. }
  138. finally
  139. {
  140. try
  141. {
  142. if (null != ois)
  143. {
  144. ois.close();
  145. }
  146. }
  147. catch (Exception e)
  148. {
  149. e.printStackTrace();
  150. logger.error("ois closing error when getting ticket to redis.");
  151. }
  152. }
  153. jedis.close();
  154. return ticket;
  155. }
  156. @Override
  157. public Collection<Ticket> getTickets()
  158. {
  159. throw new UnsupportedOperationException("GetTickets not supported.");
  160. }
  161. @Override
  162. protected boolean needsCallback()
  163. {
  164. return false;
  165. }
  166. @Override
  167. protected void updateTicket(Ticket ticket)
  168. {
  169. this.addTicket(ticket);
  170. }
  171. }
    找到myeclipse  workspace中RedisTicketRegistry.class文件,该文件在workspace\CASTransform\WebRoot\WEB-INF\classes\org\jasig\cas\ticket目录下。
右键打开cas-server-core-4.0.0.jar压缩包(不要解压),再按照\org\jasig\cas\ticket\路径打开文件夹,将RedisTicketRegistry.class拖到该文件夹下,结果如图2.5.3.1所示。
 
图2.5.3.1
    关掉该窗口,用修改后的cas-server-core-4.0.0.jar覆盖CAS服务器cas/WEB-INF/lib下的原cas-server-core-4.0.0.jar包。

2.5.3.2、修改ticketRegistry.xml

    在CAS的cas/WEB-INF/spring-configuration下获取ticketRegistry.xml。打开ticketRegistry.xml,修改id为ticketRegistry的bean的路径,并注释掉ticketRegistry.xml下方的配置信息,修改后的ticketRegistry.xml内容如下所示:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!--
  3. Licensed to Jasig under one or more contributor license
  4. agreements. See the NOTICE file distributed with this work
  5. for additional information regarding copyright ownership.
  6. Jasig licenses this file to you under the Apache License,
  7. Version 2.0 (the "License"); you may not use this file
  8. except in compliance with the License. You may obtain a
  9. copy of the License at the following location:
  10. http://www.apache.org/licenses/LICENSE-2.0
  11. Unless required by applicable law or agreed to in writing,
  12. software distributed under the License is distributed on an
  13. "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  14. KIND, either express or implied. See the License for the
  15. specific language governing permissions and limitations
  16. under the License.
  17. -->
  18. <beans xmlns="http://www.springframework.org/schema/beans"
  19. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  20. xmlns:p="http://www.springframework.org/schema/p"
  21. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  22. <description>
  23. Configuration for the default TicketRegistry which stores the tickets in-memory and cleans them out as specified intervals.
  24. </description>
  25. <!-- Ticket Registry -->
  26. <!-- <bean id="ticketRegistry" class="org.jasig.cas.ticket.registry.DefaultTicketRegistry" /> -->
  27. <bean id="ticketRegistry" class="org.jasig.cas.ticket.RedisTicketRegistry" />
  28. <!--Quartz -->
  29. <!-- TICKET REGISTRY CLEANER -->
  30. <!-- <bean id="ticketRegistryCleaner" class="org.jasig.cas.ticket.registry.support.DefaultTicketRegistryCleaner"
  31. p:ticketRegistry-ref="ticketRegistry"
  32. p:logoutManager-ref="logoutManager" />
  33. <bean id="jobDetailTicketRegistryCleaner" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
  34. p:targetObject-ref="ticketRegistryCleaner"
  35. p:targetMethod="clean" />
  36. <bean id="triggerJobDetailTicketRegistryCleaner" class="org.springframework.scheduling.quartz.SimpleTriggerBean"
  37. p:jobDetail-ref="jobDetailTicketRegistryCleaner"
  38. p:startDelay="20000"
  39. p:repeatInterval="5000000" /> -->
  40. </beans>
备注:你可以直接用上面的配置信息覆盖掉你原来的ticketRegistry.xml配置信息。
    用修改后的ticketRegistry.xml覆盖掉CAS服务器中原来的ticketRegistry.xml

2.5.4、测试

    按照以上步骤完成对CAS服务器的配置,重启CAS服务器,浏览器访问CAS登录页面,进行登录操作,登录成功后打开RedisDesktopManager(2.5.2安装的Redis客户端)。发现redis第七个数据中新增了cas ticket数据,如图2.5.4.1,说明配置成功。
 
图2.5.4.1
发现了一篇关于Jedis使用的文章,讲的挺好的,大家可以看看。 RedisUtil工具类
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/538567
推荐阅读
相关标签
  

闽ICP备14008679号