Jetty 8 WebSocket и сеанс

Я создаю небольшое веб-приложение, которое использует причал 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 получил идентификатор сеанса = 1dwp0u93ght5w1bcr12cl2l8gp в doWebSocketConnect(), а SearchServlet получил идентификатор сеанса = 1sbglzngkivtf738w81a957pp, но пользователь все еще находится в том же браузере и на той же странице (index.html) и не перезагрузил страницу. и т.д. Время между установлением соединения 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");

person sockeqwe    schedule 05.02.2012    source источник


Ответы (1)


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

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

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

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

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

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

person Tim    schedule 06.02.2012
comment
Спасибо за ваш ответ. Я думаю, вы правы с вашим предположением №. 2. Я использую причал как собственный встроенный сервер. И я предполагаю, что проблема в том, что мой файл статического содержимого (index.html) еще не начал сеанс Http. Чтобы решить мою проблему, index.html должен начать новый сеанс, а затем WebSocketServlet и SearchServlet должны иметь тот же сеанс, что и index.html. Моя проблема в том, что я не знаю, как это реализовать. У меня есть ResourceHandler resourceHandler = new ResourceHandler(); resourceHandler.setWelcomeFiles (новая строка [] { index.html }); Где включить SESSION? - person sockeqwe; 06.02.2012
comment
Кажется, теперь работает с SessionHandler, который обертывает ResourceHandler... Спасибо за вашу помощь! - person sockeqwe; 06.02.2012