多年来我一直在使用前缀映射,现在决定改用后缀映射映射,去掉url中的/faces
。我只是想在我给自己挖洞之前检查一下我走对了方向发生了一些意想不到的事情。我改变了:
<servlet-mapping>
<servlet-name>FacesServlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
:
<servlet-mapping>
<servlet-name>FacesServlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
然后我看到所有经过FacesServlet
的都有.xhtml
附加到它,以便浏览器请求background.png.xhtml
文件,style.css.xhtml
文件-这是正确的吗?我想这叫做后缀映射,但我觉得有点乱,我试着说服自己这是该走的路。
在我的CSS文件中,一个URI被引用,我还必须追加.xhtml
:
background-image: url(images/background.png.xhtml);
然后我看到一个帖子从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>
当我添加这个,然后只有真正的.xhtml
文件加载在页面上,所有其他资源(尽管附加了.xhtml
)不显示。
我想知道的是:
这是将
.xhtml
附加到一切正常(对不起,如果年愚蠢的问题)为什么'restrict raw xhtml docs'的安全约束阻止诸如CSS, JavaScript和图像从加载?
感谢您的任何反馈。我在Glassfish 3.1上使用Mojarra 2.1.2
,然后我看到通过FacesServlet的所有内容都附加了。xhtml,因此浏览器正在请求。png.xhtml文件,。css.xhtml文件-这是对的吗?
仅适用于<h:outputStylesheet>
和<h:outputScript>
包含的资源。这是与URL映射中的更改无关的。这与JSF 1的变化有关。x到JSF 2。x和从<link rel="stylesheet">
和<script>
到前面提到的JSF2标记的更改。
.xhtml
扩展。您不需要更改任何与现有静态资源相关的内容。
只有用于CSS背景图像和CSS文件中的其他url()
引用,这些引用将使用<h:outputStylesheet>
标签包含(因此不用于<link rel="stylesheet>
),您需要更改url()
位置以由EL动态解析。您需要使用以下语法:
body {
background-image: url("#{resource['libraryname:path/to/image.png']}");
}
假设您有以下/resources
文件夹结构:
WebContent
|-- META-INF
|-- resources
| `-- default
| |-- images
| | `-- background.png
| `-- css
| `-- style.css
|-- WEB-INF
`-- test.xhtml
并且您将style.css
包含在test.xhtml
中,如下所示
<h:outputStylesheet library="default" name="css/style.css" />
那么你应该定义背景图像URL如下
body {
background-image: url("#{resource['default:images/background.png']}");
}
或当您依赖于默认库时,因此您不使用library
,那么它应该看起来像这样:
WebContent
|-- META-INF
|-- resources
| |-- images
| | `-- background.png
| `-- css
| `-- style.css
|-- WEB-INF
`-- test.xhtml
test.xhtml
:
<h:outputStylesheet name="css/style.css" />
style.css
:
body {
background-image: url("#{resource['images/background.png']}");
}
至于安全约束,当您已经在使用
*.xhtml
映射时,它是而不是。安全约束的目的是防止终端用户在将FacesServlet
映射到*.xhtml
以外的模式时看到原始XHTML源代码。在/faces/*
映射的情况下,最终用户只需从URL中删除/faces
部分,或者在*.jsf
映射的情况下将.jsf
重命名为.xhtml
,即可看到XHTML源代码。摆脱安全约束,在您的情况下,它使事情变得更糟,因为您已经使用了*.xhtml
映射,这使得通过入侵URL已经无法看到原始XHTML源代码。