Принудительный заголовок конкретного ответа для веб-приложения JSF на Glassfish

#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">