myfaces ExtensionsFilter是否会更改页面编码?

时间:2009-12-04 13:50:44

标签: java jsp encoding myfaces tomahawk

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

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

3 个答案:

答案 0 :(得分:2)

其他一些想法:

  • 添加调用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

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

结论

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

我现在没有其他想法,但我对答案感兴趣,因为我还遇到了令人讨厌的编码问题。


更新2:

您可以尝试AspectJ来改变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
    }
}

答案 1 :(得分:1)

它逃脱了XML实体。然而,在JSP / XHTML文件中内联提供Javascript代码也被认为是不好的做法。将其外部化为您在<script src="path/to/file.js"></script>中指定的文件(至少,其URL不应被过滤器覆盖),此特定问题应该消失。

答案 2 :(得分:1)

顺便问一下,你在jsp页面中有没有这些:

<?xml version="1.0" encoding="utf-8"?>

<%@ page pageEncoding="utf-8" %>