代码之家  ›  专栏  ›  技术社区  ›  marcosbeirigo

MyFaces扩展过滤器是否更改页面编码?

  •  1
  • marcosbeirigo  · 技术社区  · 15 年前

    两天前,我开始在我的JSF应用程序中使用Tomahawk扩展过滤器组件。 我注意到所有的javascript警报都没有显示特殊字符(§,,),而是显示类似231的内容。 当我从web.xml文件中删除extensionsfilter时,javascript显示为allright。 以前有人有过这个问题吗?
    事先谢谢。

    编辑: 我可以通过在extensionfilter之前创建一个过滤器来解决这个问题,这个新的过滤器将请求字符集强制为utf-8。但是这是一个丑陋的解决方案,正如Balusc所说,一个更好的解决方案是去掉所有的内联JavaScript。
    谢谢大家的帮助!

    3 回复  |  直到 15 年前
        1
  •  2
  •   ewernli    15 年前

    其他一些想法:

    • 添加调用的筛选器 setContentType setCharacterEncoding 在所有其他过滤器之前
    • 设置属性 -Dfile.encoding
    • 重新绑定javascript window.alert 这样它就可以避开角色

    这似乎有效,但将是一个非常,非常丑陋的黑客。如果javascript设置其他文本,例如 div .

    var hack = window.alert;
    window.alert = function( text ) {
        hack( text + ' was converted' );
    };
    alert('hello');
    

    更新:

    以下是可疑的序列:

    1) ExtensionsFilter 拦截请求

    2)扩展筛选器包含

      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)然后对所有“非基本拉丁字符”进行编码。

    结论

    • 如果将内容类型设置为无效类型,则扩展过滤器将默认为“else”分支,并且不会对响应进行编码。但是,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
        }
    }
    
        2
  •  1
  •   BalusC    15 年前

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

        3
  •  1
  •   Bozho    15 年前

    顺便问一下,您的JSP页面中是否有这些内容:

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

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