web-dev-qa-db-fra.com

Donner plusieurs modèles d'URL au filtre de servlet

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 ?

69
Raju Boddupalli

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>
122
BalusC

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 {
    ...
15
Michael Plautz