Заказ фильтров, сервлетов в Причал-9.2.2
Я развернул CometD-3.0.1 на пристани-9.2.2.
У меня есть свои фильтры, которые я хочу вызывать для каждого запроса. Я указал эти фильтры в файле web.xml в определенном порядке.
Но с WebSocket контейнеры должны найти способ обработать запрос на обновление. В Jetty это выполняется с помощью фильтра сервлетов, который всегда добавляется в качестве первого фильтра ServletContainerInitializer. Так что в моем случае запрос на обновление никогда не попадет на мой фильтр, потому что фильтр WS, находящийся в начале цепочки, выполнит обновление до того, как сработает мой фильтр.
Что я должен сделать, чтобы мои фильтры были вызваны в первую очередь перед фильтрами WS Jetty?
Спасибо анудж
1 ответ
Короче говоря, невозможно запустить фильтр сервлета при обновлении веб-сокета.
Выбор в пристани, чтобы обновление WebSocket обрабатывалось фильтром, является лишь нашей конкретной реализацией спецификаций Servlet и WebSocket. Другие реализации могут использовать другие методы.
Theres 2 вещи, чтобы понять об этом.
Если контейнер настроил конечные точки WebSocket для известных сопоставлений / спецификаций пути, то любой поступающий запрос на обновление обрабатывается ПЕРЕД всей обработкой сервлета. Jetty решила сделать это через внутренний фильтр, другие реализации делают это с помощью специальной обработки перед передачей в цепочку сервлетов.
Servlet Фильтрация обновлений websocket не рекомендуется на ранних стадиях в спецификации сервлета, так как большинство изменений, которые может сделать фильтр, вызовут проблемы при обновлении websocket. Был краткий разговор об отклонении некоторых путей кода, которые, как известно, вызывали проблемы (например, доступ к содержимому запроса или содержимому ответа, установка заголовков в запросе или ответе и т. Д.). Но это оказалось слишком инвазивным, поэтому он был объявлен быть невозможным и обескуражен.
Теперь вы должны знать, что если обновление websocket не произойдет и без ошибки, то цепочка обработки сервлетов включится для этого запроса.
Типичная проблема здесь заключается в том, что некоторые люди строят свою безопасность вокруг фильтров, это хорошо для сервлетов, но не для WebSockets.
Если это так, то у вас есть работа впереди.
Выбор из следующего:
- Разделите логику безопасности на отдельный класс, который могут использовать ваши фильтры сервлетов и ваш пользовательский http://docs.oracle.com/javaee/7/api/javax/websocket/server/ServerEndpointConfig.Configurator.html.
или же
- Внедрите свою безопасность, используя уровни безопасности контейнера (это всегда происходит перед любой обработкой веб-сокетов или сервлетов)