Jetty 8 WebSocket и Session - PullRequest
       27

Jetty 8 WebSocket и Session

2 голосов
/ 05 февраля 2012

Я создаю небольшое веб-приложение, которое использует Jetty 8 в качестве сервера и веб-сокетов.

На стороне клиента (браузера): пользователь открывает своим браузером мой 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 - это класс, который реализует интерфейс Jetty WebSocket.OnTextMessage для получения и отправки сообщений через веб-сокеты.

Пока все хорошо, пока все отлично работает.

Итак, что я сейчас хочу сделать, это работать с HttpSession для идентификации текущего пользователя, потому что сайт index.html также может выполнять некоторые вызовы ajax для других (не WebSocket) сервлетов, например, отправлять некоторые простые данные формы через HTTP POST и т. д.

Например, посмотрите на мой SearchServlet:

public class SearchServlet extends HttpServlet{

...

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

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

Моя проблема в том, что эти два сервлета (WebSocketServlet и SearchServlet) имеют два разных объекта HttpSession с двумя разными идентификаторами HttpSession:

Например, мой WebSocketServlet получил идентификатор сеанса id = 1dwp0u93ght5w1bcr12cl2l8gp в doWebSocketConnect (), а SearchServlet получил идентификатор сеанса id = 1sbglzngkivtf738w81a957pp, но пользователь все еще находится в том же браузере и в том же браузере. перезагрузил страницу и т. д. Время между установлением соединения WebSocket и вызовом SearchServlet составляет всего несколько секунд ...

Есть предложения?

РЕДАКТИРОВАТЬ: кстати. Оба сервлета находятся в одном ServletContext:

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

1 Ответ

2 голосов
/ 06 февраля 2012

Есть две возможные причины, которые я вижу.

1 - Ваш сервер настроен неправильно. Поскольку вы не предоставили подробных сведений о том, как работает Jetty и как вы его настроили, вполне возможно, что вы ввели проблему там.

2 - На самом деле это проблема времени.
Я предполагаю, что ваш index.html является статическим контентом, поэтому он не создает сеанс сам по себе.

В index.html есть некоторый javascript, который запускает два отдельных запроса. Один как WebSocket, другой как XMLHttpRequest (AJAX). Поскольку 2 запроса запускаются одновременно, они имеют одинаковый набор файлов cookie - , который в данном случае равен none .

В каждом случае, поскольку в запросе нет файлов cookie, сервер должен создать новый сеанс HTTP. Там сервер не знает, что два запроса от одного и того же клиента, поэтому создаются 2 отдельных сеанса HTTP.

Если это так, то вы можете исправить это, просто поместив фильтр перед index.html, который инициирует создание сеанса.

...