是否myfaces ExtensionsFilter更改页面编码?
两天前我开始使用tomahawk ExtensionsFilter组件,我的jsf应用程序。 我注意到,所有的javascript警报都没有显示特殊字符(ç,ã,óô),它显示的东西像#231代替。 当我从我的web.xml文件中删除ExtensionsFilter时,JavaScript显示所有权利。 以前有人有过这个问题吗?
在此先感谢。是否myfaces ExtensionsFilter更改页面编码?
编辑: 我能够通过在extensionFilter之前创建一个过滤器来解决问题,这个新的过滤器强制REQUEST字符集为utf-8。但是,这是一个丑陋的解决方案,更好的解决方案,因为balusC说,将摆脱所有的内联JavaScript。
谢谢大家的帮助!
一些其他的想法:
- 添加过滤器调用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将默认为“其他”分支,将不能编码的响应。但是,那么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
}
}
它转义XML实体。然而,在JSP/XHTML文件中内联Javascript代码也被认为是不好的做法。在它自己的文件中将其外部化,您在<script src="path/to/file.js"></script>
中指定的文件(至少其筛选器不应包含其URL),并且此特定问题应该消失。
是的,我知道有多么糟糕内嵌的javascript,但它是一个有1000多个jsp文件的巨大应用程序,我们没有时间去更改所有这些文件。其他合理的解决方案感谢您的回应。 – marcosbeirigo 2009-12-09 11:20:39
尝试更具体的过滤器映射。将其映射到实际需要此过滤器的页面的“url-pattern”上,然后仅更改这些页面。 – BalusC 2009-12-09 12:53:38
顺便说一句,你有任何这些在JSP页面:
<?xml version="1.0" encoding="utf-8"?>
或
<%@ page pageEncoding="utf-8" %>
我有html元数据标签charset = utf-8 – marcosbeirigo 2009-12-14 11:58:57
这并不总是足够的 – Bozho 2009-12-14 12:01:46
是的我知道,我试过但后来我所有的jsp标签都搞砸了,只有JavaScript。 – marcosbeirigo 2009-12-14 12:06:55
ExtensionsFilter不会更改页面编码。 – BalusC 2009-12-11 23:46:18