明确设置JSESSIONID

时间:2013-12-21 21:21:39

标签: java session-variables jsessionid

所以,我正在构建一个应用程序,我希望用户能够向另一个用户发送链接并处理相同的数据。几乎没有必要将数据持续超过15分钟,我希望应用程序不必依赖数据库。

我有一些变量,我目前存放在HttpSession中。

理想情况下,我希望能够在URL中设置参数“sid”,并使用它在第二个客户端的浏览器上设置会话ID - 即接收到SID链接的浏览器。

不幸的是,一旦设置完毕,似乎无法更改当前会话的SID。

到目前为止,我提出的唯一解决方案是使用HttpPost.setHeader("Cookie", "JSESSIONID="+ getSessionId())方法引用doGet(),并以这种方式获取具有特定会话的数据,但这看起来非常笨重。

有什么建议吗?

修改

这似乎变成了关于将两个用户设置为具有相同会话的智慧的讨论,因此会话变量可以保持相同。请注意,我正在寻找的是非db,即轻量级解决方案。 PHP允许您任意设置会话ID来执行此操作,但我在此实例中部署到Tomcat。允许轻量共享一些参数的东西,就是它......

我所做的就是使用context.setAttribute()设置上下文变量。像罪一样丑陋,但除非有人有任何更好的想法,否则我只能想出来。

1 个答案:

答案 0 :(得分:2)

这种方法存在一些安全问题,因为您正在使用1模拟[会话劫持]:

  

在计算机科学中,会话劫持,有时也称为cookie   劫持是有时利用有效的计算机会话   也称为会话密钥 - 用于未经授权的信息访问   或计算机系统中的服务。特别是,它用于指代   窃取用于向远程用户验证用户的魔术cookie   服务器。它与Web开发人员特别相关,如HTTP   用于在许多网站上维护会话的cookie可以很容易   被攻击者使用中间计算机或访问来窃取   受害者计算机上保存的cookie(请参阅HTTP cookie被盗)。

更好的方法是以两种用户都可以从会话中接近数据的方式设置数据。如果您使用的是单服务器,则可以使用服务器中的某些全局数据执行此操作。在集群环境或云环境中,您需要一些通用存储(即数据库,全局缓存等)。

修改

您正在通过不同会话在两个用户之间共享数据。

  

每个Java虚拟机每个“Web应用程序”有一个上下文   其中一个属性允许servlet容器给servlet   其他信息。

属性用于在同一Web应用程序的servlet之间共享容器内的数据。

对于群集:

  

如果Web应用程序在其中标记为“分布式”   部署描述符,每个都有一个上下文实例   虚拟机。在这种情况下,上下文不能用作   共享全球信息的位置(因为信息不会   真正的全球化)。改为使用像数据库这样的外部资源。