Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java myfaces ExtensionsFilter是否更改页面编码?_Java_Jsp_Encoding_Myfaces_Tomahawk - Fatal编程技术网

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

Java myfaces ExtensionsFilter是否更改页面编码?,java,jsp,encoding,myfaces,tomahawk,Java,Jsp,Encoding,Myfaces,Tomahawk,两天前,我开始在jsf应用程序中使用tomahawk ExtensionsFilter组件。 我注意到所有javascript警报都没有显示特殊字符(ç,ã,ó),而是显示像#231这样的东西。 当我从web.xml文件中删除ExtensionsFilter时,javascript会正确显示。 以前有人有过这个问题吗? 提前谢谢 编辑: 我能够通过在extensionFilter之前创建一个过滤器来解决这个问题,这个新过滤器强制请求字符集为utf-8。但这是一个丑陋的解决方案,一个更好的解决方

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

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

谢谢大家的帮助

它转义XML实体。然而,在JSP/XHTML文件中内联提供Javascript代码也被认为是不好的做法。将其外部化到您在
中指定的自己的文件中(至少,它的URL不应包含在过滤器中),这个特殊问题应该消失。

它会转义XML实体。然而,在JSP/XHTML文件中内联提供Javascript代码也被认为是不好的做法。将其外部化到您在
中指定的自己的文件中(至少,它的URL不应该被过滤器覆盖),这个特殊问题应该消失。

其他一些想法:

  • 添加调用或且在所有其他筛选器之前的筛选器
  • 设置属性
    -Dfile.encoding
  • 重新绑定javascript
    窗口。警报
    ,使其转义字符
这似乎有效,但将是一个非常非常丑陋的黑客。如果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) 使用哪一个使用哪一个

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

结论

  • 如果将内容类型设置为无效,ExtensionFilter将默认为“else”分支,并且不会对响应进行编码。但是,ExtensionsFilter可能已损坏
  • 更改setCharacterEncoding可能没有效果,
    文件.encoding也没有效果
  • 创建一个额外的过滤器,再次包装响应并还原部分
    &#xx可以工作,但非常难看
我现在没有其他想法,但我对答案很感兴趣,因为我还碰到了编码问题,这很烦人


更新2:

您可以尝试只更改MyFaces库中与过滤器中的编码表单相关的部分。根据我对
cflow
call
切入点选取的理解,当编码从过滤器中发生时,类似的东西可能会拦截编码。如果此定义在请求处理中产生其他干扰,您可能还需要考虑调用<代码> AddioReal.WrreSereSpuns以进一步限制切入点。p>
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
    }
}
其他一些想法:

  • 添加调用或且在所有其他筛选器之前的筛选器
  • 设置属性
    -Dfile.encoding
  • 重新绑定javascript
    窗口。警报
    ,使其转义字符
这似乎有效,但将是一个非常非常丑陋的黑客。如果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) 使用哪一个使用哪一个

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

结论

  • 如果将内容类型设置为无效,ExtensionFilter将默认为“else”分支,并且不会对响应进行编码。但是,ExtensionsFilter可能已损坏
  • 更改setCharacterEncoding可能没有效果,
    文件.encoding也没有效果
  • 创建一个额外的过滤器,再次包装响应并还原部分
    &#xx可以工作,但非常难看
我现在没有其他想法,但我对答案很感兴趣,因为我还碰到了编码问题,这很烦人


更新2:

您可以尝试只更改MyFaces库中与过滤器中的编码表单相关的部分。根据我对
cflow
call
切入点选取的理解,当编码从过滤器中发生时,类似的东西可能会拦截编码。如果此定义在请求处理中产生其他干扰,您可能还需要考虑调用<代码> AddioReal.WrreSereSpuns以进一步限制切入点。p>
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
    }
}

顺便问一下,您的jsp页面中是否有以下内容:

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


顺便问一下,您的jsp页面中是否有以下内容:

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



是的,我知道内联javascript有多糟糕,但它是一个包含1000多个jsp文件的大型应用程序,我们没有时间更改所有这些文件。还有其他合理的解决办法吗?感谢您的回复。请尝试更具体的筛选器映射。将它映射到实际需要此过滤器的页面的
url模式
s上,然后仅更改这些页面。是的,我知道内联javascript有多糟糕,但它是一个包含1000多个jsp文件的大型应用程序,我们只是没有时间更改所有这些文件。还有其他合理的解决办法吗?感谢您的回复。请尝试更具体的筛选器映射。将其映射到实际需要此筛选器的页面的
url模式
s上,然后仅更改这些页面。ExtensionsFilter不更改页面编码。ExtensionsFilter不更改页面编码。是的,我知道,我尝试过,但后来我所有的jsp标签都出错了,而不仅仅是javascript。这会让我失望