Фильтр Spring добавлен в конкретный RestController

#java #spring #servlet-filters #spring-restcontroller #spring-filter

#java #spring #servlet-фильтры #spring-restcontroller #spring-фильтр

Вопрос:

У меня есть @RestController и я хочу добавить к нему фильтр Spring, чтобы добавить проверку перед обработкой запроса, который расширяет OncePerRequestFilter

Также я не хочу добавлять его ко всем контроллерам, мое последнее средство — добавить его к general WebApplicationInitializer onStartup по определенному пути:

 public void onStartup(ServletContext container) throws ServletException {
    FilterRegistration corsFilterReg = servletContext.addFilter("CorsFilter", CorsFilter.class);
   corsFilterReg.addMappingForUrlPatterns(null, false, "/servlet/cors/*");
  

Есть ли другой способ подключить Spring Filter к конкретному Spring RestController?

Неправильно ли использовать filter поверх interceptor в Spring REST?

Должен ли фильтр подключаться только к URL-адресам?

Комментарии:

1. Какую работу вы хотите, чтобы этот фильтр выполнял?

2. белый список IP-адресов @chrylis

3. В этом случае перехватчик был бы намного лучшим вариантом. Вы даже можете использовать пользовательскую аннотацию, подобную @RequiresWhitelistedIp , чтобы определить, какие методы контроллера следует рекомендовать.

4. @chrylis Разве фильтр, определенный в начале процесса, не более интуитивно понятен?

5. Начало какого процесса? Обычный запрос на основе сервлета в любом случае имеет так много уровней фильтров и отправки, что вы действительно ничего не получаете. И, как вы видели, подключить фильтр сервлетов к контроллеру Spring MVC совсем не просто.

Ответ №1:

Вы можете использовать @WebFilter annotation .

Пример:

 @WebFilter(filterName = "Filter", urlPatterns = { "/filter/*" })
public class WebFilter implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
         .......
    }

   .......
  }
  

Комментарии:

1. Но я хочу подключаться к RestControllers, а не к URL-адресам

2. Фильтры используют шаблоны URL. Если вы подключаетесь через class, вы можете использовать interceptor или aspect.

3. На самом деле я не могу его использовать, потому что мне нужно HttpServletRequest