Изменение префикса JSF на сопоставление суффикса вынуждает меня повторно применять сопоставление на фоновых изображениях CSS
Я годами использовал префиксное сопоставление и решил переключиться на суффиксное сопоставление, просто чтобы избавиться от /faces
в URL действительно. Я просто хотел проверить, иду ли я в правильном направлении, прежде чем вырыть себе яму, поскольку происходит несколько неожиданных вещей. Я изменился с этого:
<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
файл - это правильно? Полагаю, это называется суффиксным отображением, но мне это кажется немного неопрятным, и я пытаюсь убедить себя, что это путь.
В моих файлах CSS, на которые ссылается URI, я также должен добавить .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
чтобы все нормально (извините, если годы глупейший вопрос)Почему ограничение безопасности "restrict raw xhtml docs" препятствует загрузке таких ресурсов, как CSS, JavaScript и изображения?
Спасибо за любые отзывы. Я использую Mojarra 2.1.2 на Glassfish 3.1.
1 ответ
и затем я вижу, что ко всему, что происходит через FacesServlet, добавлен файл.xhtml, так что браузер запрашивает файлы.png.xhtml, файл.css.xhtml - это правильно?
Это относится только к ресурсам, включенным <h:outputStylesheet>
а также <h:outputScript>
, Это не связано с изменением в отображении URL. Это связано с переходом с JSF 1.x на JSF 2.x и переходом с <link rel="stylesheet">
а также <script>
на вышеупомянутые теги JSF2.
Для ваших собственных сценариев, таблиц стилей и других статических материалов, которые должны обслуживаться из общедоступного веб-контента, не следует вручную добавлять .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.css
в test.xhtml
следующее
<h:outputStylesheet library="default" name="css/style.css" />
тогда вы должны определить URL фонового изображения следующим образом
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']}");
}
Что касается ограничения безопасности, оно не требуется, когда вы уже используете *.xhtml
отображение. Ограничение безопасности предназначено для предотвращения просмотра конечным пользователем необработанного исходного кода XHTML, когда FacesServlet
отображается на шаблоне, то *.xhtml
, Конечный пользователь сможет увидеть исходный код XHTML, просто удалив /faces
часть из URL в случае /faces/*
отображение или переименование .jsf
в .xhtml
в случае *.jsf
отображение. Избавьтесь от ограничений безопасности, в вашем случае ситуация ухудшится, так как вы уже используете *.xhtml
сопоставление, которое делает невозможным просмотр необработанного исходного кода XHTML путем взлома URL.