繁体   English   中英

如果在运行时中替换了会话,Jetty不会删除超时的会话

[英]Jetty does not remove timed-out session, if the session was replaced in runtime

在应用程序中,我们用于在用户模式更改后切换会话。

所以基本上我们有这样的事情:

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

我已经通过覆盖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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM