`
vearn
  • 浏览: 58846 次
  • 性别: 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 实战我收下啦!

相关推荐

    常用跨域共用session的是登录模块

    常用跨域共用session的是登录模块,我相信很多开发的朋友的都遇到过,只需要一个地方登录,相关联的网站也是处于登录状态。两种情况:一种9streets.cn和a.9streets.cn之间,另一种是a.com b.com之间,这几天总结了...

    火山PC创建多窗口例子

    在桌面应用中,多窗口是常见的功能需求,例如文件管理器、浏览器等。火山PC提供了相应的API和类库来支持这一特性。 在描述中提到的"免费版有3窗口"可能是指火山PC的基础版本默认限制同时打开的窗口数量,而这个例子...

    C# 用WebBrowser实现的多页面浏览器

    【C# 用WebBrowser实现的多页面浏览器】是一个基于C#编程语言的项目,它利用内置的WebBrowser控件创建了一个支持多个标签页的浏览器应用程序。WebBrowser控件是.NET Framework提供的一种组件,允许开发者在Windows...

    Tomcat 同一服务器上 不同web项目共享session的

    Session是在服务器端保存用户状态的一种机制,它通过在客户端(浏览器)存储一个唯一的session ID来识别不同的会话。每个Web应用程序在默认情况下都有自己的独立session空间,这意味着在一个项目中设置的session属性...

    php实现多站点共用session实现单点登录的方法详解

    本文实例讲述了php实现多站点共用session实现单点登录的方法。分享给大家供大家参考,具体如下: 最近闲来无事,总结整理下单点登录的问题。 单点登录的基本原理为:客户端共享sesionid,服务器端共享session信息。...

    IE8串session的解决方法

    标题中的"IE8串session"问题是指在使用Internet Explorer 8(简称IE8)时,浏览器的不同窗口或标签页之间可能会共享同一个Session,导致用户在不同网页上的登录状态、个性化设置等信息相互影响,这在多用户环境或者...

    seesion注意问题

    - 处理多窗口/标签页:同一个用户在不同窗口或标签页下打开的页面共用同一Session,但新开窗口可能会创建新的Session,导致数据冲突。开发者需关注这种情况,避免数据覆盖。 - 浏览器兼容性:不同浏览器对Session...

    Mac简单例子实现主菜单在多个窗口之间的共用问题

    本文将通过一个简单的例子,详细讲解如何在Mac上实现主菜单在多个窗口之间的共用。 在Mac开发中,我们通常使用Cocoa框架,它是Apple提供的用于开发原生Mac应用的工具集。Cocoa框架包含了一系列类和接口,用于构建...

    PHP和NodeJs开发的应用如何共用Session

    当用户发起请求时,浏览器会将包含Session ID的Cookie发送到服务器,服务器通过Session ID找到对应的Session数据。 #### (2) 使用Redis作为共享存储 Redis是一个内存中的数据结构存储系统,可以作为持久化的Key-...

    MFC 多个窗口消息共享同一个消息处理函数demo

    在传统的MFC应用中,每个窗口类都有自己的消息处理函数(如OnMessage,OnCommand等),但如果我们想要多个窗口共用同一组消息处理逻辑,我们可以采用以下方法: 1. **定义一个基类**:创建一个新的CWinApp派生类或...

    C#做的多窗口串口监视器 COM Monitor

    C#做的一个SerialPort数据流查看、监视器,由3个不同显示窗口组成,可选择全部查看或只关注某一个。适用于检测数据流在SerialPort之间传送的状态,可做调试用。 &lt;br&gt;注: 1. 2分资源分会在评分后归还,不是...

    Flutter 桌面多窗口支持,支持Windows,MacOS

    通过修改和结合desktop_multi_window 和 window_manager 进行实现 Flutter 桌面多窗口支持,支持Windows,MacOS, 代码资源中有详细sample,可以尽最大限度解决Flutter桌面多窗口短板问题,flutter 独立支持多窗口路...

    Servlet对Cookie和Session的管理源码实例

    虽然Cookie和Session主要依赖浏览器,但可以通过其他方式实现后台跟踪,如使用数据库或分布式缓存存储会话数据。这种方式通常用于跨域应用或移动应用,其中Session ID可以通过非HTTP方式传递(如WebSocket、API调用...

    详说Chrome浏览器同时登陆多账号方法.docx

    Chrome 浏览器支持多用户帐号同时登录,这个功能可以满足多人共用一台电脑的需求。在 Chrome 浏览器的"设置"中,可以找到"用户"选项,然后点选"添加新用户",从而添加多个用户账号。每个用户账号都维系着不同的书签...

    qt5 demo 串口通信,多窗口间相互调用

    qt5 demo,包括串口通信,多窗口间相互调用,mysql 数据库连接,非常好用的一手资料程序。绝对值。。。。

    C# 多窗体登录共享变量

    示例演示了两个窗体一个是登录窗口,一个是工作窗口,两个共享变理

    利用Linux下的NAT功能实现多机共用一个IP地址.pdf

    "利用Linux下的NAT功能实现多机共用一个IP地址" 本文主要介绍了如何利用Linux下的NAT功能实现多机共用一个IP地址。NAT(Network Address Translation,网络地址转换)是一种使多台计算机共用一个公网IP地址的技术。...

    Excel2007打开多个独立窗口的方法

    此外,这种方法还可以解决多个 Excel 文件之间的窗口混乱问题,提高工作效率。 在 Excel 2007 中打开多个独立窗口的方法可以分为以下步骤: 1. 在 Windows 资源管理器中选择工具-文件夹选项。 2. 选文件类型,定位...

Global site tag (gtag.js) - Google Analytics