Я создаю небольшое веб-приложение, которое использует 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");