Java简单实现session保存到redis的方法示例
本文实例讲述了Java简单实现session保存到redis的方法。分享给大家供大家参考,具体如下:
在负载均衡情况下,如果用户访问不同的机器,如果没有做session同步,用户就会被提出,这样用户体验非常不好,所以我们很有必要做session同步,把session放到reids缓存服务器就能很好的解决问题。下面是代码简单的实现。
一、配置web.xml过滤器:
sessionFilter org.springframework.web.filter.DelegatingFilterProxy sessionFilter /*
二、配置对应的过滤器名字:
三、SessionFilter的实现:
publicclassSessionFilterextendsGenericFilterBean{ privateRedisTemplateredisTemplate; @Override publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse, FilterChainchain)throwsIOException,ServletException{ System.out.println("filter"); HttpServletRequestre=(HttpServletRequest)request; HttpServletResponseres=(HttpServletResponse)response; TerryHttpServletRequestWrapperwrapper=newTerryHttpServletRequestWrapper(re,res,redisTemplate); chain.doFilter(wrapper,response); } publicRedisTemplategetRedisTemplate(){ returnredisTemplate; } publicvoidsetRedisTemplate(RedisTemplateredisTemplate){ this.redisTemplate=redisTemplate; } }
四、TerryHttpServletRequestWrapper的实现:
publicclassTerryHttpServletRequestWrapperextendsHttpServletRequestWrapper{ privateCacheHttpSessionsession; privateHttpServletResponseresponse; privateRedisTemplateredisTemplate; publicTerryHttpServletRequestWrapper(HttpServletRequestrequest,HttpServletResponseresponse,RedisTemplateredisTemplate){ super(request); this.response=response; this.redisTemplate=redisTemplate; } @Override publicHttpSessiongetSession(booleancreate){ if(session!=null){ returnsession; } Stringsid="terry"+System.currentTimeMillis(); writeSidToCookie(sid); session=newCacheHttpSession(null,sid,redisTemplate); returnsession; } @Override publicHttpSessiongetSession(){ returngetSession(false); } protectedvoidwriteSidToCookie(Stringsid){ Cookiemycookies=newCookie("terry",sid); mycookies.setMaxAge(-1); mycookies.setDomain("locahost"); mycookies.setPath("/"); response.addCookie(mycookies); } }
五、CacheHttpSession的实现:
publicclassCacheHttpSessionextendsHttpSessionWrapper{ privateStringsid; privateRedisTemplateredisTemplate; privateStringRedisSerializerstringSerializer=newStringRedisSerializer(); publicCacheHttpSession(HttpSessionsession,Stringsid,RedisTemplateredisTemplate){ super(session); this.sid=sid; this.redisTemplate=redisTemplate; } @SuppressWarnings("unchecked") @Override publicEnumerationgetAttributeNames(){ finalbyte[]key=stringSerializer.serialize(sid); Objectresult=redisTemplate.execute(newRedisCallback
六、HttpSessionWrapper的实现:
publicclassHttpSessionWrapperimplementsHttpSession{ privateHttpSessionsession; publicHttpSessionWrapper(HttpSessionsession){ this.session=session; } @Override publiclonggetCreationTime(){ returnthis.session.getCreationTime(); } @Override publicStringgetId(){ returnthis.session.getId(); } @Override publiclonggetLastAccessedTime(){ returnthis.session.getLastAccessedTime(); } @Override publicServletContextgetServletContext(){ returnthis.session.getServletContext(); } @Override publicvoidsetMaxInactiveInterval(intinterval){ this.session.setMaxInactiveInterval(interval); } @Override publicintgetMaxInactiveInterval(){ returnthis.session.getMaxInactiveInterval(); } @Override publicHttpSessionContextgetSessionContext(){ returnthis.session.getSessionContext(); } @Override publicObjectgetAttribute(Stringname){ returnthis.session.getAttribute(name); } @Override publicObjectgetValue(Stringname){ returnthis.session.getValue(name); } @Override publicEnumerationgetAttributeNames(){ returnthis.session.getAttributeNames(); } @Override publicString[]getValueNames(){ returnthis.session.getValueNames(); } @Override publicvoidsetAttribute(Stringname,Objectvalue){ this.session.setAttribute(name,value); } @Override publicvoidputValue(Stringname,Objectvalue){ this.session.putValue(name,value); } @Override publicvoidremoveAttribute(Stringname){ this.session.removeAttribute(name); } @Override publicvoidremoveValue(Stringname){ this.session.removeValue(name); } @Override publicvoidinvalidate(){ this.session.invalidate(); } @Override publicbooleanisNew(){ returnthis.session.isNew(); } }
以上代码就能把session保存到redis,当然这其中还有很多问题,比如sessionId的生成,session过去,对象序列化(测试为了方便统一用了string),等等很多问题。以后有时间再完善。
更多关于java相关内容感兴趣的读者可查看本站专题:《Java+MySQL数据库程序设计总结》、《Java操作Excel技巧总结》、《Java数据结构与算法教程》、《Java文件与目录操作技巧汇总》及《Java操作DOM节点技巧总结》
希望本文所述对大家java程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。