Изменение префикса 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 добавлено) не отображаются.

Все, что я хочу знать, это:

  1. Это добавление .xhtml чтобы все нормально (извините, если годы глупейший вопрос)

  2. Почему ограничение безопасности "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.

Другие вопросы по тегам