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拿一次用戶信息,就能得到一個項目登錄,跳轉另一個項目就自動登錄的效果了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM