前言

最近,部门要求为原有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。代码如下:

package org.jasig.cas.ticket;import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Collection;  import org.jasig.cas.ticket.Ticket;
import org.jasig.cas.ticket.TicketGrantingTicket;
import org.jasig.cas.ticket.registry.AbstractDistributedTicketRegistry;  import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;  /** * 使用Redis存储Ticket * @author xyong*/
public class RedisTicketRegistry extends AbstractDistributedTicketRegistry
{  private static int redisDatabaseNum;  private static String hosts;  private static int port;  private static int connTimeout;  //private static String redisPassword;  /** * ST最大空闲时间 */  private static int st_time;  /** * TGT最大空闲时间 */  private static int tgt_time;  private static JedisPool cachePool;  static  {  //redisDatabaseNum = SysPropertiesUtil.getPropertyInt("redis_database_num");  redisDatabaseNum = 7;   //选择存储的redis数据库,redis默认有15个数据库。我的幸运数字是7,所以我选用第七个数据库。//hosts = SysPropertiesUtil.getProperty("redis_hosts");  hosts = "10.4.123.100";//port = SysPropertiesUtil.getPropertyInt("redis_port");  port = 6379;//connTimeout = SysPropertiesUtil.getPropertyInt("redis_conn_timeout");  //redisPassword = SysPropertiesUtil.getProperty("redis_password");  //st_time = SysPropertiesUtil.getPropertyInt("st_time");  st_time = 10000;        //10秒//tgt_time = SysPropertiesUtil.getPropertyInt("tgt_time");  tgt_time = 7200000;     //7200秒,2个小时JedisPoolConfig config = new JedisPoolConfig();config.setMaxTotal(1000);//config.setTestOnBorrow(true);cachePool = new JedisPool(config, hosts, port);  }  @Override  public void addTicket(Ticket ticket)  {  Jedis jedis = cachePool.getResource();  jedis.select(redisDatabaseNum);  int seconds = 0;  String key = ticket.getId();  if (ticket instanceof TicketGrantingTicket)  {  seconds = tgt_time / 1000;  }  else  {  seconds = st_time / 1000;  }  ByteArrayOutputStream bos = new ByteArrayOutputStream();  ObjectOutputStream oos = null;  try  {  oos = new ObjectOutputStream(bos);  oos.writeObject(ticket);  }  catch (Exception e)  {  logger.error("adding ticket to redis error.");  }  finally  {  try  {  if (null != oos)  oos.close();  }  catch (Exception e)  {  logger.error("oos closing error when adding ticket to redis.");  }  }  jedis.set(key.getBytes(), bos.toByteArray());  jedis.expire(key.getBytes(), seconds);  //设置redis失效时间jedis.close();  }  @Override  public boolean deleteTicket(String ticketId)  {  if (ticketId == null)  {  return false;  }  Jedis jedis = cachePool.getResource();  jedis.select(redisDatabaseNum);  jedis.del(ticketId.getBytes());  jedis.close();  return true;  }  @Override  public Ticket getTicket(String ticketId)  {  return getProxiedTicketInstance(getRawTicket(ticketId));  }  private Ticket getRawTicket(final String ticketId)  {  if (null == ticketId)  {  return null;  }  Jedis jedis = cachePool.getResource();  jedis.select(redisDatabaseNum);  Ticket ticket = null;  byte[] bytes = jedis.get(ticketId.getBytes());  if (bytes == null || bytes.length < 1)  {  return null;  }  ByteArrayInputStream bais = new ByteArrayInputStream(bytes);  ObjectInputStream ois = null;  try  {  ois = new ObjectInputStream(bais);  ticket = (Ticket) ois.readObject();  }  catch (Exception e)  {  e.printStackTrace();  logger.error("getting ticket to redis error.");  }  finally  {  try  {  if (null != ois)  {  ois.close();  }  }  catch (Exception e)  {  e.printStackTrace();  logger.error("ois closing error when getting ticket to redis.");  }  }  jedis.close();  return ticket;  }  @Override  public Collection<Ticket> getTickets()  {  throw new UnsupportedOperationException("GetTickets not supported.");    }  @Override  protected boolean needsCallback()  {  return false;  }  @Override  protected void updateTicket(Ticket ticket)  {  this.addTicket(ticket);    }  }

找到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内容如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!--Licensed to Jasig under one or more contributor licenseagreements. See the NOTICE file distributed with this workfor additional information regarding copyright ownership.Jasig licenses this file to you under the Apache License,Version 2.0 (the "License"); you may not use this fileexcept in compliance with the License.  You may obtain acopy of the License at the following location:http://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing,software distributed under the License is distributed on an"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANYKIND, either express or implied.  See the License for thespecific language governing permissions and limitationsunder the License.-->
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><description>Configuration for the default TicketRegistry which stores the tickets in-memory and cleans them out as specified intervals.</description><!-- Ticket Registry --><!-- <bean id="ticketRegistry" class="org.jasig.cas.ticket.registry.DefaultTicketRegistry" /> --><bean id="ticketRegistry" class="org.jasig.cas.ticket.RedisTicketRegistry" /><!--Quartz --><!-- TICKET REGISTRY CLEANER --><!-- <bean id="ticketRegistryCleaner" class="org.jasig.cas.ticket.registry.support.DefaultTicketRegistryCleaner"p:ticketRegistry-ref="ticketRegistry"p:logoutManager-ref="logoutManager" /><bean id="jobDetailTicketRegistryCleaner" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"p:targetObject-ref="ticketRegistryCleaner"p:targetMethod="clean" /><bean id="triggerJobDetailTicketRegistryCleaner" class="org.springframework.scheduling.quartz.SimpleTriggerBean"p:jobDetail-ref="jobDetailTicketRegistryCleaner"p:startDelay="20000"p:repeatInterval="5000000" /> --></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工具类

CAS4.0.0链接Redis4.0.6相关推荐

  1. Redis4.0 Cluster — Centos7

    本文版权归博客园和作者吴双本人共同所有 转载和爬虫请注明原文地址 www.cnblogs.com/tdws 一.基础安装 wget http://download.redis.io/releases/ ...

  2. redis-4.0.11主从配置初步探究

    redis-4.0.11相较于以前版本,新增了几个安全措施,稍稍研究了6379.conf配置文件,在这里记录一下. 实验环境: centos7.4 redis:redis-4.0.11 1. redi ...

  3. centos redis验证_centos7下安装redis-4.0.2

    本篇文章主要介绍在centos7 环境下安装redis-4.0.2. 下载redis安装包 wget http://download.redis.io/releases/redis-4.0.2.tar ...

  4. redis-4.0.10集群安装(3台机器,6个node),以及在Spring项目中的集成,redis操作工具类

    1 Redis安装 redis高可用的三种常见的集群方式:redis sentinel .redis cluster(多主机+分布式).redis sharding.接下来主要介绍redis sent ...

  5. CentOS7.X安装Redis-4.0.8以及Redis集群搭建

    安装redis 安装前的准备 yum install \ vim \ wget \ make \ gcc \ gcc-c++ \ automake \ autoconf \ -y \ 下载解压并安装 ...

  6. Redis4.0、5.0、6.0、7.0特性整理(持续更新)

    最近研究研究新版本redis的新特性,网上查了查资料,这里记录一下. 0. Redis的版本迭代和里程碑 Redis从发布至今,已经有十余年的时光了,一直遵循着自己的命名规则: 版本号第二位如果是奇数 ...

  7. 【Redis】Redis4.0、5.0、6.0版本特性整理

    文章目录 Redis版本特性 Redis 4 模块系统 PSYNC 2.0 缓存驱逐策略优化 Lazy Free 交换数据库 混合持久化 内存命令 兼容 NAT 和 Docker Active Def ...

  8. linux 安装redis4.0.6,Redis(4.0.6)在Linux(CentOS7)下的安装

    构建 Redis redis 目前没有官方 RPM 安装包,需要从源代码编译,编译需要安装 Make 和 GCC. yum install gcc make 从官网下载 tar 压缩包. curl h ...

  9. redis4.0.6集群部署(5.0.2版本更新补充)

    Redis集群安装 4版本需要ruby    5版本不需要ruby就能集群 1集群机器分布 192.168.1.133        redis1 192.168.1.134        redis ...

  10. redis-4.0.1安装配置(CentOS 6.6)

    一.redis服务安装配置 1.        下载解压redis软件包 # wget http://download.redis.io/releases/redis-4.0.1.tar.gz # t ...

最新文章

  1. C#中判断空字符串的3种方法性能分析【月儿原创】
  2. Python time和datatime模块
  3. linux 下如何升级CMAKE?(安装指定版本cmake)(高版本cmake)(不删除之前的,可以用软连接)
  4. element 表单回显验证_关于vue el-form表单报错的问题
  5. SQL Server 数据库原理与应用
  6. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_10-修改页面-前端-修改页面...
  7. java BorderLatout_浅谈java的BorderLayout的使用
  8. 持续交付2.0 pdf_便捷下载发布v7.2.0版本更新
  9. 【常见c语言笔试题嵌入式软件开发1】
  10. 阿里巴巴Java开发手册(详尽PDF版).
  11. 新员工入职表_员工离职率过高,只要三步骤,就能轻松有效控制
  12. 【领英如何一键批量有效地加好友?】
  13. Flash XSS 漏洞实例
  14. amd显卡风扇调节_AMD Crimson驱动会烧毁显卡?其实是因为风扇锁定低转速了
  15. layim之刷新群聊列表
  16. [我也GitHub]我很焦虑, 我很暴躁!
  17. [python]微信公众号JS逆向
  18. linux的网络管理,Linux之网络管理
  19. HLS第三十八课(xfopencv,H文件和HPP文件的使用)
  20. WPS英文和数字会默认为中文字体原因

热门文章

  1. 人工智能深度学习数据集
  2. Android系统工程模式启动过程详解
  3. 【Redis总结-基础入门】
  4. 第二届上汽零束SOA平台开发者大会揭幕,智能汽车生态加速落地
  5. 古剑奇谭ol服务器位置,古剑奇谭ol新手大型入门图文攻略
  6. 场地测量的方法和程序_场地平整测量
  7. VS2010 正式版 破解方法详解
  8. TIA博途WinCC如何组态设置声音报警输出?
  9. 业务系统监控解决方案
  10. 台式计算机开关电源原理图,计算机开关电源基本结构及原理介绍