在应用程序中,我们使用在用户模式更改后切换会话。
基本上我们有类似的东西:
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
答案 0 :(得分: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>