66

在这些问题之后:

我写的所有内容都是为了解决 JSF2 框架的“愚蠢”问题,即我无法直接链接到存储在/WEB-INF子文件夹中的页面。之后我对 Google 和 Stackoverflow 做了一些研究,我知道了一件事:我如何构建一个 JSF2 Web 项目?

特别是,我究竟应该把 XHTML 页面放在哪里?

4

1 回答 1

132

文件/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默认情况下可公开访问的文件夹中。如果您确保使用为此提供的组件访问所有资源,以便它们永远不会被/resourcesin 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> 
于 2012-01-27T12:58:48.360 回答