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