在ofbiz集群中使用redis共享session
2017-02-06 10:16
901 查看
最开始的想法是使用session监听器,在session创建时,根据sessionid为键,map为值,加入redis中.,在session销毁时删除此sessionid.
包装session,重写session中的方法来设置值和取得值.
包装request,将包装的session作为包装request的session.
结果在实现时,发现每次创建session时id都不同而且控制不了,这样的话一台服务器死掉,切换到另一台服务器的时候
原来存在redis中的数据得不到.
后面又想覆盖掉jsessionid,没成功.只能创建了一个rsessionid来做,在过滤器中根据此键来存入redis,
由于关闭ofbiz时,session销毁没有执行,只能设置存活时间.
由于有多个组件要使用此功能那么在初始化连接时初始一次就行了.
不过目前为止还没有上线,不知道这样有没有问题.
主要代码:
public void init(FilterConfig arg0) throws ServletException {
if (redisClient == null) {
synchronized (RedisFilter.class) {
if (redisClient == null) {
redisClient = RedisClient.getRedisClient();
}
}
}
}
//当关闭服务器时session销毁没有触发session监听器
private void setRedisAttribute(String id) {
Jedis redis = null;
try {
redis = redisClient.getJedis();
Object redisValue = redis.get(UtilObject.getBytes(id));
if (redisValue == null) {
synchronized (RedisFilter.class) {
if (redisValue == null) {
redis.set(UtilObject.getBytes(id), UtilObject.getBytes(new HashMap<String, Object>()));
redis.expire(UtilObject.getBytes(id), 86400);
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
redisClient.returnJedis(redis);
}
}
包装session,重写session中的方法来设置值和取得值.
包装request,将包装的session作为包装request的session.
结果在实现时,发现每次创建session时id都不同而且控制不了,这样的话一台服务器死掉,切换到另一台服务器的时候
原来存在redis中的数据得不到.
后面又想覆盖掉jsessionid,没成功.只能创建了一个rsessionid来做,在过滤器中根据此键来存入redis,
由于关闭ofbiz时,session销毁没有执行,只能设置存活时间.
由于有多个组件要使用此功能那么在初始化连接时初始一次就行了.
不过目前为止还没有上线,不知道这样有没有问题.
主要代码:
public void init(FilterConfig arg0) throws ServletException {
if (redisClient == null) {
synchronized (RedisFilter.class) {
if (redisClient == null) {
redisClient = RedisClient.getRedisClient();
}
}
}
}
//当关闭服务器时session销毁没有触发session监听器
private void setRedisAttribute(String id) {
Jedis redis = null;
try {
redis = redisClient.getJedis();
Object redisValue = redis.get(UtilObject.getBytes(id));
if (redisValue == null) {
synchronized (RedisFilter.class) {
if (redisValue == null) {
redis.set(UtilObject.getBytes(id), UtilObject.getBytes(new HashMap<String, Object>()));
redis.expire(UtilObject.getBytes(id), 86400);
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
redisClient.returnJedis(redis);
}
}
HttpServletRequest request = (HttpServletRequest) arg0; HttpServletResponse response = (HttpServletResponse) arg1; Cookie[] cookies = request.getCookies(); String sessionId = "", cookiePath = ""; int maxAge = -1; if (cookies != null) { for (Cookie c : cookies) { if (c.getName().equals("RSESSIONID")) { sessionId = c.getValue(); cookiePath = c.getPath(); maxAge = c.getMaxAge(); } } } HttpSession session = request.getSession(); sessionId = UtilValidate.isEmpty(sessionId) ? session.getId() : sessionId; cookiePath = "/"; session.setAttribute("redisSessionId", sessionId); Cookie c1 = new Cookie("RSESSIONID", sessionId); c1.setPath(cookiePath); response.addCookie(c1); arg2.doFilter(request, response);
相关文章推荐
- 使用redis进行基于shiro的session集群共享
- 分布式架构学习之:使用Redis3.0集群实现Tomcat集群的Session共享
- 解决使用redis进行基于shiro的session集群共享,shiro+redis
- 使用nginx搭建集群tomcat8,redis实现session共享,文件共享问题
- 使用redis进行基于shiro的session集群共享
- Nginx+tomcat集群使用redis共享session
- tomcat集群使用redis实现session共享
- 使用redis进行基于shiro的session集群共享
- 使用Tomcat-redis-session-manager来实现Tomcat集群部署中的Session共享
- 使用Tomcat-redis-session-manager来实现Tomcat集群部署中的Session共享
- 分布式架构学习之:032--使用Redis3.0集群实现Tomcat集群的Session共享
- 使用redis进行基于shiro的session集群共享
- 使用redis集群+tomcat缓存共享下session丢失问题产生原因以及解决
- 使用redis进行基于shiro的session集群共享
- 使用nginx搭建集群tomcat8,redis实现session共享,文件共享问题
- 使用nginx搭建集群tomcat8,redis实现session共享,文件共享问题
- 使用nginx负载tomcat集群实现redis存贮session共享
- 使用Tomcat+Redis来实现集群部署中的Session共享问题
- 使用Tomcat+Redis来实现集群部署中的Session共享问题
- Tomcat 集群使用redis共享session