Получить ServletMapping в WebsocketAdapter [Jetty] - PullRequest
0 голосов
/ 04 июня 2018

Мне нужен путь соединения Websocket без префикса в моем адаптере Websocket.

FE. Префикс, указанный в файле web.xml:

<servlet-mapping> 
    <url-pattern>
       /test/
    </url-pattern> 
</servlet-mapping>

Теперь я открываю веб-сокет с путем

localhost: 8080 / test / this-is-the-path-i-need

В будущем я не хочу менять свой Java-Server-Code после изменения шаблона url.

Я создаю свой WebsocketAdapter в WebSocketCreator, вызываемом функцией configure в WebsocketServlet.

В зависимости от моих исследований я думаю, что могу получить его с помощью ServletMapping.getPathSpec ().Проблема в том, что я понятия не имею, как получить ServletMapping.

Есть идеи, как это решить?(Не ограничено возможным решением с ServletMapping)

1 Ответ

0 голосов
/ 04 июня 2018

Примечание: ваш шаблон 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);
    }
}
...