2009-08-24 5 views
20

Das Objekt javax.servlet.Filter kann sowohl zur Authentifizierung (wobei der Filter die Anforderung abfangen muss, bevor Servlet-Arbeiten ausgeführt werden müssen) als auch zur XSLT-Übersetzung verwendet werden (wobei das Servlet vollständig mit dem Generieren des Inhalts fertiggestellt sein muss). Wann wird es tatsächlich ausgeführt?Wird doFilter() vor oder nach der Arbeit des Servlets ausgeführt?

Ich weiß, dass dies implementationsabhängig ist (auf dem Web-Container), aber das scheint ein Problem zu sein, das von allen gelöst werden muss.

Vielleicht gibt es irgendwo eine Konfigurationsoption für jede Filterregistrierung mit dem Webcontainer?

Zusätzlich:

Auch, was die Reihenfolge der Filter Ausführung regelt? Warum sollte FooFilter vor BarFilter ausgeführt werden?

+0

Die Reihenfolge der Filterausführung durchgeführt wird, in der Datei mit den web.xml . Container wird den Workflow des Programms mit den bereitgestellten Filtern abfangen, von oben nach unten. –

Antwort

43

Die Filterkette umschließt im Wesentlichen den Servlet-Aufruf. Die Kette wird alle Verknüpfungen verarbeiten, bis sie den "unteren" Wert erreicht haben. Lassen Sie dann das Servlet laufen und kehren Sie dann die Kette in umgekehrter Reihenfolge zurück. Zum Beispiel, wenn Sie einen neuen „Beispiel Filter“ haben, Ihre doFilter() Methode können wie folgt aussehen:

public void doFilter(ServletRequest request, 
     ServletResponse response, FilterChain chain) 
     throws IOException, ServletException { 
// do pre-servlet work here 
chain.doFilter(request, response); 
// do post servlet work here 

} 
+0

Das mag ein bisschen kompliziert sein, aber was ist, wenn ich die Antwort ablehnen will? Mit anderen Worten, ich möchte verhindern, dass die Antwort tatsächlich ausgeht. Kann eine ServletException ausgelöst werden? –

+1

Das Auslösen einer ServletException würde immer noch eine "Antwort" an den Client zurückgeben, also hängt es davon ab, was Sie meinen, indem Sie keine Antwort zurücksenden. Sie könnten ein neues Antwortobjekt mit nur von Ihnen angegebenem Inhalt erstellen und das Objekt zurückgeben, wenn Sie dies wünschen. –

+0

Ah guter Punkt. Absolut keine Antwort ist wirklich nie wünschenswert. Auch wenn doFilter() vor dem Aufruf von chain.doFilter() zurückgibt, wird immer noch eine andere Fehlerseite oder der Standardwert zurückgegeben. –

0

@Rich: Ist doFilter() ausgeführt vor oder nach der Arbeit des Servlets wird getan?

Ein Filter ist ein Programm, das auf dem Server ausgeführt wird, bevor die Servlet oder JSP-Seite mit dem sie zugeordnet ist.

+0

Wo wird das zitiert? –

+0

Es scheint, von "mehr Servlets und JavaServer Pages" von Marty Hall zitiert zu werden. –

+0

@adatapost, da es den Aufruf umschließt, wird es vor dem Servlet/jsp aufgerufen, behält aber nach der Verarbeitung die Kontrolle wieder (wenn ein anderer Filter die Verarbeitung nicht unterbrochen hat) –

7

alt text http://img228.imageshack.us/img228/8945/filter.png

Über den Auftrag: wie ich aus spec Servlet-Container erinnern garantiert nicht, dass Filter in einer bestimmten Reihenfolge aufgerufen wird.

+2

"Die Filter werden in der Reihenfolge aufgerufen, in der Filterzuordnungen angezeigt werden in der Filterzuordnungsliste einer WAR. Sie geben eine Filterzuordnungsliste für eine WAR in ihrem Implementierungsdeskriptor an, der die Liste manuell mit XML codiert. "Referenz: http://docs.oracle.com/javaee/6/tutorial/doc /bnagb.html –

+3

Ihr Bildlink ist unterbrochen. – Bob

-1

Gemäß der Spezifikation servlet2.3 Filter gemäß web.xml Konfiguration Filter- Abbildungssequenz Ref- http://www.programering.com/a/MTMyADOwATI.html

+0

Während dies theoretisch die Frage beantworten könnte, [wäre es vorzuziehen] (// meta.stackoverflow.com/q/8259), die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. –

Verwandte Themen