`
lee5593
  • 浏览: 57537 次
社区版块
存档分类
最新评论

IE7下不同用户会共享同一个session会话的问题

阅读更多
问题描述:IE7不同选项卡选择不同的用户对同一个Web应用进行登录,服务器跟踪堆栈时发现两个用户所用的session会话都是一样的。

初步诊断:初步判断为IE7不同选项卡属于同一个进程,由于默认开启了cookie来跟踪会话,服务器端会默认收到客户端http请求中传过来的cookie中的session id,并为这些不同的用户都分配同一个session会话。由于该Web应用中没有使用URL重写,在tomcat下禁用cookie会影响正常功能。请问各位有没有遇到过类似的问题,有什么好的解决方案吗?谢谢!
分享到:
评论
31 楼 centgo 2007-06-27  
我也来提供点思路:
1)sessionid 就是一个标志位吗,标志不同的用户,如果能在用户打开新的标签的时候改变sessionid就好了,因为cookie,浏览器进程,域名是相互关联的,估计不好改。
2)自己实现一个类似session的功能,不用sessionid,用用户名绑定后台数据,每次访问时传回用户名,根据用户名做不同的操作。
3)如果说服客户更简单的话就说服客户。
30 楼 ddandyy 2007-06-26  
不吵了          
29 楼 scud 2007-06-26  
跳过问题不等于逃避问题, 跳过问题是最小的代价, 我认为这是第一选择.


解决办法似乎很明显:
1. 跳过问题
   一般来说, 这肯定属于很少数的情况, 可以告诉此人用2个浏览器.
   或者采用其他商务手段

2. 改动全部url, 如果你想这么做的话, 代价显然很高.



所有选择应该都在这里了.
28 楼 ddandyy 2007-06-26  
SteveGY 写道

不过,说真的,从很多回复上基本看不出来,楼主有你说的那种意思,比如: “呵呵,原来早就爆出来了啊,为什么我都搜不到类似的信息呢?我们肯定不能限制用户不使用IE7等支持选项卡的浏览器,这是一个很严重的问题。”,“对于很多企业应用,一个用户可能会身兼不同的角色和职责,所以同时以不同的用户身份登录同一个应用也是很平常的事情,而且目前很多应用都是正式上线的生产系统,都需要打补丁的话可能比较麻烦,这个问题没有别的解决方案了吗?”
我不知道,也许我们的多个客户都比较讲道理,他们一向认为开两个浏览器进程做不同身份登录是合理的。


难道你不知道这是什么意思么
27 楼 SteveGY 2007-06-26  
fins 写道
SteveGY 写道
哈哈,看你们说了这么多,这个………………
我们一直在做这样的事情,我们的很多项目都是有前台和后台的,前后台的登录用户是不同的,为了测试前台输入的数据是否在后台显示正常,通常都会在自己的机器上开两个IE的窗口测试两个不同的用户登录。我不知道各位都是如何做这样的测试的?难道是在一个IE上退出前台登录,然后再用后台用户登录,再测试的??

解决这个问题,很简单的,启动两个不同的IE进程,就可以了,不要使用Ctrl-N或者Ctrl-T,这样的新窗口或新选项卡都是同一个IE的进程,所以会使用相同的cookies池,也就在server上有相同的session,这个是一个重要的设计特征,就是这样设计的。新启动一个IE进程,就是在“开始”菜单上再点一下Internet Explorer的图标而已,呵呵,然后看看task manager,是不是有2个iexplorer.exe的进程,呵呵,如果你想要同时测试3个不同的登录用户的话,知道怎么做了吧。


请你认真的看完别人的帖子 再发表言论好不好??
人家都说了 就是在Ctrl n就是 Ctrl t 的时候 怎么解决这个问题

新开ie进程谁不知道啊?? 新的进程有新的session 而 Ctrl n或 Ctrl t出来的 有同一session.
我们讨论的 在这种情况下如何解决问题

而且 尤其是你的第一句话 "哈哈,看你们说了这么多,这个………………"
让人看了不爽, 你是在嘲笑之前所有人的讨论吗? 希望不是 ,但你确确实实给人一种类似的感觉 .

PS:对事不对人 我就是说你这帖子回的没质量,不是针对你的人,希望你不要介意.

好吧,我承认,确实是我说话口气有问题,呵呵,看来无论如何,还是得注意语气

不过,说真的,从很多回复上基本看不出来,楼主有你说的那种意思,比如: “呵呵,原来早就爆出来了啊,为什么我都搜不到类似的信息呢?我们肯定不能限制用户不使用IE7等支持选项卡的浏览器,这是一个很严重的问题。”,“对于很多企业应用,一个用户可能会身兼不同的角色和职责,所以同时以不同的用户身份登录同一个应用也是很平常的事情,而且目前很多应用都是正式上线的生产系统,都需要打补丁的话可能比较麻烦,这个问题没有别的解决方案了吗?”
我不知道,也许我们的多个客户都比较讲道理,他们一向认为开两个浏览器进程做不同身份登录是合理的。
26 楼 fins 2007-06-26  
SteveGY 写道
哈哈,看你们说了这么多,这个………………
我们一直在做这样的事情,我们的很多项目都是有前台和后台的,前后台的登录用户是不同的,为了测试前台输入的数据是否在后台显示正常,通常都会在自己的机器上开两个IE的窗口测试两个不同的用户登录。我不知道各位都是如何做这样的测试的?难道是在一个IE上退出前台登录,然后再用后台用户登录,再测试的??

解决这个问题,很简单的,启动两个不同的IE进程,就可以了,不要使用Ctrl-N或者Ctrl-T,这样的新窗口或新选项卡都是同一个IE的进程,所以会使用相同的cookies池,也就在server上有相同的session,这个是一个重要的设计特征,就是这样设计的。新启动一个IE进程,就是在“开始”菜单上再点一下Internet Explorer的图标而已,呵呵,然后看看task manager,是不是有2个iexplorer.exe的进程,呵呵,如果你想要同时测试3个不同的登录用户的话,知道怎么做了吧。


请你认真的看完别人的帖子 再发表言论好不好??
人家都说了 就是在Ctrl n就是 Ctrl t 的时候 怎么解决这个问题

新开ie进程谁不知道啊?? 新的进程有新的session 而 Ctrl n或 Ctrl t出来的 有同一session.
我们讨论的 在这种情况下如何解决问题

而且 尤其是你的第一句话 "哈哈,看你们说了这么多,这个………………"
让人看了不爽, 你是在嘲笑之前所有人的讨论吗? 希望不是 ,但你确确实实给人一种类似的感觉 .

PS:对事不对人 我就是说你这帖子回的没质量,不是针对你的人,希望你不要介意.
25 楼 ddandyy 2007-06-26  
一个个都把别人当傻子  只想着怎么跳过问题
24 楼 SteveGY 2007-06-26  
哈哈,看你们说了这么多,这个………………
我们一直在做这样的事情,我们的很多项目都是有前台和后台的,前后台的登录用户是不同的,为了测试前台输入的数据是否在后台显示正常,通常都会在自己的机器上开两个IE的窗口测试两个不同的用户登录。我不知道各位都是如何做这样的测试的?难道是在一个IE上退出前台登录,然后再用后台用户登录,再测试的??

解决这个问题,很简单的,启动两个不同的IE进程,就可以了,不要使用Ctrl-N或者Ctrl-T,这样的新窗口或新选项卡都是同一个IE的进程,所以会使用相同的cookies池,也就在server上有相同的session,这个是一个重要的设计特征,就是这样设计的。新启动一个IE进程,就是在“开始”菜单上再点一下Internet Explorer的图标而已,呵呵,然后看看task manager,是不是有2个iexplorer.exe的进程,呵呵,如果你想要同时测试3个不同的登录用户的话,知道怎么做了吧。
23 楼 jianfeng008cn 2007-06-25  
wgfywin 写道
对这个帖子的问题,我认为要分两个层面来解答
1,以最小的开销,解决楼主的实际问题。
2,从纯粹技术问题的角度来考虑如何解决这类问题。

首先从第一种角度来回答:
 
  如果可以通过商务手段让客户放弃这一需求,就应该使用商务手段。如果是一个必须实现的功能,那么下面给出具体的解决办法,思路是前面的回帖中提到过的,我这里是比较具体的做法,可行性如何,请老鸟评论:
帖主具体的系统设计怎么做的,我们不是太清楚,我这里冒昧给出一些具体的实现方式。
    1,每请求都带有userid,如果view使用的是类似struts的formbean的方式实现的话,可以给formbean加一个公共的parent class,里面带有userid这个属性,然后,页面代码上面,直接在 </form> (</html:form>) 前面加上这个隐藏域,  ( 直接查找</form> 然后替换成 <input type="hidden" name="xx" value="<%=xxxx%>"/> </form> 或者  </html:form> 替换成 <html:hidden property="xx"/> </html:form>)
   2,session 里面给session中存放的数据加上userid。我觉得对于一个用户而言,只应该有一个对象被存放在session中,这个对象包含了需要存放的各种信息,包括user id ,privileges, roles, preferences, etc.  也就是用一个class来统一管理对session的访问。 借助于现在很多开发工具的Refactor功能,应该可以方便的改好。

   第二种角度回答这个问题:
     前面已经有多种说法了,我也是学习中:)


你这两种方法其实就是一种,在后台使用单session针对一个机器,然后通过唯一性标识绑定用户 进行区分,
类似在session中放一个Map<userid,Map<sessionKey,sessionValue>>

另外一种思路我觉得更好,就是没试验过,在client的页面上 设置hidden input 讲seesionId携带,或者url携带sessionid,这样的好处是服务器不需要做改变,问题是client只有最后操作的用户的cookie能够在client得到保存,cookie的使用需要更加小心。
22 楼 jianfeng008cn 2007-06-25  
ddandyy 写道
janh 写道
如果非要这么做,那就要在每个请求中都加上当前用户是谁,后台还要在相同的session中判断不同的用户,这个改动实在太大了。

一个最简单的方法是在不同页签中使用不同的url,如xxx.iteye.com,只要不同的页签,前面的xxx值不同就行了,可以用用户名代替。这样只要url不同每个页签的sessionid就是不同的,后台也用不着去识别这个xxx到底是什么,实现也很简单,加个泛域名解析就行了。


多数情况下应该可以  不过 如果A用户 把他的一个地址COPY到B用户登陆的机器上运行 打算让B看结果   会怎么样呢


这个也好办啊 先吧范围缩小,再判断条件上加上 机器ip就可以了
这样问题就变成同一个机器上的 多用户 处理了
21 楼 glassprogrammer 2007-06-22  
有没有考虑过那些多标签的浏览器, 比如 IE7, Firefox, 不去这样做(不同Tab属于不同的 session)的原因呢? 我认为, 基本上客户的要求属于外行人的异想天开, 最好直接说服客户放弃这种想法, 而不是醉心于挑战自己的技术能力.
20 楼 叶子 2007-06-22  
最喜欢拉某个板块的列表,再在第一页新标签窗口开感兴趣的话题,再去回复,这样就要不同用户,死了算了

ps:当然,客户要求是客户要求。
19 楼 magice 2007-06-21  
lee5593 写道
问题描述:IE7不同选项卡选择不同的用户对同一个Web应用进行登录,服务器跟踪堆栈时发现两个用户所用的session会话都是一样的。

初步诊断:初步判断为IE7不同选项卡属于同一个进程,由于默认开启了cookie来跟踪会话,服务器端会默认收到客户端http请求中传过来的cookie中的session id,并为这些不同的用户都分配同一个session会话。由于该Web应用中没有使用URL重写,在tomcat下禁用cookie会影响正常功能。请问各位有没有遇到过类似的问题,有什么好的解决方案吗?谢谢!


根本原因是session是非线程安全的类,而多个IE标签实际上是代表多个线程,所以session会串。
其实也是有解决方案的那就是使用ThreadLocal,安全框架acegi就是使用的是这样方式来处理session的线程非安全!
18 楼 janh 2007-06-21  
ddandyy 写道
janh 写道
如果非要这么做,那就要在每个请求中都加上当前用户是谁,后台还要在相同的session中判断不同的用户,这个改动实在太大了。

一个最简单的方法是在不同页签中使用不同的url,如xxx.iteye.com,只要不同的页签,前面的xxx值不同就行了,可以用用户名代替。这样只要url不同每个页签的sessionid就是不同的,后台也用不着去识别这个xxx到底是什么,实现也很简单,加个泛域名解析就行了。


多数情况下应该可以  不过 如果A用户 把他的一个地址COPY到B用户登陆的机器上运行 打算让B看结果   会怎么样呢


要在同一窗口的不同页签中用相同的url(包括后面的参数)运行出不同的结果来貌似不可能,因为他们发到后台的信息是完全一样的,包括sessionid。除非修改操作系统的页签的实现。
17 楼 ddandyy 2007-06-21  
janh 写道
如果非要这么做,那就要在每个请求中都加上当前用户是谁,后台还要在相同的session中判断不同的用户,这个改动实在太大了。

一个最简单的方法是在不同页签中使用不同的url,如xxx.iteye.com,只要不同的页签,前面的xxx值不同就行了,可以用用户名代替。这样只要url不同每个页签的sessionid就是不同的,后台也用不着去识别这个xxx到底是什么,实现也很简单,加个泛域名解析就行了。


多数情况下应该可以  不过 如果A用户 把他的一个地址COPY到B用户登陆的机器上运行 打算让B看结果   会怎么样呢
16 楼 janh 2007-06-21  
如果非要这么做,那就要在每个请求中都加上当前用户是谁,后台还要在相同的session中判断不同的用户,这个改动实在太大了。

一个最简单的方法是在不同页签中使用不同的url,如xxx.iteye.com,只要不同的页签,前面的xxx值不同就行了,可以用用户名代替。这样只要url不同每个页签的sessionid就是不同的,后台也用不着去识别这个xxx到底是什么,实现也很简单,加个泛域名解析就行了。
15 楼 ddandyy 2007-06-21  
客户是不明白什么session什么的

他只会说  既然这个一个IE里面可以多页签 那我为什么还要开两个IE  那我要这多页签有什么用

我就是想这么操作  现在有问题  你就要做好他

其实这种东西一般都是开发结束之后 客户验收的时候客户提出来的需求  一般开发的时候 客户因为不明白什么session 所以不会提这个   而开发的也不会想什么 两个用户在一个session里同时登陆的问题  一般情况下 TEST人员即使发现了 也会以 多开一个IE就好了  就跳过去了
可是如果用户真的提出来要对应  那到时候就是很大的变动  很是伤筋断骨的

在设计框架  最少在往session里放东西的时候  最好还是考虑一下 或者说事先和客户说一下 会有这种情况 确认一下比较好

现在开发公司之间技术已经看不出什么区别来了  看的就是你是否有站在客户那边考虑问题 否则客户凭什么来选用哪个公司开发呢  程序员也是服务行业的
14 楼 weiqingfei 2007-06-21  
打开一个新的选项卡,就和从一个IE new出一个IE一样,会共享同样的session。没有办法进行url重写,那就把session id放到hidden里?
13 楼 lujh99 2007-06-21  
我想这个没必要去特别处理吧,ie7下开两个ie窗口群就可以了嘛,客户应该能谅解吧,不会一定要在一个窗口的多个页签里操作吧。
12 楼 yananay 2007-06-21  
我始终觉得 myie 这个地方应该允许设置,可是一直没找到。

相关推荐

    IE8串session的解决方法

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

    IE会话共享覆盖,用于解决登陆多账号.rar

    #修改ie默认打开参数,解决ie8会话冲突问题,例如QQ农场和QQ空间在上两个QQ时,后开的农场或空间会覆盖之前用户的农场或空间内容。 #注意:在登陆相关网站时,一定要注意,输入用户名、密码后,千万要把“记住用户名...

    Session浅析

    通常,同一个IE客户端在不关闭浏览器的情况下,Session ID是不变的。但是,某些情况如页面重载、浏览器设置或安全策略可能导致Session ID更改。理解Session ID的工作原理对于解决如`Session_Start`和`Session_End`...

    Cookie与Session机制

    Session是另一种会话跟踪技术,它在服务器端存储用户信息,每个用户会话对应一个唯一的Session ID。当用户首次访问时,服务器创建一个Session对象,分配Session ID并通过Cookie返回给客户端。之后,客户端每次请求...

    IFrame中Session丢失的解决办法

    Session是Web应用中用于存储用户特定信息的一种机制,它允许开发者在用户的会话期间保持状态,即使用户在不同的页面之间跳转,这些信息也能被保留下来。然而,在IFrame(Inline Frame)环境中,Session的管理变得...

    seesion注意问题

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

    7、会话跟踪技术.doc

    在这个过程中,为了在多个请求之间共享数据,开发者会利用Cookie和Session这两种主要的会话跟踪技术。 **Cookie技术详解** 1. **什么是Cookie** Cookie是一个由服务器生成并发送到客户端浏览器的键值对,用来识别...

    Web应用程重复登录问题

    "Web应用程重复登录问题"指的是用户在一台设备上登录后,在另一台设备或同一个浏览器的不同窗口中再次登录时,可能导致之前登录的会话失效,或者产生其他不期望的行为。这个问题主要涉及到会话管理、分布式环境下的 ...

    iframe跨域与session失效问题的解决办法

    Session,或会话,是用户访问网站时服务器创建的一个数据结构,用来跟踪用户的活动。Session通常依靠cookie来实现,通过在用户浏览器中设置一个唯一的标识符(即sessionId),每次用户请求服务器时,浏览器会携带这...

    Asp.net中实现同一用户名不能同时登陆

    例如,在银行系统或者一些重要的管理系统中,如果允许同一个账户在不同终端同时登录,可能会导致数据泄露或其他安全问题。因此,限制同一用户账户在同一时间只能在一个地方登录是非常必要的。 #### 二、实现原理及...

    express-session-socket.io:旨在与 express-session、express-session 会话存储和 sockiet.io 集成的中间件

    express-session-socket.io 用于在 socket.io 中公开表达会话对象的简单中间件用法示例: io.use(require('express-session-socket.io')(sessionStore, 'very Secure Secret', function (err, session, socket, next...

    Java_EE的会话技术Cookie和Session

    2、功能:在一次会话的范围内的多次请求间,共享数据 3、方式: 客户端会话技术:Cookie 服务器端会话技术:Session 二、Cookie 1、概念 客户端会话技术,将数据保存到客户端 2、快速入门 使用步骤: 创建Cookie对象...

    php session_start()出错原因分析及解决方法

    - **PHP在IE下的iframe跨域session丢失问题**:由于浏览器同源策略,跨域会导致会话丢失,可以通过设置 P3P 头部或使用共享域名的 cookie 来解决。 - **Failed to write session data** 错误:这通常是因为临时...

    新手菜鸟必读:session与cookie的区别

    - **session**:在多进程或多窗口浏览器环境中,不同进程可能共享同一个session,具体取决于浏览器配置。 - **cookie**:通常,每个浏览器进程或窗口有独立的cookie存储,但某些浏览器如IE8、Chrome默认会共享相同...

    带你了解session和cookie作用原理区别和用法

    - **概念**:Session是服务器端存储用户数据的一种方法,它在服务器上创建一个唯一标识(Session ID),并将此ID通过Cookie返回给客户端。每次客户端请求时,都会携带Session ID,服务器根据ID找到对应的数据。 - ...

    IE浏览器修复步骤

    这通常是为了简化后续的登录过程,但有时这种便利性可能会带来问题,例如,如果您需要切换到另一个账户或者想要确保敏感信息的安全。 以下是三种有效的方法来清空计算机上存储的用户名和密码: 1. **使用控制面板...

    cookie 详解

    - **安全性和隐私**:这一设计有助于保护用户的隐私和数据安全,避免不同站点之间意外共享敏感信息。 #### 三、Cookie与Session的比较 ##### 3.1 Cookie与Session的区别 - **存储位置**:Cookie存储在客户端,而...

    php设置session值和cookies的学习示例

    这里要注意,session是基于服务器端的,每个用户都有一个唯一的session ID,这个ID通常通过cookie发送到客户端浏览器。当用户在浏览器中访问网站时,服务器识别session ID来确定用户的登录状态。 在讨论到HTTP连接...

    Cookie&Session

    文章目录1、会话技术2、Cookie:2.1、常用API:2.2、理论知识3、Cookie案例:记住上一次4、Session4.1、常用API4.2、理论知识 1、会话技术   会话:客户端第一次向服务端发送请求时,会话建立,直到有一方断开为止...

Global site tag (gtag.js) - Google Analytics