Изменение префикса 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 file - это правильно? Это называется суффиксным отображением. Предположим, но это выглядит немного неопрятным для меня, и я пытаюсь убедить себя, что это путь.

В моих файлах 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 ко всему нормальному (извините, если годы самый глупый вопрос)

  • Почему ограничение "ограничить необработанные файлы 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.

Для ваших собственных скриптов, таблиц стилей и других статических материалов, которые должны быть поданы из общедоступного webcontent, вы должны не вручную добавить расширение .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']}");
}

Что касается ограничения securiry, то он не, если вы уже используете сопоставление *.xhtml. Ограничение безопасности предназначено для предотвращения того, чтобы enduser мог видеть исходный исходный код XHTML, когда FacesServlet отображается на другой шаблон, а затем *.xhtml. Конечный пользователь сможет увидеть исходный код XHTML, просто удалив /faces часть из URL-адреса в случае отображения /faces/* или переименования .jsf в .xhtml в случае отображения *.jsf. Избавьтесь от ограничения безопасности, это ухудшит ситуацию, поскольку вы уже используете сопоставление *.xhtml, что делает невозможным просмотр исходного исходного кода XHTML путем взлома URL-адреса.