我该如何在Java EE中管理会话?

4

在我的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个回答

7
不要使用Cookie来存储会话ID,而是使用请求参数。这样每个打开的选项卡都将请求自己的会话。使用Cookie只能为浏览器中所有选项卡设置一个Cookie。
附言: 我认为在同一时刻在一个浏览器中登录2个或更多用户是不正确的。您的应用程序应检测到client_1已经登录,并限制来自同一浏览器的其他用户的登录,直到注销。例如,Google的应用程序就是这样工作的。 如果超级管理员有一个功能,可以在不登录的情况下查看client_1或client_2的数据,那就太好了。这将使他/她免于记住数十个密码,并提高工作效率(时间就是金钱,不是吗?)。

1
如果您想在同一浏览器实例中使用多个选项卡查看不同的内容,则必须重新设计会话管理,并基于URL进行关键设置。
会话在浏览器选项卡之间共享(对大多数浏览器都是如此),因此在一个选项卡中登录将影响其他选项卡的会话。

1
解决方案是使用角色而不是多个登录。您将为client_1分配SuperAdmin角色,而client 2则没有。这将减少需要登录两次的需求。
但无论如何,您应该只允许一个用户同时登录。登录过程应使先前的会话失效。我忘记了Java EE中确切的代码,但它类似于session.invalidate()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接