Как установить несколько обработчиков в Jetty и не получить ошибку при запуске - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть некоторый код сервера, который выглядит так:

private WebAppContext getAspireWebAppContext() {
    WebAppContext root = new WebAppContext();
    root.setWar(config().<String>property("war.file"));
    root.setContextPath("/");
    return root;
}

private Server startWebApp(int port) {
  try {
    server.setConnectors(createConnectors(port));
    ServletContextHandler context = getAspireWebAppContext();
    server.setHandler(context);

    // Ensure that a websocket always has a HttpSession
    context.addFilter(HttpSessionForWebsocketFilter.class,"/ws/*",null);
    // add websocket support
    ServerContainer wscontainer = WebSocketServerContainerInitializer.configureContext( context );
    wscontainer.addEndpoint(EngineSocket.class);
    wscontainer.addEndpoint(WorkbenchSocket.class);

    server.start();
  } ....
}

Я хочу использовать HandlerList, чтобы я мог добавить RewriteHandler.Поэтому я попытался изменить его:

HandlerList handlers = new HandlerList();

server.setConnectors(createConnectors(port));
ServletContextHandler context = getAspireWebAppContext();
// server.setHandler(context);
handlers.addHandler(context);

// Ensure that a websocket always has a HttpSession
context.addFilter(HttpSessionForWebsocketFilter.class,"/ws/*",null);
// add websocket support
ServerContainer wscontainer = WebSocketServerContainerInitializer.configureContext( context );
wscontainer.addEndpoint(EngineSocket.class);
wscontainer.addEndpoint(WorkbenchSocket.class);

// RewriteHandler stuff
// handlers.addHandler(rewrite);

server.setHandler(handlers);
server.start();

Даже перед добавлением дополнительных обработчиков это вызывает пустое исключение в строке WebSocketServerContainerInitializer.configureContext(context):

Причина: java.langИсключениеЧто я делаю неправильно?Спасибо

1 Ответ

0 голосов
/ 23 ноября 2018

Сначала добавьте HandlerList на сервер.

Server server = new Server();
HandlerList handlers = new HandlerList();
server.setHandler(handlers);

ServletContextHandler context = getAspireWebAppContext();
handlers.addHandler(context);

ServerContainer wscontainer = WebSocketServerContainerInitializer.configureContext( context );
wscontainer.addEndpoint(EngineSocket.class);
wscontainer.addEndpoint(WorkbenchSocket.class);

// RewriteHandler stuff
handlers.addHandler(rewrite);

server.start();

Но в конечном итоге этот NPE является ошибкой с внутренней попыткой получить общий HttpClient из Server, который принадлежит вашемуServletContextHandler.

Открыт как https://github.com/eclipse/jetty.project/issues/3139

Также следует помнить, что вы не можете надежно применять фильтры к соединениям WebSocket.

Обновления WebSocket через JSR356 (API, который вы выбираете использовать) предназначен для обновления вне цепочки фильтров.Это связано с тем, что фильтр может изменять запрос / ответ, изменять состояние фиксации ответа, переносить входные потоки, переносить выходные потоки и т. Д. Все это запрещено во время обновления WebSocket.Хотя ваш фильтр может работать некоторое время, он не будет работать 100% времени.И заголовок Set-Cookie от такого действия также не обязательно будет отправлен обратно в ответ.

Если вы переключитесь на Jetty Native WebSocket API, вы сможете контролировать, где происходит обновление (применяются те же самые запрещенные действия)).Расширение от WebSocketServlet или расширение от WebSocketUpgradeFilter и применение собственной логики, или, что еще лучше, снабжение собственным WebSocketCreator для выполнения того, что вам нужно.

...