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