博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CAS 集群部署
阅读量:7164 次
发布时间:2019-06-29

本文共 3650 字,大约阅读时间需要 12 分钟。

业务场景

单点登录服务器如果压力过大的情况,那么可以使用集群分担压力,但是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同步。

 

转载于:https://www.cnblogs.com/yg_zhang/p/11028014.html

你可能感兴趣的文章