2012-02-05 6 views
2

부두 8을 서버 및 웹 소켓으로 사용하는 작은 웹 앱을 작성합니다.부두 8 웹 소켓 및 세션

클라이언트 (브라우저) 측 : 사용자가 브라우저 (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 수신 및 WebSocket을 통해 메시지를 보내는 부두의 WebSocket.OnTextMessage 인터페이스를 구현하는 클래스입니다.

지금까지 너무 좋아서 지금까지 모든 것이 잘 작동합니다.

index.html 사이트는 다른 (비 WebSocket) 서블릿에서 간단한 양식 데이터를 제출하는 것처럼 일부 Ajax 호출을 수행 할 수 있기 때문에 HttpSession을 사용하여 현재 사용자를 식별합니다. 이 두 서블릿 (WebSocketServlet 및 SearchServlet)이 두 diffrent의 HttpSession ID를 가진 두 개의 diffrent의 HttpSession 객체를 가지고,

public class SearchServlet extends HttpServlet{ 

... 

@Override 
public void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 

    System.out.println(request.getSession()); 
} 
... 
} 

내 문제는 다음과 같습니다 : HTTP POST 등을 통해

예를 들어

내 SearchServlet를 보라

내 WebSocketServlet에 대한 doWebSocketConnect() 세션 ID가 1dwp0u93ght5w1bcr12cl2l8gp이고 SearchServlet에 세션 ID가 1sbglzngkivtf738w81a957pp인데 사용자가 여전히 동일한 브라우저 및 동일한 페이지 (index.html)에 있고 다시로드하지 않은 경우 페이지 등 WebSocket 연결을 설정하고 SearchServlet 호출 사이의 시간은 단지 몇 초입니다 ...

어떤 제안?

EDIT : btw. 두 서블릿은 동일의 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에는 두 가지 별도의 요청을 실행하는 자바 스크립트가 있습니다. 하나는 WebSocket, 다른 하나는 XMLHttpRequest (AJAX)입니다. 2 개의 요청이 동시에 실행되기 때문에 쿠키의 집합은 이며이 경우 이 없음입니다.

요청마다 쿠키를 제공하지 않으므로 서버는 새로운 HTTP 세션을 생성해야합니다. 서버는 두 개의 요청이 동일한 클라이언트에서 온다는 것을 모르기 때문에 2 개의 개별 HTTP 세션이 작성됩니다.

그렇다면 index.html 앞에 필터를 넣어 세션을 강제로 간단히 수정할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 너의 가정과 함께 너의 권리가 있다고 생각해. 2. 나는 부두를 자신의 임베디드 서버로 사용한다. 그리고 문제는 내 정적 콘텐츠 파일 (index.html)이 HTTP 세션을 아직 시작하지 않았다는 것입니다. 내 문제를 해결하려면 index.html이 새 세션을 시작해야하며 WebSocketServlet과 SearchServlet이 index.html과 동일한 세션을 가져야합니다. 내 문제는 구현 방법이 없습니다. 나는 ResourceHandler를 가지고있다. resourceHandler = new ResourceHandler(); resourceHandler.setWelcomeFiles (new String [] { "index.html"}); 어디에서 SESSION을 사용할 수 있습니까? – sockeqwe

+0

ResourceHandler를 감싸는 SessionHandler를 사용하는 것 같습니다 ... 도와 줘서 고마워! – sockeqwe