#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