其他一些想法:
这似乎可行,但将是一个非常非常丑陋的黑客。如果 javascript 设置其他文本(例如div
.
var hack = window.alert;
window.alert = function( text ) {
hack( text + ' was converted' );
};
alert('hello');
更新:
这是可疑的序列:
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
这样的事情可能会在过滤器发生时拦截编码。如果此定义在请求处理中产生其他干扰,您可能还需要考虑调用 toaddResource.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
}
}