Заказ фильтров, сервлетов в Причал-9.2.2

Я развернул CometD-3.0.1 на пристани-9.2.2.

У меня есть свои фильтры, которые я хочу вызывать для каждого запроса. Я указал эти фильтры в файле web.xml в определенном порядке.

Но с WebSocket контейнеры должны найти способ обработать запрос на обновление. В Jetty это выполняется с помощью фильтра сервлетов, который всегда добавляется в качестве первого фильтра ServletContainerInitializer. Так что в моем случае запрос на обновление никогда не попадет на мой фильтр, потому что фильтр WS, находящийся в начале цепочки, выполнит обновление до того, как сработает мой фильтр.

Что я должен сделать, чтобы мои фильтры были вызваны в первую очередь перед фильтрами WS Jetty?

Спасибо анудж

1 ответ

Решение

Короче говоря, невозможно запустить фильтр сервлета при обновлении веб-сокета.

Выбор в пристани, чтобы обновление WebSocket обрабатывалось фильтром, является лишь нашей конкретной реализацией спецификаций Servlet и WebSocket. Другие реализации могут использовать другие методы.

Theres 2 вещи, чтобы понять об этом.

  1. Если контейнер настроил конечные точки WebSocket для известных сопоставлений / спецификаций пути, то любой поступающий запрос на обновление обрабатывается ПЕРЕД всей обработкой сервлета. Jetty решила сделать это через внутренний фильтр, другие реализации делают это с помощью специальной обработки перед передачей в цепочку сервлетов.

  2. Servlet Фильтрация обновлений websocket не рекомендуется на ранних стадиях в спецификации сервлета, так как большинство изменений, которые может сделать фильтр, вызовут проблемы при обновлении websocket. Был краткий разговор об отклонении некоторых путей кода, которые, как известно, вызывали проблемы (например, доступ к содержимому запроса или содержимому ответа, установка заголовков в запросе или ответе и т. Д.). Но это оказалось слишком инвазивным, поэтому он был объявлен быть невозможным и обескуражен.

Теперь вы должны знать, что если обновление websocket не произойдет и без ошибки, то цепочка обработки сервлетов включится для этого запроса.

Типичная проблема здесь заключается в том, что некоторые люди строят свою безопасность вокруг фильтров, это хорошо для сервлетов, но не для WebSockets.

Если это так, то у вас есть работа впереди.

Выбор из следующего:

или же

  • Внедрите свою безопасность, используя уровни безопасности контейнера (это всегда происходит перед любой обработкой веб-сокетов или сервлетов)
Другие вопросы по тегам