文件/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
in 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>