`
vearn
  • 浏览: 58267 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

浏览器多窗口共用session引发的混乱

阅读更多

话说上礼拜到浙江移动给客服MM演示我们系统的网站,“...支持普通客服和客服管理员两种不同级别。您看工作量统计这里,咱们用admin这个号登录,然后...”

 

“打断下,你用ie再开一个标签页,用custom登录下,我想先看下普通客服流程的演示”。顺利通过,我正暗自松了一口气,“现在看admin吧”。操作了两下我突然眼前一黑,怎么变成普通客服了。哦卖糕的,为什么每次做公开培训和系统演示的时候总会出现严重bug呢?和万有引力定律一样难以解释。

 

我沮丧地意识到问题的原因,两个标签页共用一个session。后一个把前一个的同名attribute域覆盖了,致使数据混乱。action中像这样:

 

session.setAttribute("session_urname", urname);
 

然后在jsp中利用EL取值:

 

${sessionScope.session_urname}

 

========================================偶是华丽的分隔线========================================

 

回到宾馆,回想起刚才MM难以捉摸的微笑。尽管我凭借大于200的APM + 滔滔不绝地东拉西扯蒙混过关,但下一次就没这好运气了,改!

 

首先action中attribute的名字不能重复,看代码:

 

//  避免同一PC多浏览器窗口不同账户共用session
Random random = new Random();
StringBuffer sid = new StringBuffer();
sid = sid.append(System.currentTimeMillis());   //  取系统时间
//  加上10为0-9随机数确保sid不重复
for (int i = 0; i < 10; i++) {
    sid = sid.append(random.nextInt(10));
}

//  把所有需要放进session的attribute放进一个Mapbar<String, Object>
//  一是便于el中取值、二是便于统一管理
Map sessionMap = new HashMap();
sessionMap.put("session_urname", urname);
session.setAttribute(sid.toString(), sessionMap);

String rd = "detail.jsp?sid=" + sid.toString();
request.getRequestDispatcher(rd).forward(request, response);
 

然后在jsp中用EL取值:

 

${sessionScope[param.sid].session_urname}
 

给session_urname加上一层Map,看似多余,其实不然。有两点考虑,一是便于EL取值,如果有多个变量需要放到session里,如果不用Map,势必要这样写:

 

session.setAttribute("name" + sid.toString(), urname);
session.setAttribute("pwd" + sid.toString(), urpassword);
 

你也许会想EL中取值时加上前缀呗:

 

${sessionScope['name' + param.sid]}
 

很可惜EL并不支持+号的字符串连接操作,这样写就不能用EL了;二是把所有需要放入session的变量都放入Map里便于管理,特别是在字段很多的情况下。

 

最后反思下过去对session的滥用,好好反省潜意识中server page的残念。附件中是我写的一个demo,需要的童鞋拿去吧。。。

 

 

 

 

 

 

3
0
分享到:
评论
4 楼 lufangkang1987 2016-03-10  
如果再java代码中怎么取出userinfo?
3 楼 beacon89 2012-02-14  
最近也为SESSION的问题犯愁,多种浏览器、多标签,老板先看看你的代码能否对我的项目有帮助,在此谢过!
2 楼 Checkmate 2009-06-16  
200+........MM不看毛了....
难不成是tossgirl.....
1 楼 天机老人 2009-05-01  
呵呵,学习到了,老板你的hibernate 实战我收下啦!

相关推荐

Global site tag (gtag.js) - Google Analytics