Сначала добавьте 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
для выполнения того, что вам нужно.