gpt4 book ai didi

java - myfaces ExtensionsFilter 是否更改页面编码?

转载 作者:行者123 更新时间:2023-11-29 04:03:31 26 4
gpt4 key购买 nike

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

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

最佳答案

其他一些想法:

  • 添加调用setContentType 的过滤器或 setCharacterEncoding并且在所有其他过滤器之前
  • 设置属性-Dfile.encoding
  • 重新绑定(bind) javascript window.alert 以便它转义字符

这似乎可行,但会是一个非常、非常丑陋的 hack。这也将非常有限,如果 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
}
}

关于java - myfaces ExtensionsFilter 是否更改页面编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1847066/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com