两天前,我开始在我的jsf应用程序中使用tomahawk ExtensionsFilter组件。
我注意到,所有JavaScript警报均未显示特殊字符(ç,ã,óô),而是显示了诸如#231之类的内容。
当我从web.xml文件中删除ExtensionsFilter时,javascript会显示一切正常。
有人以前有这个问题吗?

提前致谢。

编辑:
我能够通过在extensionFilter之前创建一个过滤器来解决此问题,此新过滤器将REQUEST字符集强制为utf-8。但这是一个丑陋的解决方案,如balusC所说,更好的解决方案是摆脱所有内联JavaScript。

谢谢大家的帮助!

最佳答案

其他一些想法:


添加调用setContentTypesetCharacterEncoding并且在所有其他过滤器之前的过滤器
设置属性-Dfile.encoding
重新绑定javascript window.alert,使其转义字符


这似乎可行,但是会非常难看。这也将是非常有限的,并且如果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使用AspectJ

4)然后对所有“非基本拉丁字符”进行编码。

结论


如果将内容类型设置为无效内容,则ExtensionsFilter将默认为“ else”分支,并且不会对响应进行编码。但是,ExtensionsFilter可能已损坏。
更改setCharacterEncoding可能无效,file.encoding
创建一个额外的过滤器以再次包装响应并还原某些&#xx;可能有效,但是非常难看。


我目前没有其他想法,但是我对答案很感兴趣,因为我也遇到了令人讨厌的编码问题。



更新2:

您可以尝试仅更改MyFaces库中与过滤器中的编码形式有关的部分。根据我对cflowcall切入点选择的理解,类似这样的内容可能会在过滤器发生编码时被截获。如果此定义在请求处理中造成其他干扰,则可能还需要考虑调用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
    }
}

10-07 15:34