不同用户之间session内容互相冲突

本文探讨了在多用户环境中使用Session管理时遇到的对象覆盖问题,并提供了有效的解决方案。介绍了如何通过同步机制确保线程安全,避免不同用户的Session数据互相干扰。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现象是:  
  A用户在1.jsp页面中访问数据库,返回的是一个对象,用下面这种办法:  
  session.setAttribute("obj",myobj);  
  把这个对象放到session中。然后在2.jsp中用  
  MyObjects   obj=(MyObjects)session.getAttribute("obj");  
  方法得到这个对象,再从中取值。  
   
  B用户也作同样的操作。  
   
  如果A先,B后,那么A之前放到session中的obj就会被B的obj替换掉。

解决方法:

首先你的储存个人信息的类的属性不可以设置为static,  
  检查是否存在这个问题,如果这里没有问题。  
   
  那么因为你自己写的类是线程不安全的,你如果在这个类中对session进行操作,当  
  多个用户同时访问是,可能出现上边的问题。  
  解决办法,在你的类之前,加上   synchronized   关键字,进行同步。确保一次只有一个用户执行里边的方法。当然,也可以只对某几个方法加上这个关键字。  

会话管理一般是由servlet引擎所提供的,用来跟踪所有的客户端-服务器连接,为每一个连接分配唯一的Id,在建立连接时分配给客户端,并被传送给后续响应中的客户端.(使用ctrl+N新打开的窗口仍然属于后续连接)
    会话管理不仅仅是识别连接,每个会话是一个java对象(HttpSession类),所以通过ip来识别说法是不对的.
    将sessionId分配给客户端,不同的服务器有不同的方法,常见的技术有如下三种:
    1 ) URL重写
    session id的名称-值添加到URL(名称必须是jsessionid)
    2 ) 通过cookie
    cookie的名称必须是JSESSIONID,需要浏览器支持cookie
    3 ) 加密套接字协议层(SSL)
    Http协议的SSL已经建立在会话管理中

使用不同的新开窗口分别登录是不同的连接,session也是不一样的.

我们写一个测试页面来检验一下sessionId的值和cookie中的值:
页面的代码如下(testSession.jsp):







<1>在weblogic中测试

打开一开窗口,页面显示为:
Cookie in the request:
JSESSIONID : BFbXpjlEhXOdHjJbmNal8NwPniBA4UUH2Yu0SWAeW69iQEfqCyYn!-2110814544

Request session Id : BFbXpjlEhXOdHjJbmNal8NwPniBA4UUH2Yu0SWAeW69iQEfqCyYn!-2110814544!1095064343206

使用ctrl+N打开一个新窗口的页面显示为:
Cookie in the request:
JSESSIONID : BFbXpjlEhXOdHjJbmNal8NwPniBA4UUH2Yu0SWAeW69iQEfqCyYn!-2110814544

Request session Id : BFbXpjlEhXOdHjJbmNal8NwPniBA4UUH2Yu0SWAeW69iQEfqCyYn!-2110814544!1095064343206

重新开一个窗口,页面显示为:
Cookie in the request:
JSESSIONID : BFbyitXTY2Kt72b2vn2uvrzHsGjt98larvxKSz4fcZngOsIVsGSI!-2110814544

Request session Id : BFbyitXTY2Kt72b2vn2uvrzHsGjt98larvxKSz4fcZngOsIVsGSI!-2110814544!1095064562753

我们可以看到对于每个新打开的窗口其session是不一样的


<2>在oracle IAS中测试

新开窗口,页面显示为:
Cookie in the request:
JSESSIONID : c3df128b9f7c4a60a75a88c3cb3cb5e2.s6Tv-h0Ka3CNa30McybtahqM-x4R-xyK-x4Sa2SPmxqTc3mInAeMbN8QmN0Sc2SHc30Ka2bMn69Rnk8IrRrR-B9ymwTxpQOxbhqOax4R8R9ymBrzmwbMn69Rnk8xn6jAmljGr5XDqQLvpAe_

Request session Id : c3df128b9f7c4a60a75a88c3cb3cb5e2

使用ctrl+N打开新窗口的页面显示为:
Cookie in the request:
JSESSIONID : c3df128b9f7c4a60a75a88c3cb3cb5e2.s6Tv-h0Ka3CNa30McybtahqM-x4R-xyK-x4Sa2SPmxqTc3mInAeMbN8QmN0Sc2SHc30Ka2bMn69Rnk8IrRrR-B9ymwTxpQOxbhqOax4R8R9ymBrzmwbMn69Rnk8xn6jAmljGr5XDqQLvpAe_

Request session Id : c3df128b9f7c4a60a75a88c3cb3cb5e2

重新开一个窗口,页面显示为:
Cookie in the request:
JSESSIONID : 556dca64e085417bad8f9d88be0401ee.s6Tv-h0Ka3CNa30McybtahqM-x4R-xyK-x4Sa2SPmxqTc3mInAeMbN8QmN0Sc2SHc30Ka2bMn69Rnk8IrRrR-B9ymwTxpQOxbhqOax4R8R9ymBrzmwbMn69Rnk8xn6jAmljGr5XDqQLvpAe_

Request session Id : 556dca64e085417bad8f9d88be0401ee

同样我们可以看到每个新开窗口其session是不一样的

### 手动安装的 CUDA 与 Anaconda 环境中的 CUDA 是否会相互影响 当在同一台机器上同时存在手动安装的 CUDA 和通过 Anaconda 安装的 CUDA 时,确实有可能发生冲突或互相影响的情况。具体的影响取决于如何管理和配置环境变量以及使用的工具链。 #### 环境变量管理 为了使系统能够识别并使用特定版本的 CUDA,在大多数情况下需要设置 `PATH` 和 `LD_LIBRARY_PATH` 这两个环境变量来指向相应的 CUDA 文件夹位置[^1]。如果这两个路径被错误地覆盖或者重复定义,可能导致程序调用了不期望的 CUDA 版本,进而引发兼容性和性能方面的问题。 对于 Anaconda 用户来说,默认情况下 Conda 可能不会自动修改全局环境变量以避免干扰其他软件包的工作流;但是可以选择让 Anaconda 自动更新某些环境变量以便更容易访问其中的内容[^3]。这种做法虽然方便但也增加了潜在的风险——特别是当你已经有一个独立的手动安装版 CUDA 并且已经在使用它的时候。 #### 工具链的选择 另一个需要注意的地方是在 PyTorch 或 TensorFlow 等框架内部是如何寻找可用 CUDA 资源的。例如 Python 的扩展模块可以通过检查 `CUDA_HOME` 或者 `CUDA_PATH` 来定位 CUDA SDK 的根目录[^2]。因此即使没有显式更改过任何环境变量,只要这些特殊变量存在于当前 shell session 中,就可能改变默认行为从而优先选用某个特定版本的 CUDA。 为了避免两者之间冲突: - **隔离工作区**:创建不同的虚拟环境用于不同需求下的开发测试活动; - **谨慎调整环境变量**:仅在必要时候才临时性地向 `PATH` 或 `LD_LIBRARY_PATH` 添加新的条目而不是永久保存它们; - **明确指定依赖关系**:确保所用到的所有第三方库都能正确解析所需的 CUDA API 接口而不管实际运行在哪种环境下。 ```bash # 创建一个新的 conda 环境,并激活该环境 conda create --name cuda_test python=3.8 conda activate cuda_test # 安装所需版本的 cudatoolkit conda install pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值