2012-02-05 10 views
2

imはjetty 8をサーバーとWebソケットとして使用する小さなWebアプリケーションを構築しています。Jetty 8 WebSocketとSession

クライアント側(ブラウザ側):ユーザーが自分のブラウザであるindex.htmlを開き、それが開き、jettyサーバとの新しい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は、WebSocketを介してメッセージを受信し、送信するための桟橋のWebSocket.OnTextMessageインターフェイスを実装するクラスです。

これまでのところ、とてもうまくいっています。

index.htmlサイトでは、他の(WebSocket以外の)サーブレットでもいくつかの単純なフォームデータを送信するようなAjax呼び出しを行うことができるため、現在のユーザーはHttpSessionを使用して現在のユーザーを識別します。など

HTTP POSTを経由して例えば、私のSearchServletを見ている:

public class SearchServlet extends HttpServlet{ 

... 

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

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

私の問題は、この2つのサーブレット(WebSocketServletとSearchServlet)が2つの切り抜いたHttpSessionのIDを持つ2切り抜いたHttpSessionオブジェクトを持っていることを、次のとおりです。

私のWebSocketServletはdoWebSocketConnect()のセッションID = 1dwp0u93ght5w1bcr12cl2l8gpを持っていて、SearchServletはセッションID = 1sbglzngkivtf738w81a957ppを持っていますが、ユーザーは同じブラウザと同じページ(index.html)にあり、リロードしませんWebSocket接続とSearchServlet呼び出しを確立するまでの時間はほんの数秒です...

何か提案がありますか?

EDIT:btw。 どちらサーブレットは同じの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

私が見ることができる2つの原因が考えられます。

- サーバーが正しく構成されていません。どのようにJettyを実行しているか、そしてどのように設定したのかについての詳細はまだ述べていないので、そこに問題を導入した可能性は確かです。

- これは実際にタイミングの問題です。
index.htmlは静的コンテンツであると仮定して、独自のセッションを作成しません。

index.htmlには、別々の2つのリクエストを開始するjavascriptがあります。 1つはWebSocket、もう1つはXMLHttpRequest(AJAX)です。 2つのリクエストが同時に開始されるため、同じCookieのセットがあります。この場合、なしです。

要求ごとにCookieがないため、サーバーは新しいHTTPセッションを生成する必要があります。サーバーは、2つの要求が同じクライアントからのものであることを知らないので、2つの別々のHTTPセッションが作成されます。

この場合、index.htmlの前にフィルタを置くことで簡単に修正できます。これにより、セッションが強制的に作成されます。

+0

ありがとうございました。私はあなたの推測であなたの権利を推測します。 2.私はjettyを独自の組み込みサーバーとして使用します。そして、私の推測では、問題は私の静的コンテンツファイル(index.html)がHTTPセッションをまだ開始していないことです。私の問題を解決するために、index.htmlは新しいセッションを開始し、WebSocketServletとSearchServletはindex.htmlと同じセッションを持つ必要があります。 私の問題は、それを実装する方法がわかりません。私はResourceHandlerを持っています。resourceHandler = new ResourceHandler(); resourceHandler.setWelcomeFiles(new String [] {"index.html"}); SESSIONはどこで有効にしますか? – sockeqwe

+0

ResourceHandlerをラップするSessionHandlerを使用しているようです...ご協力いただきありがとうございます! – sockeqwe

関連する問題