Веб-сокеты Jetty и абстрактный обработчик

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

причал-версия: причал-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();

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

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

Я хочу, чтобы оба работали одновременно.


person Community    schedule 24.04.2018    source источник


Ответы (1)


Не смешивайте обработчики ответов и 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

person Joakim Erdfelt    schedule 24.04.2018