Cas集群中对于tgt使用redis共享的操作

来源:互联网 发布:nginx内置变量详解 编辑:程序博客网 时间:2024/06/05 10:22

继承cas官方的类AbstractDistributedTicketRegistry


package org.jasig.cas.ticket.registry;


import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Collection;


import org.jasig.cas.ticket.Ticket;
import org.jasig.cas.ticket.TicketGrantingTicket;
import org.jasig.cas.util.PropertiesUtil;


import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;


public class RedisTicketRegistry extends AbstractDistributedTicketRegistry{
    private static int redisDatabaseNum;  
    private static String hosts;  
    private static int port;  
    private static int st_time;  //ST最大空闲时间  
    private static int tgt_time; //TGT最大空闲时间  
    private static String password;
    private static int timeout;
      
    private static JedisPool cachePool;  
      
    static {  
        redisDatabaseNum =Integer.valueOf(PropertiesUtil.getProp("redis-tgt.properties", "redis_database_num"));  //指定redis索引值
        hosts =PropertiesUtil.getProp("redis-tgt.properties", "hosts");   //主机的值
        port = Integer.valueOf(PropertiesUtil.getProp("redis-tgt.properties", "port")) ;  //端口
        st_time = Integer.valueOf(PropertiesUtil.getProp("redis-tgt.properties", "st_time"));  //ST最大空闲时间 
        tgt_time =Integer.valueOf(PropertiesUtil.getProp("redis-tgt.properties", "tgt_time")); //TGT最大空闲时间  
        password =PropertiesUtil.getProp("redis-tgt.properties", "password");    //密码
        timeout=Integer.valueOf(PropertiesUtil.getProp("redis-tgt.properties", "timeout")); //超时时间
        //cachePool = new JedisPool(new JedisPoolConfig(), hosts, port);
        cachePool=new JedisPool(new JedisPoolConfig(), hosts, port, timeout, password);
    }  
    public void addTicket(Ticket ticket) {  
              
        Jedis jedis = cachePool.getResource();  
        jedis.select(redisDatabaseNum);  
          
                  int seconds = 0;  
  
                  String key = ticket.getId() ;  
          
        if(ticket instanceof TicketGrantingTicket){  
            //key = ((TicketGrantingTicket)ticket).getAuthentication().getPrincipal().getId();  
            seconds = tgt_time/1000;  
        }else{  
            seconds = st_time/1000;  
        }  
    
          
        ByteArrayOutputStream bos = new ByteArrayOutputStream();  
        ObjectOutputStream oos = null;  
        try{  
            oos = new ObjectOutputStream(bos);  
            oos.writeObject(ticket);  
             
        }catch(Exception e){  
            log.error("adding ticket to redis error.");  
        }finally{  
            try{   
                if(null!=oos) oos.close();  
            }catch(Exception e){  
                log.error("oos closing error when adding ticket to redis.");  
            }  
        }  
        jedis.set(key.getBytes(), bos.toByteArray());  
        jedis.expire(key.getBytes(), seconds);  
          
        cachePool.returnResource(jedis);  
          
    }  
      
    public Ticket getTicket(final String ticketId) {  
        return getProxiedTicketInstance(getRawTicket(ticketId));  
    }  
      
      
    private Ticket getRawTicket(final String ticketId) {  
          
        if(null == ticketId) return null;  
          
        Jedis jedis = cachePool.getResource();  
        jedis.select(redisDatabaseNum);  
          
        Ticket ticket = null;  
        byte[] bs = jedis.get(ticketId.getBytes());
        if(bs!= null){
       ByteArrayInputStream bais = new ByteArrayInputStream(jedis.get(ticketId.getBytes()));  
       ObjectInputStream ois = null;  
         
       try{  
           ois = new ObjectInputStream(bais);  
           ticket = (Ticket)ois.readObject();   
       }catch(Exception e){  
           log.error("getting ticket to redis error.");  
       }finally{  
           try{  
               if(null!=ois)  ois.close();  
           }catch(Exception e){  
               log.error("ois closing error when getting ticket to redis.");  
           }  
       }  
        }
        cachePool.returnResource(jedis);  
        return ticket;  
    }  
     
      
  
    public boolean deleteTicket(final String ticketId) {  
          
        if (ticketId == null) {  
            return false;  
        }  
        Jedis jedis = cachePool.getResource();  
        jedis.select(redisDatabaseNum);  
              
        jedis.del(ticketId.getBytes());  
          
        cachePool.returnResource(jedis);  
          
        return true;          
    }  
   
    public Collection<Ticket> getTickets() {  
          
        throw new UnsupportedOperationException("GetTickets not supported.");  
  
    }  
  
    protected boolean needsCallback() {  
        return false;  
    }  
      
    protected void updateTicket(final Ticket ticket) {  
        addTicket(ticket);  
    }  
   
}  



修改ticketRegistry.xml

注销掉红框中的东西引入改造后的票据管理


因为使用了reids的时间管理机制

这里我们将原有的配置给取消掉





下一步就是服务器间的session共享问题

0 0
原创粉丝点击