nginx+tomcat7+memcached集群session共享,session居然不稳定!!!

qq_2387503106 2012-11-22 04:04:50
如题我做了个测试简直无语了,我用的是struts2,为了便于发现问题,我特意在jsp页面上也写了段java代码,输出sessionID和session的类容代码如下:
<%
System.out.println(session.getId());
out.println("<br> This is (TOMCAT1), SESSION ID:" + session.getId()+"<br>");
User user=(User)ActionContext.getContext().getSession().get(SessionKey.getUserSessionKey());
if(user!=null){
out.println("<br> 用户:"+ user.getUserNameEmail()+"<br>");
} else {
out.println("<br> : 用户:不存在<br>");
}
%>
这是jsp页面的,另外我在后台action中也这样:
Map<String, Object> session = ActionContext.getContext().getSession();
User user = (User)session.get(SessionKey.getUserSessionKey());

怪事就出来了,我反复刷新页面,JSP可以每次正常输出session类容,而且session在集群中每一个节点的时候sessionID不会变,但是后台有时候输出Map<String, Object> session = ActionContext.getContext().getSession();的session 是空,有时候又是正常能取值,在这里郁闷的快一周了,求大侠相助啊
...全文
826 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
schol 2013-04-16
  • 打赏
  • 举报
回复
session管理是个问题。
微观技术 2013-04-09
  • 打赏
  • 举报
回复
看明白楼主的问题了 每个应用服务器(如tomcat)都要管理一套自己的session,而session通常是用来存储用户的临时信息(如是否登录过),而负载均衡会将同一个用户的不同请求转发到不同的应用服务器上,可能会造成session信息缺失。这确实是一个比较严重的问题。 给楼主提供一个参考建议: 1. 将用户是否登录等常规信息存储到cookie中,底层增加设置一个过滤层,基于cookie的session,将cookie转化存入session中,因为session的使用比cookie中要灵活的多 关于这块可照阿里巴巴的开源框架webx http://www.openwebx.org/docs/Webx3_Guide_Book.html#webx.requestcontext.session 第8.1. Session概述 相信这块对你的帮助会相当的大 2. 对一些临时的信息可存于缓存中(如memcache),因为它是分布式,数据会根据key值hash映射到不同的存储结点,这个对用户是不透明的,不用涉及不同结点间的数据同步问题。 灵活使用这两点,相信会解决你的问题
十年彩虹 2013-04-09
  • 打赏
  • 举报
回复
帮顶。
悍马拖拉机 2013-04-08
  • 打赏
  • 举报
回复
最好的办法还是自己实现个sso的服务来管理session,复制不可靠的。
hgdakfg 2013-03-29
  • 打赏
  • 举报
回复
引用 2 楼 qq_2387503106 的回复:
这问题我自己解决了
您好,请问您是怎么解决的session失效问题
qq_2387503106 2012-12-20
  • 打赏
  • 举报
回复
但是还有另外的问题,集群的时候有个问题就是,当我测试登陆的时候,发现memcached的session有时候更新不及时啊,实际上session是创建了因为在jsp页面写java代码在request中获取session中的对象就能取到,但是执行onload事件用ajax取的时候居然偶尔会出现null,然后以后刷新一下就正常取值了,困惑
qq_2387503106 2012-12-20
  • 打赏
  • 举报
回复
这问题我自己解决了
qq_2387503106 2012-11-22
  • 打赏
  • 举报
回复
没有大侠相助吗?????我目前想出的办法是同时也启用nginx的ip_hash,这样的话同一IP(就算不是底层IP)也起到一定限制作用,这样在访问的时候就不会频繁的切换tomcat节点,同一个IP就在一个节点下执行,除非当前节点宕机了再切换到下一个节点,这时候memcached已经也把session复制到其他节点,这样一来依然处于session共享状态,唉,希望有高人出手啊,那问题还是问题,头疼了!

25,980

社区成员

发帖
与我相关
我的任务
社区描述
高性能WEB开发
社区管理员
  • 高性能WEB开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧