Servlet Filter - не применять фильтр к определенному - PullRequest
6 голосов
/ 23 августа 2011

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

В моем 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 я хочу обойти фильтр аутентификации. Как мы можем это сделать?

Ответы [ 2 ]

6 голосов
/ 23 августа 2011

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

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

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

...