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?

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>

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 {
    ...

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нтон Антонов
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.