2012-04-24 45 views
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)access会议complete()运行增加,同一个会话下降,即使调用过程中的实际会话被换下!

有没有人遇到同样的问题,并设法解决它?

更新:我创建了一个解决方法。见下面的接受答案。

更新:错误泽西社区:https://bugs.eclipse.org/bugs/show_bug.cgi?id=377610

+0

哪个会话管理器你在这里工作吗?哈希,jdbc,mongodb,其他? – 2012-04-24 16:18:13

+0

@jessemcconnell哈希 – Tarlog 2012-04-24 16:42:47

回答

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>