14

关于 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();
4

5 回答 5

26
HttpSession session = request.getSession(false);
if (session != null) {
    session.invalidate();
}

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

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

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

于 2012-04-05T21:39:29.767 回答
5

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

session.removeAttribute("attribute name");
于 2012-04-06T12:01:47.677 回答
2

尝试

session = request.getSession(false); // so if no session is active no session is created
if (session != null)
  session.setMaxInactiveInterval(1); // so it expires immediatly
于 2012-04-05T21:27:13.800 回答
1

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

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

于 2012-04-06T05:26:45.650 回答
0

在 web.xml 中设置超时时间

于 2019-11-10T12:16:53.250 回答