web-dev-qa-db-ja.com

Java servlet-セッションのクリーンアップ(HttpServletRequest)

Javaサーブレットとリクエストを処理する最良の方法に関する一般的な質問。リモートサーバーリクエストから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();
13
user82302124
HttpSession session = request.getSession(false);
if (session != null) {
    session.invalidate();
}

ドキュメンテーションで提案されているように進む適切な方法です。クライアントが新しいリクエストを送信すると、新しいセッションが作成されます。

あなたはあなたのセッションがまだメモリを占有していると言いました。セッション上のそれらのオブジェクトへの他の参照はありますか?

また、次の情報もご覧ください: Servlet Session behavior and Session.invalidate

24
csupnig

を使用してセッションから属性を削除できます

session.removeAttribute("attribute name");
5
mykey

で試す

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

セッションの動作、つまり複数のリクエスト間で状態を保持したくない場合。セッションを作成/使用する理由は何ですか。セッションを作成したり、セッションに何も保存したりしないでください。

コードがセッションを使用していないことを確認するには、getSession()メソッドをオーバーライドするリクエストラッパーを作成します。

1
Ramesh PVK