Какие файлы XHTML мне нужно поместить в / WEB-INF, а какие нет? - PullRequest
56 голосов
/ 27 января 2012

После этих вопросов:

, что я написал все, чтобы решить «глупую» проблему для платформы JSF2, тот факт, что я не могу напрямую связываться со страницей, хранящейся в подпапке /WEB-INF. После этого я немного изучил Google и Stackoverflow, и я бы знал одну вещь: как мне структурировать веб-проект JSF2?

В частности, куда именно я помещаю страницы XHTML?

1 Ответ

119 голосов
/ 27 января 2012

Файлы в папке /WEB-INF действительно недоступны для конечного пользователя. Таким образом, вы не можете иметь что-то вроде http://localhost:8080/contextname/WEB-INF/some.xhtml. Это было бы потенциальной дырой в безопасности, поскольку конечный пользователь мог бы просматривать среди прочих /WEB-INF/web.xml и т. Д.

Однако вы можете использовать папку /WEB-INF для размещения файлов главного шаблона, включения файлов и файлов тегов. Например, следующий клиент шаблона page.xhtml, который находится за пределами /WEB-INF и доступен для 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>

Преимущество размещения основных шаблонов и включаемых файлов в /WEB-INF заключается в том, что конечный пользователь не сможет открыть их напрямую, введя / угадав свой URL-адрес в панели адресов браузера. Обычные страницы и клиенты шаблонов, к которым предполагается прямой доступ, не должны помещаться в папку /WEB-INF.

Кстати, файлы составных компонентов, в свою очередь, также не должны быть общедоступными, однако по спецификации их необходимо размещать в папке /resources, которая по умолчанию общедоступна. Если вы убедитесь, что получаете доступ ко всем ресурсам, используя для них предоставленные компоненты , чтобы к ним никогда не обращался /resources в URL (а вместо этого /javax.faces.resource), тогда вы можете добавить следующее ограничение к web.xml, чтобы заблокировать общий доступ к папке /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> 
...