J'utilise un filtre de servlet dans mon application JSF. J'ai trois groupes de pages Web dans mon application et je souhaite vérifier l'authentification pour ces pages dans mon filtre de servlet:
mes dossiers
/Admin/ *.xhtml
/Supervisor/*.xhtml
/Employee/*.xhtml
et j'écris web.xml
comme
<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>
mais des demandes comme
http://localhost:8080/EMS2/faces/Html/Admin/Upload.xhtml
n'entrent pas dans le filtre.
Je dois assurer la sécurité de ces 3 dossiers.
Comment résoudre ce problème ?
Si un modèle d'URL commence par /
, alors c'est relatif à la racine de contexte. Le /Admin/*
Le modèle d’URL ne correspond aux pages que sur http://localhost:8080/EMS2/Admin/*
(en admettant que /EMS2
est le chemin du contexte), mais vous les avez réellement sur http://localhost:8080/EMS2/faces/Html/Admin/*
, votre modèle d'URL ne correspond donc jamais.
Vous devez préfixer vos modèles d'URL avec /faces/Html
aussi bien comme ça:
<url-pattern>/faces/Html/Admin/*</url-pattern>
Vous pouvez également simplement reconfigurer la structure/configuration de votre projet Web afin de vous débarrasser du fichier /faces/Html
chemin dans les URL afin que vous puissiez simplement ouvrir la page, par exemple http://localhost:8080/EMS2/Admin/Upload.xhtml
.
Votre syntaxe de mappage de filtre est parfaite. Cependant, une façon plus simple de spécifier plusieurs modèles d'URL consiste à n'utiliser qu'un seul <filter-mapping>
avec plusieurs <url-pattern>
entrées:
<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>
Si vous utilisez la méthode d’annotation pour la définition du filtre (par opposition à leur définition dans le fichier web.xml
), vous pouvez le faire en mettant simplement un tableau de mappages dans le @WebFilter
annotation:
/**
* Filter implementation class LoginFilter
*/
@WebFilter(urlPatterns = { "/faces/Html/Employee","/faces/Html/Admin", "/faces/Html/Supervisor"})
public class LoginFilter implements Filter {
...
Et tout comme un FYI, cette même chose fonctionne pour les servlets utilisant l'annotation de servlet:
/**
* Servlet implementation class LoginServlet
*/
@WebServlet({"/faces/Html/Employee", "/faces/Html/Admin", "/faces/Html/Supervisor"})
public class LoginServlet extends HttpServlet {
...