2012-01-27 1 views
51

Après ces questions:Quels fichiers XHTML dois-je mettre dans/WEB-INF et lesquels pas?

que j'ai écrit tout pour résoudre un problème "stupide" pour le cadre JSF2 , le fait que je ne peux pas créer de lien direct vers une page stockée dans un sous-dossier /WEB-INF. Après que j'ai fait quelques recherches sur Google et Stackoverflow je saurais une chose: Comment puis-je structurer un projet web JSF2?

En particulier, où exactement mettre les pages XHTML?

+2

Ceci est une question en suspens qui touche à de nombreux aspects des facelets. – Thufir

Répondre

111

Les fichiers du dossier /WEB-INF ne sont en effet pas accessibles au public par enduser. Donc, vous ne pouvez pas avoir quelque chose comme http://localhost:8080/contextname/WEB-INF/some.xhtml. Ce serait un trou de sécurité potentiel que l'utilisateur final serait en mesure d'afficher parmi d'autres /WEB-INF/web.xml et ainsi de suite.

Vous pouvez toutefois utiliser le dossier /WEB-INF pour mettre les fichiers de modèle maître, comprennent les fichiers et les fichiers de balises dans Par exemple, le modèle client page.xhtml suivant 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 maîtres 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 modèles qui sont destinés à être accédés directement ne doivent pas être placés dans le dossier /WEB-INF. Par ailleurs, les fichiers de composants composites ne sont pas non plus censés être accessibles au public, mais ils doivent être placés par défaut dans le dossier /resources qui est accessible par défaut au public. Si vous assurez-vous que vous accédez à toutes les ressources en utilisant le therefor provided components afin qu'ils ne sont jamais accessibles par /resources dans l'URL (mais par /javax.faces.resource), vous pouvez ajouter la contrainte suivante à web.xml pour bloquer tous les accès du public au dossier /resources:

<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> 
Questions connexes