在ofbiz集群中使用redis共享session

最开始的想法是使用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);
		}
	}

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);



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值