Servlet-Filter mit mehreren URL-Mustern versehen

75

Ich verwende einen Servlet-Filter in meiner JSF-Anwendung. Ich habe drei Gruppen von Webseiten in meiner Anwendung und möchte die Authentifizierung für diese Seiten in meinem Servlet-Filter überprüfen:

meine Ordner

/Admin/ *.xhtml

/Supervisor/*.xhtml
/Employee/*.xhtml

und ich schreibe web.xmlwie

<filter>
    <filter-name>LoginFilter</filter-name>
    <filter-class>com.ems.admin.servlet.LoginFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/Employee/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/Admin/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/Supervisor/*</url-pattern>
</filter-mapping>

aber Anfragen wie

http://localhost:8080/EMS2/faces/Html/Admin/Upload.xhtml

treten nicht in Filter ein.

Ich muss diesen 3 Ordnern Sicherheit geben.

Wie kann man dieses Problem lösen?

Raju Boddupalli
quelle

Antworten:

133

Wenn ein URL-Muster mit beginnt /, ist es relativ zum Kontextstamm. Das /Admin/*URL-Muster würde nur mit Seiten übereinstimmen http://localhost:8080/EMS2/Admin/*(vorausgesetzt, dies /EMS2ist der Kontextpfad), aber Sie haben sie tatsächlich aktiviert http://localhost:8080/EMS2/faces/Html/Admin/*, sodass Ihr URL-Muster nie übereinstimmt.

Sie müssen Ihren URL-Mustern auch Folgendes voranstellen /faces/Html:

<url-pattern>/faces/Html/Admin/*</url-pattern>

Alternativ können Sie auch einfach die Struktur / Konfiguration Ihres Webprojekts neu konfigurieren, sodass Sie den /faces/HtmlPfad in den URLs entfernen können, sodass Sie die Seite beispielsweise nur durch öffnen können http://localhost:8080/EMS2/Admin/Upload.xhtml.

Ihre Filterzuordnungssyntax ist in Ordnung. Eine einfachere Möglichkeit, mehrere URL-Muster anzugeben, besteht darin, nur eines <filter-mapping>mit mehreren <url-pattern>Einträgen zu verwenden:

<filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/faces/Html/Employee/*</url-pattern>
    <url-pattern>/faces/Html/Admin/*</url-pattern>
    <url-pattern>/faces/Html/Supervisor/*</url-pattern>
</filter-mapping>
BalusC
quelle
4
Soweit ich sehen kann, sind mehrere URL-Musterelemente nicht zulässig und funktionieren nicht wie erwartet.
Sebastian vom Meer
15
@SebastianG: Ihr konkretes Problem wird an anderer Stelle verursacht. Beachten Sie, dass die Unterstützung für mehrere <url-pattern>Elemente in Servlet 2.5 (Teil von Java EE 5, veröffentlicht vor fast 7 Jahren) eingeführt wurde. Vielleicht arbeiten Sie an einem prähistorischen Tier oder haben schwerwiegende Konfigurationsprobleme, die dazu führen, dass Ihr Container in einem Fallback-Modus ausgeführt wird, der Servlet 2.4 oder älter entspricht, wodurch alle Servlet 2.5-Funktionen verloren gehen.
BalusC
15
Beachten Sie, dass mehrere <filter-mapping>denselben Filter zweimal ausführen, wenn sie mit derselben Ressource übereinstimmen, z. B. einer mit /*und ein anderer mit /foo.xhtmlas url-pattern. Ich bin auf dieses Verhalten bei JBoss AS 7.1 gestoßen.
Sebastian Hoffmann
1
@Paranaix: Das ist in der Tat spezifiziertes Verhalten. Vielleicht mischen Sie mit Servlet-Zuordnungen, die tatsächlich nur das Servlet mit dem am besten passenden URL-Muster ausführen.
BalusC
19

Wenn Sie die Annotationsmethode für die Filterdefinition verwenden (anstatt sie in der zu definieren web.xml), können Sie dies tun, indem Sie einfach ein Array von Zuordnungen in die @WebFilterAnnotation einfügen:

/**
 * Filter implementation class LoginFilter
 */
@WebFilter(urlPatterns = { "/faces/Html/Employee","/faces/Html/Admin", "/faces/Html/Supervisor"})
public class LoginFilter implements Filter {
    ...

Und genau wie zu Ihrer Information funktioniert dasselbe auch für Servlets, die die Servlet-Annotation verwenden:

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet({"/faces/Html/Employee", "/faces/Html/Admin", "/faces/Html/Supervisor"})
public class LoginServlet extends HttpServlet {
    ...
Michael Plautz
quelle
8
Ist es nicht besser, erstreckt sich Filterstatt , HttpServletauch wenn es nur ein Beispiel?
Alexander
Ein Filter kann für verschiedene Servlet-URL-Muster ausgeführt werden. Sie können einen Filter nicht durch ein Servlet ersetzen.
Ravindra Gullapalli
Er will ein Filterverhalten, kein Servlet. Ich denke, er hat diese URLs bereits Servlets zugeordnet.
27нтон Антонов