質問

私は JEE を初めて使用するため、これが私を混乱させます。によると HttpSession.html#setMaxInactiveInterval(int 間隔) ドキュメンテーション

アン interval の値 zero 以下は、 セッションは決してタイムアウトしないでください.

しかし、私の教科書(すでに数年前のものなので、常に正しいとは限らないと思います)によると、引数としてゼロを使用すると、セッションがすぐにタイムアウトになります。

このコード

public class Test extends HttpServlet {

    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("text/html");
        response.setCharacterEncoding("utf-8");

        PrintWriter out = response.getWriter();

        HttpSession session = request.getSession();
        session.setAttribute("foo", 42);
        session.setMaxInactiveInterval(0);

        out.println(session.getAttribute("foo"));//problem here

    }
}

Glassfish 4.0 で使用されているものは、新しい公式ドキュメントではなく教科書の理論を確認しているようです。 HTTP ステータス 500 - 内部サーバー エラー エラーメッセージ付き

java.lang.IllegalStateException: getAttribute: Session already invalidated

ここで何が起こっているのでしょうか?これは Glassfish 4.0 のバグですか、それともドキュメントが間違っていますか?それとも第三の選択肢があるのでしょうか?


PS.このコードは負の値でも正常に動作します(セッションは無効になりません)。 -1 の代わりに 0 私のコードでは。何が問題なのか興味があるだけです 0.

役に立ちましたか?

解決

サーブレット仕様 セッションタイムアウト状態に関する章

定義上、セッションのタイムアウト期間が-1に設定されている場合、セッションは期限切れになりません。

したがって、GlasshFish はそれをカバーしているようです。仕様の中に、同じことが の値にも当てはまるはずであるという参考文献が見つかりません。 0setMaxInactiveInterval(). 。しかし、それは言う

session-config このWebアプリケーションのセッションパラメーターを定義します。サブ要素 session-timeout このWebアプリケーションで作成されたすべてのセッションのデフォルトセッションタイムアウト間隔を定義します。指定されたタイムアウトは、丸数分で表現する必要があります。 タイムアウトが0以下の場合, 、コンテナは、セッションのデフォルトの動作が決してタイムアウトではないことを保証します。この要素が指定されていない場合、コンテナはデフォルトのタイムアウト期間を設定する必要があります。

他のヒント

これはすでにタイムアウトしているため無効です

session.setMaxInactiveInterval(0); // mean inactive immediately

したがって、これは正しいエラー メッセージです。(詳細については、最初の本を参照してください。)

存在しないオブジェクト値にアクセスしようとしています。それはすでに破壊されています

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top