话说上礼拜到浙江移动给客服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,需要的童鞋拿去吧。。。
分享到:
相关推荐
常用跨域共用session的是登录模块,我相信很多开发的朋友的都遇到过,只需要一个地方登录,相关联的网站也是处于登录状态。两种情况:一种9streets.cn和a.9streets.cn之间,另一种是a.com b.com之间,这几天总结了...
本文实例讲述了php实现多站点共用session实现单点登录的方法。分享给大家供大家参考,具体如下: 最近闲来无事,总结整理下单点登录的问题。 单点登录的基本原理为:客户端共享sesionid,服务器端共享session信息。...
免费版有3窗口****,本例子带你解锁新的知识。
Mac简单例子实现主菜单在多个窗口之间的共用问题
C#做的一个SerialPort数据流查看、监视器,由3个不同显示窗口组成,可选择全部查看或只关注某一个。适用于检测数据流在SerialPort之间传送的状态,可做调试用。 <br>注: 1. 2分资源分会在评分后归还,不是...
主要介绍了PHP和NodeJs开发的应用如何共用Session的相关资料及思路,需要的朋友可以参考下
示例演示了两个窗体一个是登录窗口,一个是工作窗口,两个共享变理
Avant浏览器(爱帆浏览器)是一款使用方便的多窗口浏览器。Avant浏览器以 Internet Explorer 内核为基础,体积虽然很小,但它却有着IE与 Opera浏览器等更多增强功能。例如:过滤 Flash 动画和弹出式广告等。由于采用了...
一个电脑上多软件共用一个串口的方法
VC MFC 多窗口消息共享同一个消息处理函数。
Servlet对Cookie和Session的管理:会话跟踪、会话浏览、过滤器、事件监听、以及不依赖浏览器的后台跟踪和浏览源码。
c#多个项目共用一个Config配置文件 c#多个应用程序共用一个Config配置文件
基于内存的session系统,可替代默认的基于小文件的session,基于内存存储,可设置独立的session服务器,以使多个web服务器共用同一session空间,则效率比使用数据库的session高很多。
多台机器共用鼠标键盘方法 配置2台机器,一个台式机,一个笔记本,来回切换键盘和鼠标比较麻烦,就想使用一套键盘鼠标来控制2台电脑,使用VNC可以实现。
利用Linux下的NAT功能实现多机共用一个IP地址.pdf
行业资料-电子功用-多芯片共用的散热器和设置有该散热器的电路板
ZYNQ Linux 双网口,MDIO共用,RESET-GPIO不共用