将 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 文件 - 对吗?

这仅适用于&lt;h:outputStylesheet&gt;&lt;h:outputScript&gt; 包含的资源。这与 URL 映射的更改有关。这与从 JSF 1.x 到 JSF 2.x 的更改以及从 &lt;link rel="stylesheet"&gt;&lt;script&gt; 到上述 JSF2 标记的更改有关。

对于您自己的脚本、样式表和其他要从公共网络内容提供的静态内容,您应该手动添加.xhtml 扩展。您不需要对现有静态资源进行任何更改。

用于 CSS 背景图像和 CSS 文件中的其他 url() 引用,这些引用将使用 &lt;h:outputStylesheet&gt; 标签包含(因此不适用于 &lt;link rel="stylesheet&gt;),您需要更改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中有一行,然后我看到了浏览器请求styles.css.xhtml。没有过滤器,没有资源管理器,没有容器安全,这似乎就是它的工作方式。我每周 7 天都在使用 JSF,但即使是使用 *.faces 后缀的最简单的应用程序也完全无法使用。更正之前的评论,没有得到login.xhtml.xhtml,只是login.xhtml,但所有非.xhtml(js、css等)都附加了.xhtml。 使用 .xhtml 可以正常工作,但需要将 .xhtml 添加到样式表中的 url() 引用中会带来一些不便。使用 的 10 行 NetBeans 生成的 Web 项目进行了验证。使用 chrome 开发工具(和 NB http 监视器),我清楚地看到了 style.css.xhtml 的 GET。我只是担心这隐藏了一个更严重的错误配置,如果你对此感到惊讶,我一定做错了什么。我想知道它可能是一个 glassfish 配置问题...我必须检查 domain.xml。 我对此事的最后评论:styles.css.xhtml 的问题仅在您使用 h:outputStylesheet 加载时出现,而不是使用 。我已经记录了这个java.net/jira/browse/JAVASERVERFACES-2153

以上是关于将 JSF 前缀更改为后缀映射迫使我在 CSS 背景图像上重新应用映射的主要内容,如果未能解决你的问题,请参考以下文章

我在express4.1.3中用ejs模板将后缀改为html成功,但是外部引用css文件失败了,求助。

防止在页面加载时将后缀添加到资源中

Luogu P3294 [SCOI2016]背单词

Xcode - 如何将 App ID 后缀从旧帐户更改为新帐户?带有标识符的应用程序 ID 不可用。请输入不同的字符串

将 MSSQL 中用于 Web 映射(Leaflet、Openlayer、OpenStreetMaps、GoogleAPI 等)的投影更改为 WSG48 或任何其他格式

P3294 [SCOI2016]背单词