#java #jsf #jakarta-ee #http-headers
#java #jsf #джакарта-ee #http-заголовки
Вопрос:
У нас есть веб-приложение Java EE 6 с JSF 2.0, работающее на Glassfish 3.1.
Там мы столкнулись со странной ошибкой: тип Mime заголовка ответа, отправляемого Glassfish клиенту, зависит от порядка разрешенных типов Mime в заголовке запроса, отправляемого браузером. Таким образом, в некоторых случаях (в зависимости от браузера) Mime-тип ответа неверен, что приводит к повреждению HTML-страницы. Но объяснение этой вещи заняло бы довольно много времени. Итак, чтобы обойти эту проблему, мы теперь хотим сделать только одну вещь:
Принудительно использовать тип заголовка ответа для всего веб-приложения «text / html».
В настоящее время мы делаем это с помощью фильтра сервлетов, настроенного в Web.xml:
@WebFilter("/BaseFilter")
public class BaseFilter implements Filter {
public BaseFilter() {
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
response.setContentType("text/html;charset=UTF-8");
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
конфигурация в web.xml:
<filter>
<filter-name>BaseFilter</filter-name>
<filter-class>com.company.web.filter.BaseFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>BaseFilter</filter-name>
<url-pattern>/*</url-pattern>
<!-- these patterns should match cached resources -->
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
Итак, мой вопрос в том, есть ли лучший способ принудительно использовать конкретный заголовок ответа, особенно просто настроив его вместо реализации ServletFilter?
Есть ли опция Glassfish для этого?
Комментарии:
1. Что было возвращено вместо этого? По умолчанию используется значение Facelets
text/html
, только набор символов может отличаться в зависимости от сведений о сервере / клиенте. Что касается подхода с фильтром, вы не хотите отправлять файлы JS / CSS / image с этим типом контента. Скорее сопоставьте с<servlet-name>
сервлета JSF вместо<url-pattern>
of/*
.2. «По умолчанию в Facelets используется текст / html, только кодировка может отличаться в зависимости от сведений о сервере / клиенте» Нет. В нашем приложении заголовок ответа варьируется в зависимости от порядка разрешенных типов Mime в заголовке запроса. Он выглядит по-разному (является borken или нет), в зависимости от браузера (либо его текст / html, либо его приложение / xhtml, что нарушает рендеринг). Итак, мы хотим применить его к тексту / html. Спасибо за подсказку относительно JS / CSS, мы изменим это, чтобы фильтровать только сервлет JSF.
3. Хм, больше похоже на ошибку браузера, который сообщает, что предпочитает
application/xhtml
, но не может отобразить это должным образом.4. Нет, я не думаю, что это проблема браузера. Если мы обслуживаем точный HTML-вывод JSF с помощью Apache, он корректно отображается всеми браузерами, независимо от того, в каком порядке расположены их разрешенные Mime-типы.
Ответ №1:
Вы можете указать его в шаблоне по умолчанию с помощью contentType
атрибута <f:view>
.
<f:view contentType="text/html">