Меняет ли myfaces ExtensionsFilter кодировку страницы? - PullRequest
1 голос
/ 04 декабря 2009

два дня назад я начал использовать компоненты Tomahawk ExtensionsFilter в своем приложении jsf. я заметил, что все предупреждения javascript не отображали специальные символы (ç, ã, ôô), вместо этого он отображает такие вещи, как # 231. Когда я удаляю ExtensionsFilter из моего файла web.xml, JavaScript отображается нормально. У кого-нибудь была эта проблема раньше?
заранее спасибо.

EDIT: Я смог решить эту проблему, создав фильтр до extensionFilter, этот новый фильтр вынудил набор символов REQUEST к utf-8. Но это уродливое решение, и, как сказал balusC, лучшим решением было бы избавиться от всего встроенного JavaScript.
Спасибо всем за помощь!

Ответы [ 3 ]

2 голосов
/ 12 декабря 2009

Несколько других идей:

  • добавить фильтр, который вызывает setContentType или setCharacterEncoding и который стоит перед всеми остальными фильтрами
  • установить свойство -Dfile.encoding
  • перепривязать javascript window.alert, чтобы он экранировал символы

Это похоже на работу, но было бы очень, очень уродливым взломом. Это также будет очень ограниченным и не будет работать, если javascript устанавливает другие тексты, например содержание div.

var hack = window.alert;
window.alert = function( text ) {
    hack( text + ' was converted' );
};
alert('hello');

UPDATE:

Вот подозрительная последовательность:

1) ExtensionsFilter перехватывает запрос

2) ExtensionsFilter содержит

  154   // only parse HTML responses
  155   if (extendedResponse.getContentType() != null && isValidContentType(extendedResponse.getContentType()))
  156   {
        ...
  172        // writes the response
  173        addResource.writeResponse(extendedRequest, servletResponse);
  174    }
  175   else
  176   {
  178        byte[] responseArray = extendedResponse.getBytes();
  180        if(responseArray.length > 0)
  181       {
  182       // When not filtering due to not valid content-type, deliver the byte-array instead of a charset-converted string.
  183       // Otherwise a binary stream gets corrupted.
  184       servletResponse.getOutputStream().write(responseArray);
  185     }

3) DefaultAddResource использует HtmlResponseWriterImpl , который использует UnicodeEncoder .

4) Затем кодируются все «неосновные латинские символы».

Заключение

  • если вы установите тип содержимого на что-то недопустимое, ExtensionsFilter по умолчанию будет использовать ветку «else» и не будет кодировать ответ. Но тогда фильтр ExtensionsFilter, вероятно, сломан.
  • изменение setCharacterEncoding, вероятно, не имеет никакого эффекта, ни file.encoding
  • Создание дополнительного фильтра для повторной упаковки ответа и возврата некоторых из &#xx; может работать, но крайне уродливо.

У меня сейчас нет других идей, но мне интересен ответ, так как я также столкнулся с проблемой кодирования, которая раздражала.


ОБНОВЛЕНИЕ 2:

Вы можете попробовать AspectJ , чтобы изменить только часть библиотеки MyFaces, которая относится к форме кодирования внутри фильтра. Согласно моему пониманию cflow и call комплектации точек, что-то подобное может перехватить кодировку, когда это происходит из фильтра. Если это определение создает другие помехи в обработке запроса, вы можете также рассмотреть возможность вызова addResource.writeResponse, чтобы дополнительно ограничить точку нарезки.

public aspect SkipEncoding {  
    pointcut encodingInExtFilter() : 
        cflow( * org.apache.myfaces.webapp.filter. ExtensionsFilter.doFilter(..) ) && 
        call ( String UnicodeEncoder.encode( String, bool, bool ));   
    around( String s, bool b1, bool b2 ) : encodingInExtFilter
    {
        return s; // skip encoding
    }
}
1 голос
/ 14 декабря 2009

Кстати, у вас есть что-нибудь из этого на ваших страницах jsp:

<?xml version="1.0" encoding="utf-8"?>

или

<%@ page pageEncoding="utf-8" %>
1 голос
/ 08 декабря 2009

Это экранирует сущности XML. Однако также считается плохой практикой использование встроенного кода Javascript в файле JSP / XHTML. Выделите его в свой собственный файл, который вы указали в <script src="path/to/file.js"></script> (по крайней мере, его URL-адрес не должен быть закрыт фильтром), и эта конкретная проблема должна исчезнуть.

...