Изменение префикса JSF на сопоставление суффиксов заставляет меня повторно применять сопоставление на фоновых изображениях CSS - PullRequest
14 голосов
/ 26 июля 2011

Я годами использовал префиксное сопоставление и решил переключиться на суффиксное сопоставление, просто чтобы действительно избавиться от /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 и изображения, иззагрузка?

Спасибо за любые отзывы.Я использую Мохарру 2.1.2 на Glassfish 3.1.

1 Ответ

17 голосов
/ 26 июля 2011

и затем я вижу, что ко всему, что происходит через 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.

...