【问题标题】:Jetty does not remove timed-out session, if the session was replaced in runtime如果会话在运行时被替换,Jetty 不会删除超时会话
【发布时间】:2012-05-05 05:30:51
【问题描述】:

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

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

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

【问题讨论】:

  • 您在这里与哪个会话管理器一起工作?哈希、jdbc、mongodb、其他?

标签: java session jetty session-state session-timeout


【解决方案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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 2015-10-10
    • 2022-12-07
    • 2014-06-21
    • 1970-01-01
    相关资源
    最近更新 更多