我正在构建一个使用jetty 8作为服务器和websockets的小型Web应用程序。
在客户端(浏览器)端:用户打开浏览器我的index.html,然后打开并与我的jetty服务器建立新的WebSocket连接。
在服务器端,我有一个侦听WebSocket连接的WebSocketServlet。
@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接口的类,用于通过websockets接收和发送消息。
到目前为止一切顺利,到目前为止一切正常。
所以我现在想做的是使用HttpSession来识别当前用户,因为 index.html站点也可以对其他(非WebSocket)Servlet进行一些ajax调用,比如通过HTTP POST等提交一些简单的表单数据。
例如,看看我的SearchServlet:
public class SearchServlet extends HttpServlet{
...
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println(request.getSession());
}
...
}
我的问题是,这两个servlet(WebSocketServlet和SearchServlet)有两个不同的HttpSession对象,有两个不同的HttpSession id:
例如,我的WebSocketServlet在doWebSocketConnect()上获得了会话id = 1dwp0u93ght5w1bcr12cl2l8gp,而SearchServlet获得了会话ID = 1sbglzngkivtf738w81a957pp,但是用户仍然在同一个浏览器中并且在同一页面上(index.html)并且没有重新加载页面等。建立WebSocket连接和SearchServlet调用之间的时间只有几秒......
有什么建议吗?
编辑:顺便说一句。 两个Servlet都在同一个ServletContext中:ServletContextHandler servletContext = new ServletContextHandler(ServletContextHandler.SESSIONS);
servletContext.setContextPath("/servlets");
servletContext.addServlet(new ServletHolder( new MyWebSocketServlet()),"/liveCommunication");
servletContext.addServlet(new ServletHolder( new SearchServlet()),"/search");
答案 0 :(得分:2)
我可以看到两种可能的原因。
1 - 您的服务器配置不正确。由于您尚未提供有关如何运行Jetty以及如何配置Jetty的详细信息,因此您可能会在那里引入问题。
2 - 这实际上是一个时间问题 我假设您的index.html是静态内容,因此它不会自己创建会话。
在index.html中,有一些javascript将启动两个单独的请求。一个作为WebSocket,另一个作为XMLHttpRequest(AJAX)。由于同时启动了2个请求,因此它们具有相同的Cookie集 - ,在这种情况下为无 。
在每种情况下,由于请求不提供cookie,因此服务器必须生成新的HTTP会话。服务器不知道这两个请求来自同一个客户端,因此创建了两个单独的HTTP会话。
如果是这种情况,那么你可以通过在index.html前放置一个过滤器来简单地修复它,这会强制创建会话。