2012-02-05 86 views
2

即時建立一個小的web應用程序,使用碼頭8作爲服務器和websockets。碼頭8 WebSocket和會話

在客戶端(瀏覽器)方面:用戶使用他的瀏覽器打開我的index.html,並打開並建立與我的碼頭服務器的新WebSocket連接。

在服務器端,我有一個WebSocketServlet偵聽WebSocket連接。

@Override 
public WebSocket doWebSocketConnect(HttpServletRequest request, String arg1) { 
    System.out.println("doWebSocketConnect"); 
    System.out.println("WebSocket "+request.getSession().getId()); 
    return new UserWebSocket(request.getSession()); 
} 

UserWebSocket是實現碼頭的,用於接收和通過的WebSockets發送消息WebSocket.OnTextMessage接口的類。

到目前爲止好,一切正常,迄今爲止。

所以我現在想要做的,是HttpSession的合作,以確定當前用戶,因爲 中的index.html網站也可以做其他(非的WebSocket)Servlet的一些Ajax調用,如提交一些簡單的表單數據通過HTTP POST等

例如看看我的SearchServlet:

public class SearchServlet extends HttpServlet{ 

... 

@Override 
public void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 

    System.out.println(request.getSession()); 
} 
... 
} 

我的問題是,這兩個servlet(WebSocketServlet和SearchServlet)有兩種不同勢HttpSession對象有兩個不同勢HttpSession的IDS:

例如,我的WebSocketServlet在doWebSocketConnect()上獲得了會話ID = 1dwp0u93ght5w1bcr12cl2l8gp,而SearchServlet獲得了會話ID = 1sbglzngkivtf738w81a957pp,但用戶仍處於同一瀏覽器中並處於同一頁面(index.html)且未重新加載頁面等。建立WebSocket連接和SearchServlet通話之間的時間只需幾秒鐘...

有什麼建議嗎?

編輯:順便說一句。 兩個Servlet是在同一個ServletContext的:

ServletContextHandler servletContext = new ServletContextHandler(ServletContextHandler.SESSIONS); 
     servletContext.setContextPath("/servlets"); 
     servletContext.addServlet(new ServletHolder(new MyWebSocketServlet()),"/liveCommunication"); 
     servletContext.addServlet(new ServletHolder(new SearchServlet()),"/search"); 

回答

2

有兩個可能的原因,我可以看到。

- 您的服務器配置不正確。由於您沒有提供關於您如何運行Jetty的詳細信息,以及您如何配置它,因此您可能在此處引入了問題。

- 這實際上是一個計時問題。
我假設你的index.html是靜態內容,所以它不會自行創建會話。

在index.html中有一些JavaScript將啓動兩個單獨的請求。一個是WebSocket,另一個是XMLHttpRequest(AJAX)。由於這兩個請求是同時啓動的,因此它們具有相同的Cookie集合 - ,在這種情況下,它們是

在每種情況下,由於請求不提供cookie,因此服務器必須生成新的HTTP會話。有服務器不知道這兩個請求來自同一個客戶端,所以創建了2個獨立的HTTP會話。

如果是這種情況,那麼您可以通過在index.html前放置一個過濾器來強制創建會話,從而可以很簡單地解決此問題。

+0

謝謝你的回答。我想你的權利與你的假設nr。 2.我使用碼頭作爲自己的嵌入式服務器。我想,問題是我的靜態內容文件(index.html)還沒有啓動Http會話。爲了解決我的問題,index.html必須啓動一個新的會話,然後WebSocketServlet和SearchServlet應該具有與index.html相同的會話。我的問題是,我不知道如何實現它。我有一個ResourceHandler resourceHandler = new ResourceHandler(); resourceHandler.setWelcomeFiles(new String [] {「index.html」}); 我在哪裏啓用SESSION? – sockeqwe 2012-02-06 11:39:46

+0

似乎現在使用包裝ResourceHandler的SessionHandler工作...感謝您的幫助! – sockeqwe 2012-02-06 12:56:58