Jetty websockets и abstracthandler - PullRequest
       10

Jetty websockets и abstracthandler

0 голосов
/ 24 апреля 2018

Я пытаюсь заставить работать обычный AbstractHandler и WebSocketAdapter одновременно.

jetty-version: jetty-9.4.8.v20171121,

У меня есть простой класс Foo, который расширяется org.eclipse.jetty.server.handler.AbstractHandler.

Также класс Bar, который расширяется org.eclipse.jetty.websocket.api.WebSocketAdapter

Класс клея:

@SuppressWarnings("serial")
public class Glue extends WebSocketServlet {
  @Override
  public void configure(WebSocketServletFactory factory) {
    factory.register(Bar.class);
  }
}

Теперь я пытаюсь сделатьсервер, который использует оба из них:

ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
context.setHandler(new Foo());
ServletHolder holder = new ServletHolder("ws-events", Glue.class);
context.addServlet(holder, "/whatever/*");

Server server = new Server(80);
server.setHandler(context);
server.start();

Это запускается, и когда я перехожу на localhost, я вижу контент, который должен отобразить Foo, но я не могу подключиться к веб-сокету.Похоже, все запросы отправляются в Foo.

Когда я удаляю строку context.setHandler(new Foo());, она, очевидно, больше не отображает html-контент, но я могу подключиться к веб-сокету.

Я хочуоба работают одновременно.

1 Ответ

0 голосов
/ 25 апреля 2018

Не смешивайте обработчики для ответов и ServletContextHandler.

Измените Foo на сервлет, назначьте ему разумный шаблон URL в качестве сервлета.

Причина в том, что вашFoo выполняется перед любым кодом сервлета.

Единственный другой способ сделать это с помощью обработчика - сделать так, чтобы ваш веб-сокет обработчика Foo и обновление HTTP / 1.1 знали и не выполнялись при обнаружении запроса.быть для обновления WebSocket.(Это плохая идея! Не делайте этого! Она не имеет обратной совместимости при поступлении WebSocket через HTTP / 2!)

Также обратите внимание, что ваш класс Glue может реализовывать doGet() и обслуживать HTMLесли клиент без веб-сокета запрашивает содержимое HTTP по тому же шаблону URL.

Кстати, если вы хотите, чтобы обслуживался статический html, не делайте этого в своем собственном коде.Назначьте разумное «Базовое расположение ресурсов» вашему ServletContextHandler и добавьте DefaultServlet для обслуживания статических ресурсов, которые не соответствуют другому шаблону URL.

См. Предыдущий ответ по этому вопросу: https://stackoverflow.com/a/20223103/775715

...