我已经使用前缀映射多年,并决定切换到后缀映射,只是为了摆脱/facesURL中的。我只是想检查一下我的前进方向是否正确,因为有一些意料之外的事情正在发生,所以我给自己挖了个洞。我从这里改变了:
/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文件- 对吗?我想这被称为后缀映射,但是对我来说看起来有点不整洁,我正在尝试说服自己这是要走的路。
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。
然后我看到通过FacesServlet进行的所有操作都附加了.xhtml,以便浏览器请求.png.xhtml文件,.css.xhtml文件-是这样吗?
这仅适用于<h:outputStylesheet>和包含的资源<h:outputScript>。这 不 涉及到在URL映射的变化。这与从JSF 1.x到JSF 2.x的更改<link rel="stylesheet">以及<script>从前面提到的JSF2标签的更改有关。
<h:outputStylesheet>
<h:outputScript>
<link rel="stylesheet">
<script>
对于 自己的 脚本,样式表等静态的东西是从公共服务的web内容,你应该 不 手动添加的.xhtml扩展名。您不需要对现有的静态资源进行任何更改。
仅 对于CSS背景图片和url()CSS文件中的其他参考<h:outputStylesheet>(使用标签包含在其中)(因此不适用于<link rel="stylesheet>),则需要更改url()位置以由EL动态解析。您将需要使用以下语法:
url()
<link rel="stylesheet>
body { background-image: url("#{resource['libraryname:path/to/image.png']}"); }
假设您具有以下/resources文件夹结构:
/resources
WebContent |-- META-INF |-- resources | `-- default | |-- images | | `-- background.png | `-- css | `-- style.css |-- WEB-INF `-- test.xhtml
并且,你包括style.css在test.xhtml如下
style.css
test.xhtml
<h:outputStylesheet library="default" name="css/style.css" />
那么您应该如下定义背景图片网址
body { background-image: url("#{resource['default:images/background.png']}"); }
或者, 当您依赖默认库而没有使用时library,则它应该看起来像这样:
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
*.xhtml
/faces/*
.jsf
.xhtml``*.jsf``*.xhtml