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