Ich verwende einen Servlet-Filter in meiner JSF-Anwendung. Ich habe drei Gruppen von Webseiten in meiner Anwendung und ich 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.xml
mögen
<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 bitte gerne
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?
Wenn ein URL-Muster mit /
Beginnt, ist es relativ zum Kontextstamm. Das URL-Muster /Admin/*
Würde nur mit Seiten in http://localhost:8080/EMS2/Admin/*
Übereinstimmen (vorausgesetzt, /EMS2
Ist der Kontextpfad), aber Sie haben sie tatsächlich in http://localhost:8080/EMS2/faces/Html/Admin/*
URL-Muster stimmt nie überein.
Sie müssen Ihren URL-Mustern auch das Präfix /faces/Html
Voranstellen:
<url-pattern>/faces/Html/Admin/*</url-pattern>
Sie können alternativ auch einfach die Struktur/Konfiguration Ihres Webprojekts neu konfigurieren, sodass Sie den Pfad /faces/Html
In den URLs entfernen können, sodass Sie die Seite nur mit http://localhost:8080/EMS2/Admin/Upload.xhtml
Öffnen können.
Ihre Filterzuordnungssyntax ist in Ordnung. Eine einfachere Möglichkeit, mehrere URL-Muster anzugeben, besteht darin, nur einen <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>
Falls Sie die Anmerkungsmethode für die Filterdefinition verwenden (im Gegensatz zur Definition in web.xml
) können Sie dies tun, indem Sie einfach eine Reihe von Zuordnungen in das @WebFilter
Anmerkung:
/**
* Filter implementation class LoginFilter
*/
@WebFilter(urlPatterns = { "/faces/Html/Employee","/faces/Html/Admin", "/faces/Html/Supervisor"})
public class LoginFilter implements Filter {
...
Und genau wie ein FYI funktioniert dies 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 {
...