session保存到Redis简单实现

在负载均衡情况下,如果用户访问不同的机器,如果没有做session同步,用户就会被提出,这样用户体验非常不好,所以我们很远必要做session同步,把session放到reids缓存服务器就能很好的解决问题。下面是代码简单的实现。

一、配置web.xml过滤器:

[html] view plain copy

  1. <filter>  
  2.         <filter-name>sessionFilter</filter-name>  
  3.         <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>  
  4.     </filter>  
  5.       
  6.     <filter-mapping>  
  7.         <filter-name>sessionFilter</filter-name>  
  8.         <url-pattern>/*</url-pattern>  
  9.     </filter-mapping>  


二、配置对应的过滤器名字:

[html] view plain copy

  1. <bean id="sessionFilter" class="com.plateno.interceptor.SessionFilter">  
  2.         <property name="redisTemplate" ref="redisTemplate"/>  
  3.     </bean>  


三、SessionFilter的实现:

[java] view plain copy

  1. public class SessionFilter extends GenericFilterBean {  
  2.   
  3.     private RedisTemplate redisTemplate;  
  4.     @Override  
  5.     public void doFilter(ServletRequest request, ServletResponse response,  
  6.             FilterChain chain) throws IOException, ServletException {  
  7.         System.out.println("filter");  
  8.         HttpServletRequest re = (HttpServletRequest)request;  
  9.         HttpServletResponse res = (HttpServletResponse)response;  
  10.         TerryHttpServletRequestWrapper wrapper = new TerryHttpServletRequestWrapper(re,res,redisTemplate);  
  11.         chain.doFilter(wrapper, response);  
  12.     }  
  13.     public RedisTemplate getRedisTemplate() {  
  14.         return redisTemplate;  
  15.     }  
  16.     public void setRedisTemplate(RedisTemplate redisTemplate) {  
  17.         this.redisTemplate = redisTemplate;  
  18.     }  
  19. }  


四、TerryHttpServletRequestWrapper的实现:

[java] view plain copy

  1. public class TerryHttpServletRequestWrapper extends HttpServletRequestWrapper {  
  2.   
  3.     private CacheHttpSession session;  
  4.     private HttpServletResponse response;  
  5.     private RedisTemplate redisTemplate;  
  6.     public TerryHttpServletRequestWrapper(HttpServletRequest request, HttpServletResponse response,RedisTemplate redisTemplate) {  
  7.         super(request);  
  8.         this.response = response;  
  9.         this.redisTemplate = redisTemplate;  
  10.     }  
  11.   
  12.     @Override  
  13.     public HttpSession getSession(boolean create) {  
  14.         if(session != null) {  
  15.             return session;  
  16.         }  
  17.         String sid = "terry" + System.currentTimeMillis();  
  18.         writeSidToCookie(sid);  
  19.         session = new CacheHttpSession(null,sid,redisTemplate);  
  20.         return session;  
  21.     }  
  22.   
  23.     @Override  
  24.     public HttpSession getSession() {  
  25.         return getSession(false);  
  26.     }  
  27.     protected void writeSidToCookie(String sid) {  
  28.         Cookie mycookies = new Cookie("terry", sid);  
  29.         mycookies.setMaxAge(-1);  
  30.         mycookies.setDomain("locahost");  
  31.         mycookies.setPath("/");  
  32.         response.addCookie(mycookies);  
  33.     }  
  34. }  

五、CacheHttpSession的实现:

[java] view plain copy

  1. public class CacheHttpSession extends HttpSessionWrapper {  
  2.   
  3.     private String sid;  
  4.     private RedisTemplate redisTemplate;  
  5.     private StringRedisSerializer stringSerializer = new StringRedisSerializer();  
  6.     public CacheHttpSession(HttpSession session,String sid,RedisTemplate redisTemplate) {  
  7.         super(session);  
  8.         this.sid = sid;  
  9.         this.redisTemplate = redisTemplate;  
  10.     }  
  11.   
  12.     @SuppressWarnings("unchecked")  
  13.     @Override  
  14.     public Enumeration<String> getAttributeNames() {  
  15.         final byte[] key = stringSerializer.serialize(sid);  
  16.         Object result = redisTemplate.execute(new RedisCallback<Object>() {  
  17.             @Override  
  18.             public Object doInRedis(RedisConnection connection)  
  19.                     throws DataAccessException {  
  20.                 Set<byte[]> set = connection.keys(key);  
  21.                 return set;  
  22.             }  
  23.         });  
  24.         if(result != null) {  
  25.             Set<byte[]> s = (Set<byte[]>)result;  
  26.             Set<String> ss = new HashSet<String>();  
  27.             for(byte[] b : s) {  
  28.                 ss.add(stringSerializer.deserialize(b));  
  29.             }  
  30.             Enumeration<String> en = new Vector(ss).elements();  
  31.             return en;  
  32.         }  
  33.         return null;  
  34.     }  
  35.   
  36.     @SuppressWarnings("unchecked")  
  37.     @Override  
  38.     public void setAttribute(String name, Object value) {  
  39.         final byte[] key = stringSerializer.serialize(name);  
  40.         final byte[] v = stringSerializer.serialize((String)value);  
  41.         redisTemplate.execute(new RedisCallback<Object>() {  
  42.             @Override  
  43.             public Object doInRedis(RedisConnection connection)  
  44.                     throws DataAccessException {  
  45.                 connection.set(key, v);  
  46.                 return null;  
  47.             }  
  48.         });  
  49.     }  
  50.   
  51.     @Override  
  52.     public Object getAttribute(String name) {  
  53.         final byte[] key = stringSerializer.serialize(name);  
  54.         @SuppressWarnings("unchecked")  
  55.         Object value = redisTemplate.execute(new RedisCallback<Object>() {  
  56.             @Override  
  57.             public Object doInRedis(RedisConnection connection)  
  58.                     throws DataAccessException {  
  59.                 return connection.get(key);  
  60.             }  
  61.         });  
  62.         return value;  
  63.     }  
  64.   
  65.     @Override  
  66.     public String getId() {  
  67.         return sid;  
  68.     }  
  69. }  


六、HttpSessionWrapper的实现:

[java] view plain copy

  1. public class HttpSessionWrapper implements HttpSession {  
  2.   
  3.     private HttpSession session;  
  4.     public HttpSessionWrapper(HttpSession session) {  
  5.         this.session = session;  
  6.     }  
  7.     @Override  
  8.     public long getCreationTime() {  
  9.         return this.session.getCreationTime();  
  10.     }  
  11.   
  12.     @Override  
  13.     public String getId() {  
  14.         return this.session.getId();  
  15.     }  
  16.   
  17.     @Override  
  18.     public long getLastAccessedTime() {  
  19.         return this.session.getLastAccessedTime();  
  20.     }  
  21.   
  22.     @Override  
  23.     public ServletContext getServletContext() {  
  24.         return this.session.getServletContext();  
  25.     }  
  26.   
  27.     @Override  
  28.     public void setMaxInactiveInterval(int interval) {  
  29.         this.session.setMaxInactiveInterval(interval);  
  30.     }  
  31.   
  32.     @Override  
  33.     public int getMaxInactiveInterval() {  
  34.         return this.session.getMaxInactiveInterval();  
  35.     }  
  36.   
  37.     @Override  
  38.     public HttpSessionContext getSessionContext() {  
  39.         return this.session.getSessionContext();  
  40.     }  
  41.   
  42.     @Override  
  43.     public Object getAttribute(String name) {  
  44.         return this.session.getAttribute(name);  
  45.     }  
  46.   
  47.     @Override  
  48.     public Object getValue(String name) {  
  49.         return this.session.getValue(name);  
  50.     }  
  51.   
  52.     @Override  
  53.     public Enumeration<String> getAttributeNames() {  
  54.         return this.session.getAttributeNames();  
  55.     }  
  56.   
  57.     @Override  
  58.     public String[] getValueNames() {  
  59.         return this.session.getValueNames();  
  60.     }  
  61.   
  62.     @Override  
  63.     public void setAttribute(String name, Object value) {  
  64.         this.session.setAttribute(name,value);  
  65.     }  
  66.   
  67.     @Override  
  68.     public void putValue(String name, Object value) {  
  69.         this.session.putValue(name,value);  
  70.     }  
  71.   
  72.     @Override  
  73.     public void removeAttribute(String name) {  
  74.         this.session.removeAttribute(name);  
  75.     }  
  76.   
  77.     @Override  
  78.     public void removeValue(String name) {  
  79.         this.session.removeValue(name);  
  80.     }  
  81.   
  82.     @Override  
  83.     public void invalidate() {  
  84.         this.session.invalidate();  
  85.     }  
  86.   
  87.     @Override  
  88.     public boolean isNew() {  
  89.         return this.session.isNew();  
  90.     }  
  91. }  


以上代码就能把session保存到redis,当然这其中还有很多问题,比如sessionId的生成,session过去,对象序列化(测试为了方便统一用了string),等等很多问题。以后有时间再完善。

猜你喜欢

转载自blog.csdn.net/xiayubing_/article/details/81288747
今日推荐