当前位置: 首页 > 面试题库 >

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

邓深
2023-03-14
问题内容

我已经使用前缀映射多年,并决定切换到后缀映射,只是为了摆脱/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。


问题答案:

然后我看到通过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



 类似资料:
  • 前缀映射,后缀映射和缓存映射 通过 names.NewPrefixMapper(names.SnakeMapper{}, "prefix") 可以创建一个在 SnakeMapper 的基础上在命名中添加统一的前缀,当然也可以把 SnakeMapper{} 换成 SameMapper 或者你自定义的 Mapper。 例如,如果希望所有的表名都在结构体自动命名的基础上加一个前缀而字段名不加前缀,则可以

  • 问题内容: 我有此jquery代码,可在单击时更改背景图像: 但是,它没有改变。有什么我想念的吗? 问题答案: 您需要包括该属性的一部分。

  • 问题内容: 我想居中背景图像。没有使用div,这是CSS样式: 上面的CSS会全部平铺并将其居中,但是看不到一半的图像,只是向上移动了一点。我想做的就是将图像居中。我可以在21英寸的屏幕上观看图像吗? 问题答案: background-image: url(path-to-file/img.jpg); background-repeat:no-repeat; background-position

  • 我应该将以下内容转换为后缀形式: 我得到了这个答案: 这是正确的吗?如果我使用了错误的后缀形式,那么之后还有很多问题都是不正确的。如果我错了,你能告诉我为什么吗?谢谢你的帮助。

  • 问题内容: 我有一个网站(g-floors.eu),并且我想使背景(在CSS中我为内容定义一个bg图像)也具有响应性。不幸的是,除了我可以想到的一件事外,我真的对如何执行此操作一无所知,但这是一个解决方法。创建多个图像,然后使用css屏幕大小更改图像,但是我想知道是否有更实用的方法来实现此目的。 基本上,我想要实现的是图像(带有水印“ G”)自动调整大小,而不会显示更少的图像。如果可能的话 我到目