将 JSF 前缀更改为后缀映射迫使我在 CSS 背景图像上重新应用映射
Posted
技术标签:
【中文标题】将 JSF 前缀更改为后缀映射迫使我在 CSS 背景图像上重新应用映射【英文标题】:Changing JSF prefix to suffix mapping forces me to reapply the mapping on CSS background images 【发布时间】:2011-10-13 17:04:13 【问题描述】:多年来我一直在使用前缀映射,并决定改用后缀
映射,只是为了真正摆脱网址中的/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
文件 - 对吗?我想它被称为后缀映射,
但它对我来说看起来有点不整洁,我试图说服自己
要走的路。
在引用 URI 的 CSS 文件中,我还必须附加 .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
附加到一切正常(对不起,如果
最愚蠢的问题)
为什么“限制原始 xhtml 文档”安全约束会阻止资源,例如 加载 CSS、javascript 和图像?
感谢您的任何反馈。我在 Glassfish 3.1 上使用 Mojarra 2.1.2。
【问题讨论】:
【参考方案1】:然后我看到通过 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>
),您需要更改EL 动态解析的url()
位置。您需要改用以下语法:
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
并且您在test.xhtml
中包含style.css
,如下所示
<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 源代码。
【讨论】:
谢谢。我不明白的最后一点是为什么我必须在我的背景图像中附加 .xhtml: url 属性。我使用 ResourceManager 附加构建版本号以进行缓存刷新,但我不明白这是一个因素(实际上我注意到版本号未附加到从 css 文件请求的资源)。我想确定最后一点,然后我会很高兴。 css 是从带有 h:outputStylesheet library="css" name="styleSheet.css" 的根目录中的模板加载的。那么什么配置问题导致我必须附加后缀?谢谢。 我应该澄清一下,一切都以 .xhtml 后缀进行,包括我自己的文件,即 login.xhtml.xhtml... 我创建了一个模板NetBeans JSF项目,配置*.xhtml后缀映射,在index.xhtml中有一行以上是关于将 JSF 前缀更改为后缀映射迫使我在 CSS 背景图像上重新应用映射的主要内容,如果未能解决你的问题,请参考以下文章
我在express4.1.3中用ejs模板将后缀改为html成功,但是外部引用css文件失败了,求助。
Xcode - 如何将 App ID 后缀从旧帐户更改为新帐户?带有标识符的应用程序 ID 不可用。请输入不同的字符串
将 MSSQL 中用于 Web 映射(Leaflet、Openlayer、OpenStreetMaps、GoogleAPI 等)的投影更改为 WSG48 或任何其他格式