在不使用会话上下文的情况下在Web应用程序中保留值

时间:2012-09-13 19:09:09

标签: jsp servlets

我有一个“变量”,用户可以在JSP / Struts应用程序中修改,该应用程序必须在整个Web应用程序的会话中保留。它们可能会离开设置和查看的页面(仍然停留在应用程序中),当它们返回时,它们最后为该变量设置的值应该仍然存在。

显而易见的选择是将其存储为会话属性。这就是几年前我会做的。但是,Internet Explorer 8及更高版本会导致Web应用程序用户为同一站点打开的所有浏览器创建一个会话。换句话说,如果用户在浏览器中打开我的应用程序,然后在另一个浏览器中再次打开它,则它们共享一个会话。我认为他们正在共享代表该会话的cookie。结果是,如果他们在一个浏览器的会话中更改了该值,那么该值也将在另一个浏览器中更改。

我的用户将在一个工作站上多次运行Web应用程序,我需要他们能够在不同的浏览器窗口(甚至标签)中为上述变量设置不同的值,并具有不同的值坚持使用该浏览器(或标签)生命周期,但不会影响同一应用程序的任何其他打开的浏览器(或标签)。

所以,据我所知,使用会话属性是不可能的。 (那么有IE -nomerge选项,但没有办法强制用户使用该选项启动IE。)

我希望我不是第一个处理这个问题的人,并且那里的某个人已经优雅地解决了这个问题,并且该人阅读了这篇文章并作出回应。

1 个答案:

答案 0 :(得分:2)

如果服务器都发送回相同的会话ID,则无法区分不同的选项卡或窗口。但是,如果您需要这种功能,那么我会考虑在URL中建立“差异”。例如,一个选项卡可能具有/ myapp / xxxxx /,而另一个选项卡可能具有/ myapp / yyyyy /。可能都共享相同的会话,但服务器仍然可以区分它们。只要浏览器总是在某处返回魔术部分(例如:xxxxx),URL的实际格式就不是很重要。在服务器端,您可以根据sessionid和发出请求的URL跟踪每个会话的多个号码。

唯一要决定的是你如何注意到一个新的标签或窗口已经打开,因为你必须分配一个新的URL,但那只是管道。例如,您可以设置一个本地js变量,该变量需要设置为与URL匹配,然后当新选项卡打开时,此变量将不匹配,因此您可以转到新的相应URL并设置本地变量。