Получите зарегистрированные фильтры в правильном порядке - PullRequest
0 голосов
/ 14 апреля 2020

Я хотел бы перечислить все мои фильтры в правильном порядке, так как у меня есть несколько фильтров, которые должны быть первыми в цепочке фильтров.

Из ServletContext я могу получить все фильтры следующим образом:

    Map<String, ? extends FilterRegistration> filters = servletContext.getFilterRegistrations();
    filters.forEach((k,v) -> {
        System.out.println(k);
        System.out.println(v.getClassName());
    });

Так как это карта и неупорядоченная, она напечатает:

Key: webMvcMetricsFilter
Classname: org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter
Key: requestContextFilter
Classname: org.springframework.boot.web.servlet.filter.OrderedRequestContextFilter
Key: MyCustomFilterThatNeedsToBeFirst
Classname: my.custom.filter.MyCustomFilterThatNeedsToBeFirst
Key: Tomcat WebSocket (JSR356) Filter
Classname: org.apache.tomcat.websocket.server.WsFilter
Key: characterEncodingFilter
Classname: org.springframework.boot.web.servlet.filter.OrderedCharacterEncodingFilter
Key: springSecurityFilterChain
Classname: org.springframework.boot.web.servlet.DelegatingFilterProxyRegistrationBean$1
Key: formContentFilter
Classname: org.springframework.boot.web.servlet.filter.OrderedFormContentFilter

Как я могу получить цепочку фильтров в упорядоченном списке, чтобы я мог убедиться, что MyCustomFilterThatNeedsToBeFirst является первым фильтром в FilterChain

1 Ответ

0 голосов
/ 14 апреля 2020

Самый простой подход заключается в том, чтобы получить пользовательский фильтр по ключу карты и обработать его, а затем удалить его с карты, а затем выполнить итерации по остальной части карты.

    Map<String, ? extends FilterRegistration> filters = servletContext.getFilterRegistrations();
processFilter(filters.get("MyCustomFilterThatNeedsToBeFirst"))
filters.entrySet().stream().filter(key -> key.equals("MyCustomFilterThatNeedsToBeFirst"))
                    .forEach((k,v) -> processFilter(v));


другой подход, который я могу придумать, заключается в том, что вы можете создать двустороннюю очередь, используя deque , где вы создаете deque путем итерации карты и установки указанных c * 1006. * к передней части deque, а остальные к задней. и, наконец, обработать элементы в деке один за другим.

Надеюсь, это поможет

Редактировать ==================== =================

Если вам нужно установить приоритет для фильтра, вы можете сделать это, добавив аннотацию @Order(Ordered.HIGHEST_PRECEDENCE) в класс фильтра. Вы также можете дать пронумерованный приоритет, например @Order(1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...