Redis-Session会话共享

项目中需要两个不同的web项目互相访问,用户对象为同一个User。决定用Redis来存储用户对象信息。。。ok,环境搭建开始:

1.pom.xml引入Redis依赖的jar:

<!-- jedis -->
	<dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
            <version>1.6.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.7.3</version>
        </dependency>

2.新建 spring-redis.xml :

 <!-- 配置JedisPoolConfig实例 -->  
    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">  
        <property name="maxIdle" value="${redis.maxIdle}" />  
        <property name="maxTotal" value="${redis.maxActive}" />  
        <property name="maxWaitMillis" value="${redis.maxWait}" />  
        <property name="testOnBorrow" value="${redis.testOnBorrow}" />  
    </bean>  
      
    <!-- 配置JedisConnectionFactory -->  
    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">  
        <property name="hostName" value="${redis.host}"/>  
        <property name="port" value="${redis.port}"/>  
        <!-- <property name="password" value="${redis.pass}"/> -->
        <property name="database" value="${redis.dbIndex}"/>  
        <property name="poolConfig" ref="poolConfig"/>  
    </bean>  
      
    <!-- 配置RedisTemplate -->  
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">  
        <property name="connectionFactory" ref="jedisConnectionFactory"/>  
    </bean>  

3.新建 redis.properties:

redis.host=192.168.152.129(redis部署所在的服务器地址)
redis.port=6379   
redis.maxIdle=100
redis.maxActive=300
redis.maxWait=1000
redis.testOnBorrow=true
redis.dbIndex=0  

4.在Spring总的配置文件中将spring-redis.xml include进去(用过spring的人都知道怎么做吧。。。)

5.新建Redis操作工具类(里面的方法可以自己扩充):

package com.odao.utils.redis;

import java.io.UnsupportedEncodingException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
/**
 * 
 * @author wangfj
 *
 */
@Component
public class RedisUtils {
     private static String redisCode = "utf-8";
	 
     @Autowired
     private RedisTemplate redisTemplate;
	 
    /**
     * @param key
     */
    public long del(final String... keys) {
        return (Long) redisTemplate.execute(new RedisCallback() {
            public Long doInRedis(RedisConnection connection) throws DataAccessException {
                long result = 0;
                for (int i = 0; i < keys.length; i++) {
                    result = connection.del(keys[i].getBytes());
                }
                return result;
            }
        });
    }

	    /**
	     * @param key
	     * @param value
	     * @param liveTime
	     */
	    public void set(final byte[] key, final byte[] value, final long liveTime) {
	        redisTemplate.execute(new RedisCallback() {
	            public Long doInRedis(RedisConnection connection) throws DataAccessException {
	                connection.set(key, value);
	                if (liveTime > 0) {
	                    connection.expire(key, liveTime);
	                }
	                return 1L;
	            }
	        });
	    }

	    /**
	     * @param key
	     * @param value
	     * @param liveTime
	     */
	    public void set(String key, String value, long liveTime) {
	        this.set(key.getBytes(), value.getBytes(), liveTime);
	    }

	    /**
	     * @param key
	     * @param value
	     */
	    public void set(String key, String value) {
	        this.set(key, value, 0L);
	    }

	    /**
	     * @param key
	     * @param value
	     */
	    public void set(byte[] key, byte[] value) {
	        this.set(key, value, 0L);
	    }

	    /**
	     * @param key
	     * @return
	     */
	    public String get(final String key) {
	        return (String) redisTemplate.execute(new RedisCallback() {
	            public String doInRedis(RedisConnection connection) throws DataAccessException {
	                try {
	                    return new String(connection.get(key.getBytes()), redisCode);
	                } catch (UnsupportedEncodingException e) {
	                    e.printStackTrace();
	                }
	                return "";
	            }
	        });
	    }

	    /**
	     * @param key
	     * @return
	     */
	    public boolean exists(final String key) {
	        return (Boolean) redisTemplate.execute(new RedisCallback() {
	            public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
	                return connection.exists(key.getBytes());
	            }
	        });
	    }

	    /**
	     * @return
	     */
	    public String flushDB() {
	        return (String) redisTemplate.execute(new RedisCallback() {
	            public String doInRedis(RedisConnection connection) throws DataAccessException {
	                connection.flushDb();
	                return "ok";
	            }
	        });
	    }

	    /**
	     * @return
	     */
	    public long dbSize() {
	        return (Long) redisTemplate.execute(new RedisCallback() {
	            public Long doInRedis(RedisConnection connection) throws DataAccessException {
	                return connection.dbSize();
	            }
	        });
	    }

	    /**
	     * @return
	     */
	    public String ping() {
	        return (String) redisTemplate.execute(new RedisCallback() {
	            public String doInRedis(RedisConnection connection) throws DataAccessException {
	                return connection.ping();
	            }
	        });
	    }


	   
}

 6.新建对象序列化工具类:

package com.odao.utils.common.config;

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

/**
 * 
 * @author wangfj
 *
 */
public class SerializeUtil {
	//序列化对象
	public static byte[] serialize(Object object) {
        ObjectOutputStream oos = null;
        ByteArrayOutputStream baos = null;
        try {
             baos = new ByteArrayOutputStream();
             oos = new ObjectOutputStream(baos);
             oos.writeObject(object);
             byte[] bytes = baos.toByteArray();
             return bytes;
        }catch (Exception e) {
        	e.printStackTrace();
        }
        return null;
   }
	
   //反序列化对象
   public static Object unserialize( byte[] bytes) {
        ByteArrayInputStream bais = null;
        try {
             bais = new ByteArrayInputStream(bytes);
             ObjectInputStream ois = new ObjectInputStream(bais);
              return ois.readObject();
        } catch (Exception e) {
        	e.printStackTrace();
        }
        return null;
   }
   
}

 7.登录时,将用户对象存到Redis(做测试,用的超时时间为1分钟):

redisUtils.set("userInfo".getBytes(), SerializeUtil.serialize(user),60);

 8.做了一个测试类:

public static void main(String[] args){
        Jedis jedis = new Jedis("192.168.152.129",6379);
        byte[] value = jedis.get("userInfo".getBytes());
        if(value != null){
            Object object = SerializeUtil.unserialize(value);
            if(object != null){
                User user = (User)object;
                System.out.println(user.getUserName()+"=="+user.getPassword());
            }
        }
    }

 运行结果:

wangfj==1c29b046d2723c5939fcaca89da2857b

总结:既然用户对象已经存储到了Redis中,那么我们只需要在每个项目中加一个跳转另一个系统的链接(登录链接)

        将Redis中的这个用户的key传过去,然后再被跳转的项目中

        通过Redis拿一次用户信息,就能得到一个项目登录,跳转另一个项目就自动登录的效果了。

posted @ 2016-08-16 16:07  君哥~  阅读(7585)  评论(0编辑  收藏  举报