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.xml
wie
<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?
quelle
<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.<filter-mapping>
denselben Filter zweimal ausführen, wenn sie mit derselben Ressource übereinstimmen, z. B. einer mit/*
und ein anderer mit/foo.xhtml
asurl-pattern
. Ich bin auf dieses Verhalten bei JBoss AS 7.1 gestoßen.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@WebFilter
Annotation 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 { ...
quelle
Filter
statt ,HttpServlet
auch wenn es nur ein Beispiel?