Jak zdefiniować kolejność wykonania filtra servlet za pomocą adnotacji w WAR

Jeśli zdefiniujemy specyficzne dla webapp filtry serwletów w WAR ' s own web.xml, to kolejność wykonania filtrów będzie taka sama jak kolejność, w jakiej są one zdefiniowane w web.xml.

Ale jeśli definiujemy te filtry za pomocą adnotacji @WebFilter, Jaka jest kolejność wykonywania filtrów i jak możemy określić kolejność wykonywania?

Author: BalusC, 2011-07-03

3 answers

Nie można definiować kolejności wykonania filtra za pomocą @WebFilter adnotacja. Aby jednak zminimalizować użycie web.xml, wystarczy dodać adnotację do wszystkich filtrów za pomocą filterName, aby nie potrzebować definicji <filter>, ale tylko definicji <filter-mapping> w pożądanej kolejności.

Na przykład,

@WebFilter(filterName="filter1")
public class Filter1 implements Filter {}

@WebFilter(filterName="filter2")
public class Filter2 implements Filter {}

Z web.xml tylko to:

<filter-mapping>
    <filter-name>filter1</filter-name>
    <url-pattern>/url1/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>filter2</filter-name>
    <url-pattern>/url2/*</url-pattern>
</filter-mapping>

Jeśli chcesz zachować wzorzec URL w @WebFilter, możesz po prostu zrobić tak,

@WebFilter(filterName="filter1", urlPatterns="/url1/*")
public class Filter1 implements Filter {}

@WebFilter(filterName="filter2", urlPatterns="/url2/*")
public class Filter2 implements Filter {}

Ale i tak powinieneś należy zachować <url-pattern> w web.xml, ponieważ jest wymagane zgodnie z XSD, chociaż może być puste:

<filter-mapping>
    <filter-name>filter1</filter-name>
    <url-pattern />
</filter-mapping>
<filter-mapping>
    <filter-name>filter2</filter-name>
    <url-pattern />
</filter-mapping>

Niezależnie od podejścia, to wszystko zawiedzie w Tomcacie do wersji 7.0.28, ponieważ dławi się obecnością <filter-mapping> Bez <filter>. Zobacz także używając Tomcat, @ WebFilter nie działa z wewnątrz web.xml

 162
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:27

Specyfikacja Servlet 3.0 wydaje się nie wskazywać, jak kontener powinien zamawiać filtry, które zostały zadeklarowane za pomocą adnotacji. Jest jasne, jak o tym, jak zamówić filtry poprzez ich deklaracji w Internecie.plik xml.

Bądź bezpieczny. Użyj sieci.filtry kolejności plików xml, które mają współzależności. Postaraj się, aby Twoje filtry były niezależne od kolejności, aby zminimalizować potrzebę korzystania z sieci.plik xml.

 8
Author: vkraemer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-03 04:27:27

Niestety musisz uciekać się do odrobiny XML nadal.

Sprawdź spec sekcja 8.2 i dodaj potrzebne bity do swojej sieci.xml lub web-fragment.xml, w zależności od opakowania. Uwaga są to

W sieci.xml można filtrować i słuchać po nazwie:

<absolute-ordering>
  <name>FirstFilter</name>
  <name>NextFilter</name>
</absolute-ordering>

W sieci-fragment.xml można filtrować i słuchać przed lub po innych, jak określono przez nazwę lub ogólnie z tagiem "inne". Na przykład, aby najpierw spróbować zamówić słoik, użyj następujących wskazówek w sieci-fragment.xml

<order>
  <before>
    <others/>
  </before>
</order>

Zauważ, że fragment sieci.polecenia xml dla JAR oraz filtry lub słuchacze w tym samym JAR są dowolnie uporządkowane, chyba że określono to w sieci aplikacji.xml.

 -6
Author: Jeff Warren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-07 13:54:48