Какие файлы XHTML мне нужно поместить в /WEB-INF, а какие нет?
После этих вопросов:
- https://stackru.com/questions/8589315/jsf2-dynamic-template
- Динамический интерфейс: включить
- Как я могу получить объект на @WindowScoped?
- Как я могу проверить, правильно ли хранится объект, сохраненный с помощью @WindowScoped?
- ICE Faces и ошибка при создании бина в WindowScoped
что я написал все, чтобы решить "глупую" проблему для инфраструктуры JSF2, тот факт, что я не могу напрямую связываться со страницей, хранящейся в /WEB-INF
вложенная папка. После этого я немного изучил Google и Stackru и узнал кое-что: как мне структурировать веб-проект JSF2?
В частности, куда именно я помещаю страницы XHTML?
1 ответ
Файлы в /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>