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

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

有帮助吗?

解决方案

其他一些想法:

  • 添加调用的过滤器 设置内容类型 或者 设置字符编码 它位于所有其他过滤器之前
  • 设置属性 -Dfile.encoding
  • 重新绑定 JavaScript window.alert 这样它就可以逃脱角色

这似乎可行,但会是一个非常非常难看的黑客行为。这也将是非常有限的,如果 javascript 设置其他文本,例如的内容 div.

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

更新:

这是可疑的序列:

1) 扩展过滤器 拦截请求

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) 默认添加资源 用途 HtmlResponseWriterImpl 它使用 Unicode编码器.

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

结论

  • 如果您将内容类型设置为无效的内容,ExtensionsFilter 将默认为“else”分支,并且不会对响应进行编码。但是,ExtensionsFilter 可能已损坏。
  • 更改 setCharacterEncoding 可能没有任何效果, file.encoding
  • 创建一个额外的过滤器来再次包装响应并恢复一些 &#xx; 可以工作,但非常丑陋。

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


更新2:

你可以尝试一下 方面J 仅更改 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
    }
}

其他提示

有逸出XML实体。然而,也有认为是不良的做法来服务Javascript代码内嵌在JSP / XHTML文件。外部化在其自己的文件,你在<script src="path/to/file.js"></script>指定(至少,它的网址不应该被过滤器覆盖)和这方面的问题应该会消失。

顺便说一句,你有任何这些在JSP页面:

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

<%@ page pageEncoding="utf-8" %>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top