Java HttpSession 是否有效?

5

我在Tomcat中使用Java Servlet API。

我在哈希表中保存了用户名以及与属性"username"相关的httpsession,我想知道是否有一种方法可以检查httpsession是否有效。

我尝试过:

try {
    String user = httpSession.getAttribute("username")
    return "is valid";
} catch (IllegalStateException e) {
    return "is not valid";
}

如果我不希望“已登录”用户从多个地方连接,我该怎么办?如果我只控制创建新会话,我无法知道他是否已经使用另一个会话连接。

3个回答

10

不需要在自己的哈希表中存储httpSession。

查看HttpServletRequest的API。如果您查看方法getSession(Boolean x)(传递false以避免创建新会话),它将确定会话是否有效。

这是一个例子

public void doGet(HttpServletRequest req, HttpServletResponse res) {
    HttpSession session = req.getSession(false);
    
    if (session == null) {
       //valid session doesn't exist
       //do something like send the user to a login screen
    }

    if (session.getAttribute("username") == null) {
       //no username in session
       //user probably hasn't logged in properly
    }

    //now let's pretend to log the user out for good measure
    session.invalidate();
}

顺便提一下,如果我正确理解了你的问题并且你正在存储自己的映射信息,那么你需要小心不要创建内存泄漏,并且自己清除哈希表中的条目。


2
我同意Sean的观点。另外,针对这种检查的好做法是使用过滤器。
请参见Servlet Filter
只需将Sean编写的代码放入过滤器中即可。在web.xml中定义您的过滤器,每当请求进来时,过滤器就会执行。
这样,您就可以验证用户是否已经认证,而不会使您的servlet代码变得混乱。

是的,过滤器会起作用。我想在我的示例中展示基础知识。 使用一个servlet时,在servlet中进行此检查是可以的,但是当您开始管理多个servlet时,这样做会变得非常混乱。在这种情况下移动到过滤器更好。 - Sean
你说得对,你的回答非常好。只是想再补充一点我的看法。 - Cygnusx1

0
与其检查保存的会话是否有效,您应该查看 servlet 上的 HttpServletRequest,并检查其中的 isRequestedSessionIdValid()。在 servlet 中工作时,您可以始终从 Request 中获取 Session,而不是将其保存到哈希表中。

这实际上并不是很有帮助,因为你仍然必须处理(或接受)那里出现非法状态异常的可能性。因为在检查和获取会话之间的微秒内,会话可能已经失效了。 - MJB
我的(也许是错误的)假设是,当Tomcat看到会话ID时,在将请求传递给Servlet之前,它会检查会话是否已超时,如果没有,则重置时间以保持会话活动状态,直到默认会话长度结束。不是吗? - Terrell Plotzki
1
但是你可能同时有一个注销请求。多线程,多servlet,记得吗? - MJB

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