1

アプリケーションでは、ユーザーモードが変更されるとセッションを切り替えるために使用します。

つまり、基本的に次のようなものがあります。

request.getSession(false).invalidate();
request.getSession(true);

ここで問題が発生します。タイムアウト後、セッションは削除されません。org.eclipse.jetty.server.session.AbstractSession.timeout()いくつかの内部コードをデバッグした後、セッション内のが削除されないことがわかりました_requests > 0。また、呼び出し中に実際のセッションが置き換えられた場合でも、セッションの実行が増加し、同じセッションが減少するため、_requestsはゼロより大きくなります。org.eclipse.jetty.server.session.SessionHandler.doScope(String, Request, HttpServletRequest, HttpServletResponse)complete()access

誰かが同じ問題を経験し、それを解決することができましたか?

更新:回避策を作成しました。以下の承認された回答を参照してください。

更新:ジャージーコミュニティのバグ:https ://bugs.eclipse.org/bugs/show_bug.cgi?id = 377610

4

1 に答える 1

1

SessionHandlerをオーバーライドすることで、この問題を解決しました。

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.session.SessionHandler;

public class MySessionHandler extends SessionHandler {

    @Override
    public void doScope(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {

        HttpSession oldSession = request.getSession(false);
        super.doScope(target, baseRequest, request, response);
        HttpSession newSession = request.getSession(false);

        if (newSession != null && oldSession != newSession) {
            getSessionManager().complete(newSession);
        }
    }
}

アプリケーションのコンテキストでは:

<Set name="sessionHandler">
     <New class="*************.MySessionHandler">
     </New>
</Set>
于 2012-04-25T07:24:14.207 に答える