1

在应用程序中,一旦用户模式发生变化,我们就会切换会话。

所以基本上我们有这样的东西:

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

现在发生了问题:超时后,会话没有被删除。在调试了一些内部代码后,我发现在org.eclipse.jetty.server.session.AbstractSession.timeout()会话中没有删除 if _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 回答