2012-04-24 52 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>