5

我在 tomcat 中使用 java servlet API。

我将用户名和带有属性 username 的 httpsession 保存在哈希表中,我想知道是否有办法检查 httpsession 是否有效。

我试过了:

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

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

4

3 回答 3

11

无需将 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();
}

附带说明一下,如果我正确阅读了您的问题并且您将信息存储在自己的地图中,则需要注意不要造成内存泄漏并自己清除哈希表中的条目。

于 2011-07-15T17:54:06.780 回答
2

我同意肖恩的观点。我要补充一点,这种检查的一个好习惯是使用过滤器

见这里Servlet 过滤器

只需将 Sean 编写的代码放入 Filter 中即可。在 web.xml 中定义您的过滤器,每次请求进入时,过滤器都会执行。

这样您就可以验证用户是否是 auth。不会弄乱您的 servlet 代码。

于 2011-07-15T18:13:45.860 回答
0

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

于 2011-07-15T17:46:35.727 回答