网站建设知识
CAS 4.0 Cluster / Tomcat redis Session manager / Token(TGT)存入Redis集群 / Nginx 负载
2025-07-22 09:59  点击:1

Nginx conf:

如何Tomcat 不做SESSION共享可以开启IP_HASH.

upstream tomcat {    ##ip_hash;    server 200.10.10.67:8110;    server 200.10.10.67:8120;}

Tomcat Session 参照【1】

–注意jar版本号

CAS 相应开发配置

Pom.xml 配置:

相应的POM文件引入dependency

                    org.apachemons            commons-pool2            2.2                            redis.clients            jedis            2.8.1        

ticketRegistry.xml配置内容

index=0 是redis 集群地址
index=1 是TGT 过期时间
index=2 是TGT 过期时间

    cription>        Configuration for the default TicketRegistry which stores the tickets in-memory and cleans them out as specified intervals.    cription>                                                  

Redis 存储Token

RedisTicketRegistry.javapackage org.jasig.cas.ticket.registry;import java.util.Collection;import java.util.HashSet;import java.util.Set;import java.util.concurrent.TimeUnit;import javax.validation.constraints.Min;import org.jasig.cas.ticket.ServiceTicket;import org.jasig.cas.ticket.Ticket;import org.jasig.cas.ticket.TicketGrantingTicket;import org.jasig.cas.ticket.registry.util.RedisTools;import org.jasig.cas.ticket.registry.util.serialize.ObjectsTranscoder;import redis.clients.jedis.HostAndPort;import redis.clients.jedis.JedisCluster;public final class RedisTicketRegistry extends AbstractDistributedTicketRegistry {    private JedisCluster jedisCluster;    private RedisTools handle;    private String redisServers;        @Min(0)    private final int tgtTimeout;        @Min(0)    private final int stTimeout;    public RedisTicketRegistry(String redisServers,int tgtTimeout,int stTimeout){        logger.info("CoreRdisTicketRegistry {true} Init Redis Service : " + redisServers);        this.redisServers = redisServers;        this.tgtTimeout=tgtTimeout;        this.stTimeout=stTimeout;        Set jedisClusterNodes = new HashSet();        for (String server : redisServers.split(",")) {            jedisClusterNodes.add(new HostAndPort(server.split(":")[0], Integer                    .parseInt(server.split(":")[1])));        }        jedisCluster = new JedisCluster(jedisClusterNodes);        handle = new RedisTools(jedisCluster);        logger.info("Init Redis Service sucess!");        logger.info("---------------------------CoreRdisTicketRegistry {true} ----------------------------=" + redisServers);    }    @Override    public void addTicket(Ticket ticket) {        logger.debug("Adding ticket {}", ticket);        try {                        //序列化            ObjectsTranscoder objTranscoder =  new ObjectsTranscoder();            byte[] result1 = objTranscoder.serialize(ticket);//          Ticket userA_userA = objTranscoder.deserialize(result1);             handle.set(ticket.getId().getBytes(), result1, getTimeout(ticket));            logger.info("---------------------------CoreRdisTicketRegistry { add ticket } -----------------------------" + ticket.getId());        } catch (final Exception e) {            logger.error("Failed adding {}", ticket, e);        }    }    @Override    public Ticket getTicket(String ticketId) {         Ticket tic =null;         try {                                String defaultvalue = "";                byte[] result = this.handle.get(ticketId.getBytes(), defaultvalue.getBytes());                if ("".equals(result)) {                    return null;                }                 //序列化                ObjectsTranscoder objTranscoder =  new ObjectsTranscoder();                tic = objTranscoder.deserialize(result);                 if (tic != null) {                    logger.debug("Ticket [{}] found in registry.", ticketId);                                   }                logger.info("---------------------------CoreRdisTicketRegistry { GET ticket } -----------------------------" + ticketId);            } catch (final Exception e) {                logger.error("Failed fetching {} ", ticketId, e);            }            return tic;    }    @Override    public boolean deleteTicket(String ticketId) {         logger.debug("Deleting ticket {}", ticketId);            try {                                   this.handle.del(ticketId);                 logger.info("---------------------------CoreRdisTicketRegistry { DELETE ticket } -----------------------------" + ticketId);                 return true;            } catch (final Exception e) {                logger.error("Failed deleting {}", ticketId, e);            }            return false;    }    @Override    public Collection getTickets() {         throw new UnsupportedOperationException("GetTickets not supported.");    }    @Override    protected void updateTicket(Ticket ticket) {     logger.debug("Updating ticket {}", ticket);        try {                          this.handle.del(ticket.getId());            //序列化            ObjectsTranscoder objTranscoder =  new ObjectsTranscoder();            byte[] result1 = objTranscoder.serialize(ticket);            handle.set(ticket.getId(), result1.toString(), getTimeout(ticket));            logger.info("---------------------------CoreRdisTicketRegistry { UPDATE ticket } -----------------------------" + ticket.getId());        } catch (final Exception e) {            logger.error("Failed updating {}", ticket, e);        }    }    @Override    protected boolean needsCallback() {        // TODO Auto-generated method stub        return true;    }    private int getTimeout(final Ticket t) {        if (t instanceof TicketGrantingTicket) {            return this.tgtTimeout;        } else if (t instanceof ServiceTicket) {            return this.stTimeout;        }        throw new IllegalArgumentException("Invalid ticket type");    }}

序列化

package org.jasig.cas.ticket.registry.util.serialize;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;import org.apache.log4j.Logger;public class ObjectsTranscoder extends SerializeTranscoder {    protected static Logger logger = Logger.getLogger(SerializeTranscoder.class);        @SuppressWarnings("unchecked")      @Override      public byte[] serialize(Object value) {        if (value == null) {            throw new NullPointerException("Can't serialize null");          }          byte[] result = null;          ByteArrayOutputStream bos = null;          ObjectOutputStream os = null;          try {            bos = new ByteArrayOutputStream();            os = new ObjectOutputStream(bos);          M m = (M) value;          os.writeObject(m);            os.close();            bos.close();            result = bos.toByteArray();          } catch (IOException e) {            throw new IllegalArgumentException("Non-serializable object", e);          } finally {            close(os);            close(bos);          }          return result;        }        @SuppressWarnings("unchecked")      @Override      public M deserialize(byte[] in) {        M result = null;          ByteArrayInputStream bis = null;          ObjectInputStream is = null;          try {            if (in != null) {              bis = new ByteArrayInputStream(in);              is = new ObjectInputStream(bis);              result = (M) is.readObject();              is.close();              bis.close();            }          } catch (IOException e) {              logger.error(String.format("Caught IOException decoding %d bytes of data",                in == null ? 0 : in.length) + e);          } catch (ClassNotFoundException e) {              logger.error(String.format("Caught CNFE decoding %d bytes of data",                in == null ? 0 : in.length) + e);          } finally {            close(is);            close(bis);          }          return result;        }}

RedisTools.java

package org.jasig.cas.ticket.registry.util;import java.util.ArrayList;import java.util.List;import java.util.Map;import java.util.Set;import redis.clients.jedis.JedisCluster;import redis.clients.jedis.ScanParams;import redis.clients.jedis.ScanResult;import redis.clients.jedis.Tuple;public class RedisTools {       private JedisCluster jedisCluster;        public RedisTools(JedisCluster jedisCluster) {            super();            this.jedisCluster = jedisCluster;        }        // ----------------------- base handle -------------------------                public boolean del(String key) {            jedisCluster.del(key);            return true;        }                public boolean exist(String key) {            return jedisCluster.exists(key);        }                public boolean existsHSet(String domain, String key) {            return jedisCluster.hexists(key, domain);        }                public List> scanHSet(String key, String match) {            int cursor = 0;            ScanParams scanParams = new ScanParams();            scanParams.match(match);            ScanResult> scanResult;            List> list = new ArrayList>();            do {                scanResult = jedisCluster.hscan(key, String.valueOf(cursor));// .hscan(,                // scanParams);                list.addAll(scanResult.getResult());                cursor = Integer.parseInt(scanResult.getStringCursor());            } while (cursor > 0);            return list;        }                public List hvals(String domain) {            return jedisCluster.hvals(domain);        }                public Set hkeys(String domain) {            return jedisCluster.hkeys(domain);        }                public long lenHset(String domain) {            return jedisCluster.hlen(domain);        }                public boolean set(String key, String value, int second) {            jedisCluster.setex(key, second, value);            return true;        }                public boolean set(byte[] key, byte[] value, int second) {            jedisCluster.setex(key, second, value);            return true;        }                public boolean set(String key, String value) {            jedisCluster.set(key, value);            return true;        }                public boolean append(String key, String value) {            jedisCluster.append(key, value);            return true;        }                public String get(String key, String defaultValue) {            String value = jedisCluster.get(key);            if (null != value && !"".equals(value)) {                return value;            } else {                return defaultValue;            }        }                public byte[] get(byte[] key, byte[] defaultValue) {            byte[] value = jedisCluster.get(key);            if (null != value && !"".equals(value)) {                return value;            } else {                return defaultValue;            }        }                public boolean rename(String key, String newKey) {            jedisCluster.rename(key, newKey);            return true;        }                public long incr(String key) {            return jedisCluster.incr(key);        }                public long decr(String key) {            return jedisCluster.decr(key);        }                public void expire(String key, int seconds) {            jedisCluster.expire(key, seconds);        }        // ----------------------- hSet handle -------------------------                public boolean setHSet(String key, String domain, String value) {            jedisCluster.hset(key, domain, value);            return true;        }                public String getHSet(String domain, String key) {            return jedisCluster.hget(key, domain);        }                public Map getHGetAll(String key) {            return jedisCluster.hgetAll(key);        }                public long delHSet(String domain, String key) {            return jedisCluster.hdel(key, domain);        }                public long delHSet(String key, String... domain) {            return jedisCluster.hdel(key, domain);        }        // ----------------------- sortedSet handle -------------------------                public boolean setSortedSet(String key, long score, String value) {            jedisCluster.zadd(key, score, value);            return true;        }                public Set getSoredSet(String key, long startScore, long endScore, boolean orderByDesc) {            if (orderByDesc) {                return jedisCluster.zrevrangeByScore(key, endScore, startScore);            } else {                return jedisCluster.zrangeByScore(key, startScore, endScore);            }        }                public Set getSoredSet(String key, long startScore, long endScore, int offset, int count,                boolean orderByDesc) {            if (orderByDesc) {                return jedisCluster.zrevrangeByScore(key, endScore, startScore, offset, count);            } else {                return jedisCluster.zrangeByScore(key, startScore, endScore, offset, count);            }        }                public long countSoredSet(String key, long startScore, long endScore) {            Long count = jedisCluster.zcount(key, startScore, endScore);            return count == null ? 0L : count;        }                public long countSoredSet(String key) {            Long count = jedisCluster.zcard(key);            return count == null ? 0L : count;        }                public boolean delSortedSet(String key, String value) {            long count = jedisCluster.zrem(key, value);            return count > 0;        }                public boolean delRankSortedSet(String key, long start, long end) {            long count = jedisCluster.zremrangeByRank(key, start, end);            return count > 0;        }                public boolean delSortedSet(String key, long minScore, long maxScore) {            long count = jedisCluster.zremrangeByScore(key, minScore, maxScore);            return count > 0;        }                public Set zrevrangeWithScores(String key, int topN) {            return jedisCluster.zrevrangeWithScores(key, 0, topN);        }                public Set zrevrangeWithScores(String key, long start, long end) {            return jedisCluster.zrevrangeWithScores(key, start, end);        }        // ----------------------- List handle -------------------------                public void lpush(String key, String... value) {            jedisCluster.lpush(key, value);        }                public void rpush(String key, String... value) {            jedisCluster.rpush(key, value);        }                public long llen(String key) {            return jedisCluster.llen(key);        }                public List lrange(String key, int start, int stop) {            return jedisCluster.lrange(key, start, stop);        }                public long lrem(String key, int count, String value) {            return jedisCluster.lrem(key, count, value);        }                public void ltrim(String key, int start, int end) {            jedisCluster.ltrim(key, start, end);        }                public Long sadd(String key, String... member) {            return jedisCluster.sadd(key, member);        }                public Long srem(String key, String... member) {            return jedisCluster.srem(key, member);        }                public Set smembers(String key) {            return jedisCluster.smembers(key);        }                public boolean sismember(String key, String member) {            return jedisCluster.sismember(key, member);        }        // ----------------------- mSet handle -------------------------        public String setMSet(String key, Map hash) {            return jedisCluster.hmset(key, hash);        }}