将JSF前缀更改为后缀映射会强制我重新应用CSS背景图像上的映射

Ove*_*eer 14 css jsf facelets jsf-2

我多年来一直在使用前缀映射,并决定切换到后缀映射,只是为了/faces真正摆脱url.在我挖洞之前,我只是想检查一下我是否朝着正确的方向前进,因为有一些意想不到的事情正在发生.我改变了这个:

<servlet-mapping>
    <servlet-name>FacesServlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

对此:

<servlet-mapping>
    <servlet-name>FacesServlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

然后我看到所有内容FacesServlet.xhtml 附加到它上面,因此浏览器正在请求background.png.xhtml文件, style.css.xhtml文件 - 这是正确的吗?我认为它被称为后缀映射,但它看起来有些凌乱,我试图说服自己这是要走的路.

在我引用URI的CSS文件中,我还必须附加.xhtml:

background-image: url(images/background.png.xhtml);
Run Code Online (Sandbox Code Playgroud)

然后我看到BalusC的一篇帖子提供了一个解决方案,可以防止资源下载而无需通过FacesServlet:

<security-constraint>
    <display-name>Restrict raw XHTML docs</display-name>
    <web-resource-collection>
        <web-resource-name>XHTML</web-resource-name>
        <url-pattern>*.xhtml</url-pattern>
    </web-resource-collection>
    <auth-constraint/>
</security-constraint>
Run Code Online (Sandbox Code Playgroud)

当我添加这个时,只有真实.xhtml文件加载到页面上,所有其他资源(尽管已经.xhtml附加)不显示.

我想知道的是:

  1. 这是否适用.xhtml于一切正常(对不起,如果这几年最愚蠢的问题)

  2. 为什么'限制原始xhtml文档'安全约束会阻止加载CSS,JavaScript和图像等资源?

感谢您的任何反馈.我在Glassfish 3.1上使用Mojarra 2.1.2.

Bal*_*usC 17

然后我看到通过FacesServlet的所有内容都附加了.xhtml,以便浏览器请求.png.xhtml文件,.css.xhtml文件 - 这是对的吗?

这仅适用于<h:outputStylesheet>和包含的资源<h:outputScript>.这涉及到在URL映射的变化.这与从JSF 1.x到JSF 2.x的更改<link rel="stylesheet">以及<script>从上述JSF2标记的更改有关.

对于自己的脚本,样式表等静态的东西是从公共服务的web内容,你应该手动添加的.xhtml扩展名.您不应该对现有静态资源进行任何更改.

对于url()使用<h:outputStylesheet>标记包含的CSS文件中的CSS背景图像和其他引用(因此不适用于<link rel="stylesheet>),您需要更改url()EL要动态解析的位置.您需要使用以下语法:

body {
    background-image: url("#{resource['libraryname:path/to/image.png']}");
}
Run Code Online (Sandbox Code Playgroud)

想象一下,您有以下/resources文件夹结构:

WebContent
 |-- META-INF
 |-- resources
 |    `-- default
 |         |-- images
 |         |    `-- background.png
 |         `-- css
 |              `-- style.css
 |-- WEB-INF
 `-- test.xhtml
Run Code Online (Sandbox Code Playgroud)

并且,你包括style.csstest.xhtml如下

<h:outputStylesheet library="default" name="css/style.css" />
Run Code Online (Sandbox Code Playgroud)

那你应该按如下方式定义背景图片网址

body {
    background-image: url("#{resource['default:images/background.png']}");
}
Run Code Online (Sandbox Code Playgroud)

或者当你依赖默认库时,你没有使用它library,那么它应该是这样的:

WebContent
 |-- META-INF
 |-- resources
 |    |-- images
 |    |    `-- background.png
 |    `-- css
 |         `-- style.css
 |-- WEB-INF
 `-- test.xhtml
Run Code Online (Sandbox Code Playgroud)

test.xhtml:

<h:outputStylesheet name="css/style.css" />
Run Code Online (Sandbox Code Playgroud)

style.css:

body {
    background-image: url("#{resource['images/background.png']}");
}
Run Code Online (Sandbox Code Playgroud)

至于securiry约束,它是不是当你已经在使用所需的*.xhtml映射.安全约束旨在防止最终用户FacesServlet在其他模式上映射时看到原始XHTML源代码*.xhtml.终端用户将能够通过仅去除看到XHTML源代码/faces从URL中的情况下,部分/faces/*映射或重命名.jsf.xhtml在一个的情况下*.jsf的映射.摆脱安全约束,它会使你的情况变得更糟,因为你已经在使用*.xhtml映射,这使得通过黑客攻击URL已经无法看到原始的XHTML源代码.