小编典典

将JSF前缀更改为后缀映射会迫使我在CSS背景图像上重新应用该映射

css

我已经使用前缀映射多年,并决定切换到后缀映射,只是为了摆脱/facesURL中的。我只是想检查一下我的前进方向是否正确,因为有一些意料之外的事情正在发生,所以我给自己挖了个洞。我从这里改变了:

<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附加)都不会显示。

我想知道的是:

  1. 这是.xhtml一切正常的补充吗(对不起,这是最严肃的问题)

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

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


阅读 265

收藏
2020-05-16

共1个答案

小编典典

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

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

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

对于CSS背景图片和url()CSS文件中的其他参考<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.csstest.xhtml如下

<h:outputStylesheet library="default" name="css/style.css" />

那么您应该如下定义背景图片网址

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']}");
}

至于securiry约束,它是 不是
当你已经在使用所需的*.xhtml映射。安全约束旨在防止最终用户在FacesServlet映射到非XHTML的其他模式时看到原始XHTML源代码*.xhtml。最终用户将可以通过/faces/faces/*映射的情况下仅从URL中删除一部分或在映射的情况下重命名.jsf为XHTML源代码来查看XHTML源代码。摆脱安全性约束,在您的情况下,这将使情况变得更糟,因为您已经在使用映射,这使得通过黑客入侵URL来查看原始XHTML源代码已经不可能了。.xhtml``*.jsf``*.xhtml

2020-05-16