Servlet Filter - Не прилагайте филтър към конкретен

Имам уеб приложение с екран за влизане, архивиран с филтър за удостоверяване.

Имам следното в моя 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/* и по този начин избегнете прилагането на филтъра за удостоверяване срещу /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