2012-02-05 99 views
2

即时建立一个小的web应用程序,使用码头8作为服务器和websockets。码头8 WebSocket和会话

在客户端(浏览器)方面:用户使用他的浏览器打开我的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是实现码头的,用于接收和通过的WebSockets发送消息WebSocket.OnTextMessage接口的类。

到目前为止好,一切正常,迄今为止。

所以我现在想要做的,是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的IDS:

例如,我的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"); 

回答

2

有两个可能的原因,我可以看到。

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

- 这实际上是一个计时问题。
我假设你的index.html是静态内容,所以它不会自行创建会话。

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

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

如果是这种情况,那么您可以通过在index.html前放置一个过滤器来强制创建会话,从而可以很简单地解决此问题。

+0

谢谢你的回答。我想你的权利与你的假设nr。 2.我使用码头作为自己的嵌入式服务器。我想,问题是我的静态内容文件(index.html)还没有启动Http会话。为了解决我的问题,index.html必须启动一个新的会话,然后WebSocketServlet和SearchServlet应该具有与index.html相同的会话。我的问题是,我不知道如何实现它。我有一个ResourceHandler resourceHandler = new ResourceHandler(); resourceHandler.setWelcomeFiles(new String [] {“index.html”}); 我在哪里启用SESSION? – sockeqwe 2012-02-06 11:39:46

+0

似乎现在使用包装ResourceHandler的SessionHandler工作...感谢您的帮助! – sockeqwe 2012-02-06 12:56:58