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配置内容
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
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); }}