Après ces questions:
que j'ai tout écrit pour résoudre un problème "stupide" pour le framework JSF2, le fait que je ne peux pas lier directement à une page stockée dans un /WEB-INF
sous-dossier. Après cela, j'ai fait des recherches sur Google et Stackoverflow, je saurais une chose: comment structurer un projet Web JSF2?
En particulier, où placer exactement les pages XHTML?
Fichiers dans /WEB-INF
le dossier n'est en effet pas accessible au public par l'utilisateur final. Vous ne pouvez donc pas avoir quelque chose comme http://localhost:8080/contextname/WEB-INF/some.xhtml
. Ce serait une faille de sécurité potentielle car l'utilisateur final pourrait voir entre autres /WEB-INF/web.xml
etc.
Vous pouvez cependant utiliser le /WEB-INF
dossier dans lequel placer les fichiers modèles principaux, inclure les fichiers et les fichiers de balises. Par exemple, le client de modèle suivant page.xhtml
qui est placé à l'extérieur /WEB-INF
et est accessible par http://localhost:8080/contextname/page.xhtml
:
<ui:composition template="/WEB-INF/templates/template.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://Java.Sun.com/jsf/core"
xmlns:h="http://Java.Sun.com/jsf/html"
xmlns:ui="http://Java.Sun.com/jsf/facelets"
>
<ui:define name="content">
...
<ui:include src="/WEB-INF/includes/include.xhtml" />
...
</ui:define>
</ui:composition>
L'avantage de placer des modèles principaux et d'inclure des fichiers dans /WEB-INF
est que l'utilisateur final ne pourra pas les ouvrir directement en entrant/devinant son URL dans la barre d'adresse du navigateur. Les pages normales et les clients de modèles destinés à être accessibles directement ne doivent pas être placés dans /WEB-INF
dossier.
Soit dit en passant, les fichiers de composants composites ne sont pas non plus censés être accessibles au public, mais ils doivent par spécification être placés dans /resources
dossier qui est par défaut accessible au public. Si vous vous assurez que vous accédez à toutes les ressources en utilisant les composants fournis à cet effet afin qu'ils ne soient jamais accessibles par /resources
dans l'URL (mais à la place par /javax.faces.resource
), vous pouvez alors ajouter la contrainte suivante à web.xml
pour bloquer tout accès public à /resources
dossier:
<security-constraint>
<display-name>Restrict direct access to the /resources folder.</display-name>
<web-resource-collection>
<web-resource-name>The /resources folder.</web-resource-name>
<url-pattern>/resources/*</url-pattern>
</web-resource-collection>
<auth-constraint />
</security-constraint>