如何在Java EE中管理会话?

时间:2009-04-13 14:12:15

标签: java java-ee session

在我的Java EE应用程序中,我遇到了会话问题。不同的用户可以登录到该应用程序,指定的用户可以看到他被授权的数据。他不应该看到其他用户数据。为了区分用户,我们使用Client_ID。一旦用户登录,我们就从数据库中获取此Client_ID并在会话中将其设置为:

session.setAttribute("Client_ID",user.getClient_ID())

我们在整个应用程序中访问此会话值并将相关数据提取到Client_ID。当用户在单个浏览器上工作时,这可以正常工作,但问题是:

假设有一个SuperAdmin,他需要查看他下的所有客户。 SuperAdmin以client_1身份登录,并再次登录为client_2。 SuperAdmin使用相同的浏览器记录了这两次。当我刷新client_1浏览器时,我看到client_2详细信息,这不应该发生。

我认为我们的应用程序在同一浏览器中对两个不同的登录使用相同的会话。这个问题会有什么解决方案?刷新页面时,我应该看到特定客户端的正确数据。

3 个答案:

答案 0 :(得分:7)

请勿使用Cookie存储会话ID,而是使用请求参数。 因此每个打开的选项卡都会请求自己的会话。使用cookie,浏览器中的所有选项卡只有一个cookie。

P.S .: 我认为在同一时刻在一个浏览器中登录2个或更多用户是不正确的。您的应用程序应该检测到client_1已经对其进行了签名,并且在注销之前还可以从同一浏览器中为其他用户登录。例如,Google的应用程序就是这样运作的。 如果SuperAdmin具有在不登录的情况下查看client_1或client_2数据的功能,也会很棒。这将使他/她不会记住几十个密码并且会提高工作效率(时间就是金钱,不是吗?)。

答案 1 :(得分:1)

如果您希望同一浏览器实例中的多个标签看到不同的内容,那么您将不得不重新设置会话管理和关键内容。

会话在浏览器选项卡之间共享(对于大多数浏览器都是如此),因此使用一个选项卡登录将影响其他选项卡的会话。

答案 2 :(得分:1)

解决方案是使用角色而不是多次登录。您将为client_1提供SuperAdmin角色,而客户端2则不提供。这将减少登录两次的需要。

但无论如何,您应该只允许一个用户同时登录。登录过程应使前一个会话无效。我忘记了Java EE中的确切代码,但它类似于session.invalidate()