Примечание: ваш шаблон URL /test/
никогда не будет совпадать с URI localhost:8080/test/this-is-the-path-i-need
, поскольку этот URI не совпадает.
Если вы хотите, чтобы этот URI совпадал, то выбудет использовать URL-шаблон /test/*
, а затем request.pathInfo
будет иметь то, что вам нужно / нужно.
Отображение из вашего WEB-INF/web.xml
, которое использовалось для доступа к вашему сервлету / фильтру /websocket недоступен из веб-приложения с помощью стандартных API-интерфейсов сервлетов.
Используя API-интерфейсы сервлетов, вы фиксируете полный путь или URI, который используется, а затем удаляете из него префикс пути контекста сервлета, чтобы получить путь, которыйбыл использован.
Для этого вы будете использовать стандартный сервлет HttpServletRequest
из ServletUpgradeRequest.getHttpServletRequest()
, собрать путь, удалить префикс пути контекста, опционально собрать pathInfo, а затемпередайте этот результирующий путь в WebsocketAdapter
, который вы только что создали.
Примечание: ServletMapping
является внутренним классом для Jetty.Это не публичный / формальный API, поэтому его использование не рекомендуется для заявленного вами варианта использования «В будущем я не хочу менять свой Java-Server-Code ...» .
Если вы все еще хотите использовать внутренние API, я бы порекомендовал полностью пропустить ServletMapping
и просто перейти на использованный PathSpec
для этого конкретного запроса, вы можете получить к нему доступ через атрибуты ServletUpgradeRequest
.
public static class MyPathSpecCreator implements WebSocketCreator
{
private static final String PATHSPEC_KEY = PathSpec.class.getName();
@Override
public Object createWebSocket(ServletUpgradeRequest upgradeRequest,
ServletUpgradeResponse upgradeResponse)
{
String pathSpecPattern = "/"; // default value (pick your own)
PathSpec pathSpec = (PathSpec) upgradeRequest.getServletAttribute(PATHSPEC_KEY);
if(pathSpec != null)
pathSpecPattern = pathSpec.getDeclaration();
return new MyWebSocketAdapter(pathSpecPattern);
}
}