Jetty 8 WebSocket和Session

Jetty 8 WebSocket和Session,jetty,websocket,httpsession,Jetty,Websocket,Httpsession,我正在构建一个小的web应用程序,它使用jetty 8作为服务器和WebSocket 在客户端(浏览器)端:用户使用浏览器my index.html打开,打开并建立与我的jetty服务器的新WebSocket连接 在服务器端,我有一个WebSocketServlet,它监听输入WebSocket连接 @Override public WebSocket doWebSocketConnect(HttpServletRequest request, String arg1) { Sy

我正在构建一个小的web应用程序,它使用jetty 8作为服务器和WebSocket

在客户端(浏览器)端:用户使用浏览器my index.html打开,打开并建立与我的jetty服务器的新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接口的类,用于通过WebSocket接收和发送消息

到目前为止一切正常

所以我现在想做的是使用HttpSession来识别当前用户,因为 html站点还可以对其他(非WebSocket)servlet进行一些ajax调用,比如通过HTTPPOST提交一些简单的表单数据等

例如,看看我的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:

对于exmaple,我的WebSocketServlet在doWebSocketConnect()上获得了会话id=1dwp0u93ght5w1bcr12cl2l8gp,而SearchServlet获得了会话id=1sbglzngkivtf738w81a957pp,但用户仍在同一浏览器中和同一页面上(index.html)并且没有重新加载页面等。建立WebSocket连接和SearchServlet调用之间的时间只有几秒钟

有什么建议吗

编辑:顺便说一句。 两个servlet位于相同的servlet上下文中:

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

我可以看到两个可能的原因

1-您的服务器配置不正确。由于您没有提供有关如何运行Jetty以及如何配置Jetty的详细信息,因此您很可能在那里引入了一个问题

2-这实际上是一个时间问题。
我假设index.html是静态内容,因此它不会自行创建会话

在index.html中有一些javascript将启动两个单独的请求。一个作为WebSocket,另一个作为XMLHttpRequest(AJAX)。由于这两个请求是同时启动的,因此它们具有相同的cookie集—在本例中为

在每种情况下,由于请求不提供cookie,服务器必须生成新的HTTP会话。服务器不知道这两个请求来自同一个客户机,因此创建了两个单独的HTTP会话


如果是这样的话,那么您只需在index.html前面添加一个过滤器就可以解决问题,这将强制创建会话。

谢谢您的回答。我想你的第二个假设是对的。我使用jetty作为自己的嵌入式服务器。我想,问题是我的静态内容文件(index.html)还没有启动Http会话。要解决我的问题,index.html必须启动一个新会话,然后WebSocketServlet和SearchServlet应该与index.html具有相同的会话。我的问题是,我不知道如何实现它。我有一个ResourceHandler ResourceHandler=new ResourceHandler();setWelcomeFiles(新字符串[]{“index.html”});我应该在哪里启用会话?现在似乎可以使用SessionHandler来包装ResourceHandler。。。谢谢你的帮助!