Jetty 8 WebSocket和Session

时间:2012-02-05 18:47:42

标签: jetty websocket httpsession

我正在构建一个使用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");

1 个答案:

答案 0 :(得分:2)

我可以看到两种可能的原因。

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

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

在index.html中,有一些javascript将启动两个单独的请求。一个作为WebSocket,另一个作为XMLHttpRequest(AJAX)。由于同时启动了2个请求,因此它们具有相同的Cookie集 - ,在这种情况下为

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

如果是这种情况,那么你可以通过在index.html前放置一个过滤器来简单地修复它,这会强制创建会话。