一些其他的想法:
这似乎工作,但将是一个非常非常丑陋的黑客。这也将是非常有限的,并且如果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将默认为“其他”分支,将不能编码的响应。但是,那么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
}
}
ExtensionsFilter不会更改页面编码。 – BalusC 2009-12-11 23:46:18