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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。