【问题标题】:Java servlet - Session cleanup (HttpServletRequest)Java servlet - 会话清理 (HttpServletRequest)
【发布时间】:2012-04-19 15:22:42
【问题描述】:

关于 java servlet 和处理请求的最佳方式的一般问题。如果我从远程服务器请求中点击我的 doGet 方法:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
  ....
  <do work here>
  ....
  kill(request);
}

private void kill(HttpServletRequest request) {
//How do I kill the user session here?
}

在我处理完请求并将输出生成给请求者之后,我想基本上“杀死”他们的会话。目前,该会话会持续存在,因此会占用内存。然后一旦达到最大值,所有其他调用都会超时。

我尝试使用请求对象创建一个 HttpSession 对象,但得到了相同的结果:

HttpSession session = request.getSession();
session.invalidate();

【问题讨论】:

  • 我的印象是您的具体问题需要以不同的方式解决。
  • 可能。最终目标是我想在处理他们的请求后结束我的会话池中的会话。无论是杀死请求对象还是为该会话创建会话对象以删除它,我都不确定。

标签: java session servlets request


【解决方案1】:

在 web.xml 中设置超时时间

【讨论】:

    【解决方案2】:
    HttpSession session = request.getSession(false);
    if (session != null) {
        session.invalidate();
    }
    

    是文档建议的正确方法。客户端发送新请求后,将创建一个新会话。

    您提到您的会话仍然占用内存。您对会话中的这些对象有任何其他引用吗?

    您可能还想看看:Servlet Session behavior and Session.invalidate

    【讨论】:

      【解决方案3】:

      您可以使用以下方法从会话中删除属性

      session.removeAttribute("attribute name");
      

      【讨论】:

        【解决方案4】:

        如果您不希望会话行为,即在多个请求之间具有状态。你为什么要创建/使用会话。不要创建会话或不要在会话中存储任何内容。

        为确保您的代码未使用会话,请编写一个请求包装器,该包装器将覆盖 getSession() 方法。

        【讨论】:

          【解决方案5】:

          试试

          session = request.getSession(false); // so if no session is active no session is created
          if (session != null)
            session.setMaxInactiveInterval(1); // so it expires immediatly
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-12-22
            • 2013-12-06
            • 2011-08-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-07-05
            • 2015-03-13
            相关资源
            最近更新 更多