jetty 9 добавить обработчик веб-сокетов в список обработчиков

Все обработчики в этом примере работают, кроме обработчика веб-сокетов.

       WebSocketHandler wsHandler = new WebSocketHandler() {
        @Override
        public void configure(WebSocketServletFactory factory) {
            factory.register(WebsocketsService.class);
        }
    };

    HandlerList handlers = new HandlerList();
    handlers.setHandlers(new Handler[] { resource_handler, servletContextHandler, wsHandler, new DefaultHandler() });
    server.setHandler(handlers);

это терпит неудачу с

Ошибка подключения WebSocket к «ws://localhost:8080/»: ошибка во время рукопожатия WebSocket: неожиданный код ответа: 200

как правильно настроить и добавить обработчик веб-сокетов (возможно, с другим путем и портом в качестве servletContextHandler или его можно добавить туда?)?


person user3732793    schedule 30.11.2015    source источник


Ответы (1)


Несколько вещей.

  1. Не смешивайте ResourceHandler и ServletContextHandler, используйте встроенный статический файл, обслуживающий ServletContextHandler, его базу ресурсов и DefaultServlet (см. предыдущий ответ с подробностями)
  2. Не ставьте ничего после вашего ServletContextHandler (если ваш ServletContextHandler находится в contextPath /). После ввода ServletContextHandler (согласно contextPath) он должен быть завершен/завершен (это часть спецификации сервлета), никакой другой обработчик после этого ServletContextHandler никогда не запустится. (см. предыдущий ответ по этому поводу)
  3. Не смешивайте WebSocketHandler и ServletContextHandler, используйте WebSocketUpgradeFilter в своем ServletContextHandler и добавляйте/управляйте конечными точками веб-сокетов там. (см. embedded-jetty-cookbook и WebSocketViaFilter пример как его использовать)
person Joakim Erdfelt    schedule 30.11.2015
comment
Спасибо за это. На самом деле нужно многое проверить. вернется в случае успеха. - person user3732793; 01.12.2015
comment
немного сбивает с толку тот факт, что в документации Jetty фактически упоминается подход обработчика ресурсов в некоторых случаях для встроенных решений, как здесь ссылка @Joakim, вы, кажется, тот человек, у которого можно спросить, так что не возражаете ли вы прокомментировать это? - person user3732793; 01.12.2015
comment
Опять же, не смешивайте ResourceHandler и ServletContextHandler, ни один из примеров в документации этого не делает. См. предыдущий ответ для получения более подробной информации о том, почему. - person Joakim Erdfelt; 01.12.2015
comment
Как только вы начинаете использовать ServletContextHandler (кстати, это лучше), вы больше не используете Handler, которые могут обслуживать контент (такие вещи, как GzipHandler, в порядке, поскольку они просто манипулируют контентом, созданным из ServletContextHandler, но не генерируют свой собственный контент) - person Joakim Erdfelt; 01.12.2015
comment
к сожалению, я получаю сообщение «Невозможно найти каталог ресурсов», как описано здесь ссылка ... путь выглядит нормально... должен ли я опубликовать новый вопрос об этом? - person user3732793; 01.12.2015
comment
Невозможно найти каталог ресурсов будет более подходящим либо как проблема на github, либо как новый вопрос в stackoverflow. - person Joakim Erdfelt; 01.12.2015