Фильтр сервлетов - не применять фильтр к определенному

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

У меня есть следующее в моем web.xml

<filter>
    <filter-name>AuthenticationFilter</filter-name>
    <display-name>AuthenticationFilter</display-name>
    <filter-class>com.mycompany.secutity.AuthenticationFilter</filter-class>
</filter>

И у меня есть следующее отображение -

<filter-mapping>
    <filter-name>AuthenticationFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Но теперь я хочу добавить исключение, где для определенного сервлета /web/MyNewServlet я хочу обойти фильтр аутентификации. Как мы можем это сделать?


person jagamot    schedule 22.08.2011    source источник


Ответы (2)


Есть два способа сделать это:

  • Переназначьте шаблон /* на другой шаблон, такой как /subdir/*, и тем самым избегайте применения AuthenticationFilter к /web/MyNewServlet. Это громоздкий процесс, так как в вашем веб-приложении может быть несколько URL-адресов, которые теперь необходимо переназначить. Я бы посоветовал сделать это на раннем этапе разработки или когда у вас не так много URL-адресов для переназначения.
  • Программно включите правило исключения в реализацию фильтра. Вам нужно будет использовать HttpServletRequest.getServletPath и аналогичные методы, чтобы проверить, содержит ли фрагмент URL-адрес /web/MyNewServlet, а затем связать фильтр со следующим фильтром или сервлетом вместо выполнения тела фильтра.
person Vineet Reynolds    schedule 22.08.2011

Слегка расширив идею Vineet, вы можете добавить еще один фильтр с именем типа DoesNotNeedAuthenticationFilter, который запускается перед AuthenticationFilter и просто устанавливает в запросе атрибут DOES_NOT_NEED_AUTHENTICATION. Затем AuthenticationFilter может проверить этот атрибут и передать любые запросы, которые его содержат. Затем вы можете использовать обычный механизм сопоставления фильтров, чтобы применить DoesNotNeedAuthenticationFilter к соответствующим URL-адресам или сервлетам.

person Tom Anderson    schedule 07.01.2012
comment
Элегантный способ пропустить фильтры, особенно если у вас длинная цепочка фильтров, спасибо! - person Sohail; 25.08.2016