业务场景
单点登录服务器如果压力过大的情况,那么可以使用集群分担压力,但是cas 默认不支持session同步。
所以可以需要做session同步,可以使用j2cache 实现session同步。另外在登录后,cas服务器保存了客户端
对应的ticketId,因此也需要将ticket实现同步。
实现方法
1.准备jar包
将这些包copy 到cas的 WEB-INF/lib目录下
2.编辑CAS web.xml 文件
在web.xml 的
encoding-filter /*
后面添加
j2cache-session-filter net.oschina.j2cache.session.J2CacheSessionFilter session.maxSizeInMemory 2000 session.maxAge 1800 cookie.name J2CACHE_SESSION_ID cookie.path / cookie.domain redis.mode single redis.hosts 192.168.31.100:6379 redis.channel j2cache redis.cluster_name j2cache redis.timeout 2000 redis.password redis.database 0 redis.maxTotal 100 redis.maxIdle 10 redis.minIdle 10 j2cache-session-filter /*
redis 可以做相应配置。
3.ticket同步实现
cas 服务器默认使用本地缓存来管理ticket,当使用集群实现时就会出现这样的情况。
比如用户在CAS A登录,那么客户端就会获取到一个ST 票据,然后在验证这个票据去CAS服务器验证,
如果这个时候请求发送到CAS B那么这个时候就会报错,说找不到ST,这个时候就需要做到ST票据在不同服务器上同步。
我们可以看到cas 配置文件ticketRegistry.xml。
他的默认配置为:
我们可以看到这个 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中注册。
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同步。