Несколько других идей:
- добавить фильтр, который вызывает 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
}
}