【问题标题】:java httpsession is valid?java httpsession有效吗?
【发布时间】:2011-10-06 08:42:08
【问题描述】:

我在 tomcat 中使用 java servlet API。

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

我试过了:

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

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

【问题讨论】:

    标签: java servlets httpsession


    【解决方案1】:

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

    【讨论】:

    • 这实际上并没有那么有用,因为您仍然必须处理(或接受)那里出现 Illegal StatException 的可能性。因为在检查和会话获取之间的微秒内,会话可能会失效。
    • 我的(可能是不正确的)假设是,当 tomcat 看到会话 id 时,在传递对 servlet 的请求之前,它会检查它是否已经超时,如果没有重置无论默认会话长度是多少,都需要让会话保持活动状态。没有?
    • 但您可能同时有注销请求。多线程、多 servlet,还记得吗?
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      请看这里Servlet Filter

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

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

      【讨论】:

      • 是的,过滤器可以工作。我想在我的示例中展示基础知识。使用一个 servlet,可以在 servlet 中执行此检查,但是当您开始管理多个 servlet 时会变得非常混乱。在这种情况下,移动到过滤器会更好
      • 你是对的,你的反应很好..只是想加我的2美分
      猜你喜欢
      • 2019-02-22
      • 1970-01-01
      • 2011-07-05
      • 2012-09-22
      • 2017-08-13
      • 1970-01-01
      • 2014-05-02
      • 2012-08-29
      • 1970-01-01
      相关资源
      最近更新 更多