业务场景

单点登录服务器如果压力过大的情况,那么可以使用集群分担压力,但是cas 默认不支持session同步。

所以可以需要做session同步,可以使用j2cache 实现session同步。另外在登录后,cas服务器保存了客户端

对应的ticketId,因此也需要将ticket实现同步。

实现方法

1.准备jar包

将这些包copy 到cas的 WEB-INF/lib目录下

2.编辑CAS web.xml 文件

在web.xml 的

<filter-mapping>
<filter-name>encoding-filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

后面添加

 <filter>
<filter-name>j2cache-session-filter</filter-name>
<filter-class>net.oschina.j2cache.session.J2CacheSessionFilter</filter-class>
<init-param><!-- 内存中存放会话数 -->
<param-name>session.maxSizeInMemory</param-name>
<param-value>2000</param-value>
</init-param>
<init-param><!-- 会话有效期,单位:秒钟 -->
<param-name>session.maxAge</param-name>
<param-value>1800</param-value>
</init-param>
<!-- cookie configuration -->
<init-param>
<param-name>cookie.name</param-name>
<param-value>J2CACHE_SESSION_ID</param-value>
</init-param>
<init-param>
<param-name>cookie.path</param-name>
<param-value>/</param-value>
</init-param>
<init-param>
<param-name>cookie.domain</param-name>
<param-value></param-value>
</init-param> <init-param>
<param-name>redis.mode</param-name>
<param-value>single</param-value>
</init-param>
<init-param>
<param-name>redis.hosts</param-name>
<param-value>192.168.31.100:6379</param-value>
</init-param>
<init-param>
<param-name>redis.channel</param-name>
<param-value>j2cache</param-value>
</init-param>
<init-param>
<param-name>redis.cluster_name</param-name>
<param-value>j2cache</param-value>
</init-param>
<init-param>
<param-name>redis.timeout</param-name>
<param-value>2000</param-value>
</init-param>
<init-param>
<param-name>redis.password</param-name>
<param-value></param-value>
</init-param>
<init-param>
<param-name>redis.database</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>redis.maxTotal</param-name>
<param-value>100</param-value>
</init-param>
<init-param>
<param-name>redis.maxIdle</param-name>
<param-value>10</param-value>
</init-param>
<init-param>
<param-name>redis.minIdle</param-name>
<param-value>10</param-value>
</init-param>
</filter> <filter-mapping>
<filter-name>j2cache-session-filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

redis 可以做相应配置。

3.ticket同步实现

cas 服务器默认使用本地缓存来管理ticket,当使用集群实现时就会出现这样的情况。

比如用户在CAS A登录,那么客户端就会获取到一个ST 票据,然后在验证这个票据去CAS服务器验证,

如果这个时候请求发送到CAS B那么这个时候就会报错,说找不到ST,这个时候就需要做到ST票据在不同服务器上同步。

我们可以看到cas 配置文件ticketRegistry.xml。

他的默认配置为:

 <bean id="ticketRegistry" class="org.jasig.cas.ticket.registry.DefaultTicketRegistry" />

    <!--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" />

我们可以看到这个 DefaultTicketRegistry的代码如下:

他是简单的把票据放到一个ConcurrentHashMap对象中。

所以我们需要设计一个自己的票据注册器,能够支持集群式部署。

我们可以设计一个自己的票据注册器,我们可以使用redis,或memache来实现。

public class J2CacheTicketRegistry extends AbstractDistributedTicketRegistry implements DisposableBean{

    private ICache cache;

    private  int tgtTimeout;

    private  int stTimeout;

    public void setTgtTimeout(int tgtTimeout) {
this.tgtTimeout = tgtTimeout;
}

在ticketRegistry.xml中注册。

<bean id="ticketRegistry" class="com.redxun.cas.J2CacheTicketRegistry">
<property name="cache" ref="iCache"></property>
<property name="tgtTimeout" value="28800"></property>
<property name="stTimeout" value="28800"></property>
</bean>
<bean id="iCache" class="com.redxun.cas.J2CacheImpl" init-method="init" destroy-method="destroy"></bean>

4.NGINX配置

upstream linuxidc {
server 192.168.31.77:8082;
server 192.168.31.77:8081; }

添加cas配置

location /cas {
proxy_pass http://linuxidc/cas;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
}

这样就实现了cas session同步。

CAS 集群部署的更多相关文章

  1. CAS 集群部署session共享配置

    背景 前段时间,项目计划搞独立的登录鉴权中心,由于单独开发一套稳定的登录.鉴权代码,工作量大,最终的方案是对开源鉴权中心CAS(Central Authentication Service)作适配修改 ...

  2. Quartz.net持久化与集群部署开发详解

    序言 我前边有几篇文章有介绍过quartz的基本使用语法与类库.但是他的执行计划都是被写在本地的xml文件中.无法做集群部署,我让它看起来脆弱不堪,那是我的罪过. 但是quart.net是经过许多大项 ...

  3. Openfire 集群部署和负载均衡方案

    Openfire 集群部署和负载均衡方案 一.   概述 Openfire是在即时通讯中广泛使用的XMPP协议通讯服务器,本方案采用Openfire的Hazelcast插件进行集群部署,采用Hapro ...

  4. 基于Tomcat的Solr3.5集群部署

    基于Tomcat的Solr3.5集群部署 一.准备工作 1.1 保证SOLR库文件版本相同 保证SOLR的lib文件版本,slf4j-log4j12-1.6.1.jar slf4j-jdk14-1.6 ...

  5. jstorm集群部署

    jstorm集群部署下载 Install JStorm Take jstorm-0.9.6.zip as an example unzip jstorm-0.9.6.1.zip vi ~/.bashr ...

  6. Windows下ELK环境搭建(单机多节点集群部署)

    1.背景 日志主要包括系统日志.应用程序日志和安全日志.系统运维和开发人员可以通过日志了解服务器软硬件信息.检查配置过程中的错误及错误发生的原因.经常分析日志可以了解服务器的负荷,性能安全性,从而及时 ...

  7. 理解 OpenStack + Ceph (1):Ceph + OpenStack 集群部署和配置

    本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...

  8. HBase集成Zookeeper集群部署

    大数据集群为了保证故障转移,一般通过zookeeper来整体协调管理,当节点数大于等于6个时推荐使用,接下来描述一下Hbase集群部署在zookeeper上的过程: 安装Hbase之前首先系统应该做通 ...

  9. SolrCloud-5.2.1 集群部署及测试

    一. 说明 Solr5内置了Jetty服务,所以不用安装部署到Tomcat了,网上部署Tomcat的资料太泛滥了. 部署前的准备工作: 1. 将各主机IP配置为静态IP(保证各主机可以正常通信,为避免 ...

随机推荐

  1. js replace方法第二个参数,远不止你想的那么强大

    js replace() 方法,想必大家都不陌生. 定义和用法: replace()方法用于在字符串中用一些字符替换另一些字符,或者替换一个与正则表达式匹配的子串. stringObject.repl ...

  2. Excel-数据透视表

    例如: 购买数量采用求和的方式 用户数ID数据采用计数的方式 一.数据透视表的结构 二.数据透视表的步骤 1.订单表 提出问题,理解数据,数据清晰,构建模型,数据可视化 问题1:每个客户的订单量? 问 ...

  3. 记一次排错经历,requests和fake_useragent

    在部署tornado项目上线时, 首次重启服务后第一次请求必然会报错, 后续的就能正常访问, 长报错urllib.error.URLError,如图排查多次依然发现不了问题 报的最多的依然是上图中的错 ...

  4. Spring Boot 2.2.0,性能提升+支持Java13

    随着 Spring Framework 5.2.0 成功发布之后,Spring Boot 2.2 也紧跟其后,发布了第一个版本:2.2.0.下面就来一起来看看这个版本都更新了些什么值得我们关注的内容. ...

  5. appium--Toast元素识别

    前戏 Android中的Toast是一种简易的消息提示框,当视图显示给用户,在应用程序中显示为浮动,和Dialog不一样的是,它永远不会获得焦点,无法被点击 Toast类的思想就是尽可能不引人注意,同 ...

  6. JS判断是否是ioS或者Android

    每个客户端都带有自身的UA标识,通过JavaScript,可以获取客户端标识,我们可以获取浏览器的userAgent,用正则来判断手机是ios(苹果)还是Android(安卓)客户端. 项目实例:ht ...

  7. CentOS7 Hadoop 安装(完全分布式)

    一.hadoop集群安装模式   单机模式 直接解压,无需任何配置.主要用于测试代码.没有分布式文件系统.   伪分布式 完全分布式的一种形式,只是所有的进程都配置要一个节点上.有分布式文件系统,只不 ...

  8. WCF服务支持HTTP(get,post)

    WCF服务支持HTTP(get,post)方式请求例子   方式一: /// <summary> /// Http Get请求 /// </summary> /// <p ...

  9. Unity Shader 2D水流效果

    水流的模拟主要运用了顶点变换和纹理动画的结合: 顶点变换中,利用正弦函数模拟河流的大致形态,例如波长,振幅等. 纹理动画中,将纹理坐标朝某一方向持续滚动以形成流动的效果. 脚本如下: Shader & ...

  10. [数据分析]利用pandasticsearch批量读取ES

    1.git地址 https://github.com/onesuper/pandasticsearch 2.建立连接 from pandasticsearch import DataFrame use ...