2012-01-27 15 views
51

Dopo queste domande:Quali file XHTML devo inserire/WEB-INF e quale no?

che ho scritto tutto per risolvere un problema di "stupido" per il quadro JSF2 , il fatto che non riesco a collegarmi direttamente a una pagina memorizzata in una sottocartella /WEB-INF. Dopo di che ho fatto qualche ricerca su Google e StackOverflow avrei saputo una cosa: come strutturare un progetto web JSF2?

In particolare, dove esattamente inserisco le pagine XHTML?

+2

Questa è una domanda eccezionale che tocca molti aspetti delle facette. – Thufir

risposta

111

I file nella cartella /WEB-INF non sono accessibili al pubblico da parte dell'utente finale. Quindi non puoi avere qualcosa come http://localhost:8080/contextname/WEB-INF/some.xhtml. Quello sarebbe un potenziale buco di sicurezza in quanto l'utente finale potrebbe visualizzare tra gli altri /WEB-INF/web.xml e così via.

È possibile comunque utilizzare la cartella /WEB-INF per mettere i file di modello di master, includono file e file di tag in Ad esempio, il seguente cliente modello page.xhtml che si trova al di fuori /WEB-INF ed è accessibile da 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> 

Il vantaggio di posizionare modelli master e includere file in /WEB-INF consiste nel fatto che l'utente finale non sarà in grado di aprirli direttamente inserendo/indovinando il proprio URL nella barra dei browser. Le normali pagine e i client di template a cui si intende accedere direttamente non devono essere collocati nella cartella /WEB-INF.

A proposito, anche i file di componenti compositi non devono essere pubblicamente accessibili, tuttavia sono specificati per essere inseriti nella cartella /resources che è accessibile per impostazione predefinita. Se è assicurarsi che si accede tutte le risorse utilizzando il therefor provided components in modo che essi non sono mai accessibili da /resources in URL (ma invece da /javax.faces.resource), allora si può aggiungere il seguente vincolo per web.xml per bloccare tutto l'accesso del pubblico alla cartella /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> 
Problemi correlati