将JSF前缀更改为后缀映射会强制我重新应用CSS背景图像上的映射

时间:2011-07-26 19:35:11

标签: css jsf jsf-2 facelets

我多年来一直在使用前缀映射,并决定切换到后缀 映射,只是为了真正摆脱网址中的/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)不显示。

我想知道的是:

  1. 这会将.xhtml追加到正常的一切(对不起,多年来 最愚蠢的问题)

  2. 为什么'限制原始xhtml文档'安全约束会阻止资源,例如 来自加载的CSS,JavaScript和图片?

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

1 个答案:

答案 0 :(得分:17)

  

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

并且您将style.css包含在test.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源代码。最终用户只能在/faces映射的情况下从URL中删除/faces/*部分,或者在.jsf重命名为.xhtml时才能看到XHTML源代码*.jsf映射。摆脱安全约束,它会使你的情况变得更糟,因为你已经使用*.xhtml映射,这使得通过黑客攻击URL已经无法看到原始的XHTML源代码。