1、cas ticket统一存储

  做cas集群首先需要将ticket拿出来,做统一存储,以便每个节点访问到的数据一致。官方提供基于memcached的方案,由于项目需要,需要做计入redis,根据官方例子改了一个基于redis版本的。

  1. public class RedisTicketRegistry extends AbstractDistributedTicketRegistry{
  2. @NotNull
  3. private final RedisTemplate<String,Object> reidsTemplate;
  4.  
  5. /**
  6. * TGT cache entry timeout in seconds.
  7. */
  8. @Min(0)
  9. private final int tgtTimeout;
  10.  
  11. /**
  12. * ST cache entry timeout in seconds.
  13. */
  14. @Min(0)
  15. private final int stTimeout;
  16.  
  17. public RedisTicketRegistry(RedisTemplate<String,Object> reidsTemplate,int tgtTimeout,int stTimeout){
  18. this.reidsTemplate=reidsTemplate;
  19. this.tgtTimeout=tgtTimeout;
  20. this.stTimeout=stTimeout;
  21. }
  22. @Override
  23. public void addTicket(Ticket ticket) {
  24. logger.debug("Adding ticket {}", ticket);
  25. try {
  26. reidsTemplate.opsForValue().set(ticket.getId(),ticket, getTimeout(ticket), TimeUnit.SECONDS);
  27. } catch (final Exception e) {
  28. logger.error("Failed adding {}", ticket, e);
  29. }
  30. }
  31.  
  32. @Override
  33. public Ticket getTicket(String ticketId) {
  34. try {
  35. final Ticket t = (Ticket) this.reidsTemplate.opsForValue().get(ticketId);
  36. if (t != null) {
  37. return getProxiedTicketInstance(t);
  38. }
  39. } catch (final Exception e) {
  40. logger.error("Failed fetching {} ", ticketId, e);
  41. }
  42. return null;
  43. }
  44.  
  45. @Override
  46. public boolean deleteTicket(String ticketId) {
  47. logger.debug("Deleting ticket {}", ticketId);
  48. try {
  49. this.reidsTemplate.delete(ticketId);
  50. return true;
  51. } catch (final Exception e) {
  52. logger.error("Failed deleting {}", ticketId, e);
  53. }
  54. return false;
  55. }
  56.  
  57. @Override
  58. public Collection<Ticket> getTickets() {
  59. throw new UnsupportedOperationException("GetTickets not supported.");
  60. }
  61.  
  62. @Override
  63. protected void updateTicket(Ticket ticket) {
  64. logger.debug("Updating ticket {}", ticket);
  65. try {
  66. this.reidsTemplate.delete(ticket.getId());
  67. reidsTemplate.opsForValue().set(ticket.getId(),ticket, getTimeout(ticket), TimeUnit.SECONDS);
  68. } catch (final Exception e) {
  69. logger.error("Failed updating {}", ticket, e);
  70. }
  71. }
  72.  
  73. @Override
  74. protected boolean needsCallback() {
  75. // TODO Auto-generated method stub
  76. return true;
  77. }
  78. private int getTimeout(final Ticket t) {
  79. if (t instanceof TicketGrantingTicket) {
  80. return this.tgtTimeout;
  81. } else if (t instanceof ServiceTicket) {
  82. return this.stTimeout;
  83. }
  84. throw new IllegalArgumentException("Invalid ticket type");
  85. }
  86. }

  对应的ticketRegistry.xml的配置如下:

  1. <bean id="ticketRegistry" class="com.test.cas.ticket.registry.RedisTicketRegistry">
  2. <constructor-arg index="0" ref="redisTemplate" />
  3. <constructor-arg index="1" value="1800" />
  4. <constructor-arg index="2" value="10" />
  5. </bean>
  6. <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
  7. <property name="maxIdle" value="200" />
  8. <property name="testOnBorrow" value="true" />
  9. </bean>
  10.  
  11. <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
  12. p:host-name="redis_server_ip" p:port="6379" p:pool-config-ref="poolConfig"/>
  13. <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"
  14. p:connection-factory-ref="connectionFactory">
  15. </bean>

  这里既然使用了redis作为ticket存储,就需要将原来的方案给注释掉:

  1. <!-- Ticket Registry
  2. <bean id="ticketRegistry" class="org.jasig.cas.ticket.registry.DefaultTicketRegistry" />
  3. -->
  4. <!--Quartz -->
  5. <!-- TICKET REGISTRY CLEANER
  6. <bean id="ticketRegistryCleaner" class="org.jasig.cas.ticket.registry.support.DefaultTicketRegistryCleaner"
  7. p:ticketRegistry-ref="ticketRegistry"
  8. p:logoutManager-ref="logoutManager" />
  9.  
  10. <bean id="jobDetailTicketRegistryCleaner" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
  11. p:targetObject-ref="ticketRegistryCleaner"
  12. p:targetMethod="clean" />
  13.  
  14. <bean id="triggerJobDetailTicketRegistryCleaner" class="org.springframework.scheduling.quartz.SimpleTriggerBean"
  15. p:jobDetail-ref="jobDetailTicketRegistryCleaner"
  16. p:startDelay="20000"
  17. p:repeatInterval="5000000" />
  18. -->

  到这里,cas的改进就OK了,下面就需要将session也做集群同步。

2、tomcat session集群同步

  这里采用开源的tomcat-redis-session-manager,git hub地址为:https://github.com/jcoleman/tomcat-redis-session-manager

  这里只使用的是jdk1.7,tomcat7,tomcat6需要重新编译好像。

  1)拷贝编译打包之后的tomcat-redis-session-manager-VERSION.jar,jedis-2.5.2.jar,commons-pool2-2.2.jar到tomcat/lib目录下

  2)修改Tomcat context.xml (or the context block of the server.xml if applicable.)

  1. <Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve"/>
  2. <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
  3. host="redis_server_name"
  4. port="6379"
  5. database="0"
  6. maxInactiveInterval="1800"/>

至此cas集群配置就可以了。

基于redis的cas集群配置的更多相关文章

  1. 基于redis的cas集群配置(转)

    1.cas ticket统一存储 做cas集群首先需要将ticket拿出来,做统一存储,以便每个节点访问到的数据一致.官方提供基于memcached的方案,由于项目需要,需要做计入redis,根据官方 ...

  2. 基于Redis的CAS集群

    单点登录(SSO)是复杂应用系统的基本需求,Yale CAS是目前常用的开源解决方案.CAS认证中心,基于其特殊作用,自然会成为整个应用系统的核心,所有应用系统的认证工作,都将请求到CAS来完成.因此 ...

  3. java:redis(redis安装配置,redis的伪集群配置)

    1.redis安装配置: .安装gcc : yum install gcc-c++ .使用FTP工具FileZilla上传redis安装包到linux根目录下(当前步骤可以替换为:在root目录下执行 ...

  4. redis:哨兵集群配置

    最少配置1主2从3哨兵 一.引言 上一篇文章我们详细的讲解了Redis的主从集群模式,其实这个集群模式配置很简单,只需要在Slave的节点上进行配置,Master主节点的配置不需要做任何更改,但是有一 ...

  5. Redis单机和集群配置(版本在5.0后)

    摘抄并用于自己后查 单机版的配置: 1. 下载redis压缩包,然后解压缩文件(tar xzf): 2. 进入解压后的redis文件目录,编译redis源文件(make,没有c环境要gcc): 3. ...

  6. HyperLedger Fabric基于zookeeper和kafka集群配置解析

    简述 在搭建HyperLedger Fabric环境的过程中,我们会用到一个configtx.yaml文件(可参考Hyperledger Fabric 1.0 从零开始(八)--Fabric多节点集群 ...

  7. CentOS7 配置 Redis Sentinel主从集群配置

    Redis Sentinel主从集群 环境.准备 slave配置 sentinel配置 测试 C#连接Redis Sentinel 1.环境.准备 单实例3台CentOS7服务器,IP地址.: 192 ...

  8. redis学习五 集群配置

    redis集群配置 0,整体概述      整体来说就是:      1,安装redis      2,配置多个redis实例      3,安装 ruby和rubygems      4,启动red ...

  9. redis 负载均衡 集群配置

    redis 官网 http://redis.io/ 中文网站 http://redis.cn/ 谷歌代码的redis项目 https://code.google.com/p/redis/ http:/ ...

随机推荐

  1. Python编码、集合set、深浅拷贝

    编码 : a.encode(' ')     windows 默认编码GBK ASCII : 最早的编码. ⾥⾯有英⽂⼤写字⺟, ⼩写字⺟, 数字, ⼀些特殊字符.没有中⽂, 8个01代码, 8个bi ...

  2. java 服务端I/O非阻塞实现05

    /** * 非阻塞IO多线线程服务端 * 当一个任务进入多线程,这个任务线程需要处理接收信息.发送信息.因而发生I/O阻塞问题 * 利用selector可以实现异步 * */ public class ...

  3. Top Page

    Top Page 由于个人的博客中涉及了几个不同的领域.今后准备设置Index页进行一番整理 : 所有其他页面都可以从这个页面遍历 Top Page

  4. easyui-tab标签

    一. 加载方式 //class 加载方式<div id="box" class="easyui-tabs" style="width:500px ...

  5. Java this与super的仇与恨

    刚开始学习面向对象的时候,看到this和super觉得this就是指当前对象,super指最近的父级对象.觉得用处不大. 后来,随着学习的深入,看别人的代码越来越多,发现this和super的使用率贼 ...

  6. uni-app 引入ecart

    https://blog.csdn.net/CherryLee_1210/article/details/83016706(copy) 1.首先在uni-app中不支持包下载所以得自己先新建一个项目, ...

  7. C# Note35: 异步操作

    .NET Framework 为异步操作提供了两种设计模式:使用 IAsyncResult 对象的异步操作与使用事件的异步操作. IAsyncResult 异步设计模式 通过名为 BeginOpera ...

  8. Python——高阶函数——map filter zip

    一.map函数 1.作用:它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回. 2.实例 def f(x): return x* ...

  9. 如何从官网下载 Google Chrome 离线安装包

    1.打开 Chrome 浏览器主页:http://www.google.cn/chrome 2.地址栏最后的网址是这样的:http://www.google.cn/chrome/browser/des ...

  10. CSS3选择器p:nth-child和p:nth-of-type之间的差异

    稍微自己理解了一下,感觉就是:nth-of-type似乎有种族歧视,界限划分很清晰.在同一个国家(父级)中的时候,nth-of-type指认自己人排名,nth-child全都算在内排名,阿T的要求真的 ...