2009-12-04 37 views
1

两天前我开始使用tomahawk ExtensionsFilter组件,我的jsf应用程序。 我注意到,所有的javascript警报都没有显示特殊字符(ç,ã,óô),它显示的东西像#231代替。 当我从我的web.xml文件中删除ExtensionsFilter时,JavaScript显示所有权利。 以前有人有过这个问题吗?
在此先感谢。是否myfaces ExtensionsFilter更改页面编码?

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

回答

2

一些其他的想法:

  • 添加过滤器调用setContentTypesetCharacterEncoding并且这是所有其他过滤器之前
  • 设置属性-Dfile.encoding
  • 重新绑定的JavaScript window.alert,使其逃脱字符

这似乎工作,但将是一个非常非常丑陋的黑客。这也将是非常有限的,并且如果javascript设置其他文本,则不起作用。内容为div

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

UPDATE:

这里是值得怀疑的序列:

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将默认为“其他”分支,将不能编码的响应。但是,那么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 
    } 
} 
+0

ExtensionsFilter不会更改页面编码。 – BalusC 2009-12-11 23:46:18

1

它转义XML实体。然而,在JSP/XHTML文件中内联Javascript代码也被认为是不好的做法。在它自己的文件中将其外部化,您在<script src="path/to/file.js"></script>中指定的文件(至少其筛选器不应包含其URL),并且此特定问题应该消失。

+0

是的,我知道有多么糟糕内嵌的javascript,但它是一个有1000多个jsp文件的巨大应用程序,我们没有时间去更改所有这些文件。其他合理的解决方案感谢您的回应。 – marcosbeirigo 2009-12-09 11:20:39

+0

尝试更具体的过滤器映射。将其映射到实际需要此过滤器的页面的“url-pattern”上,然后仅更改这些页面。 – BalusC 2009-12-09 12:53:38

1

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

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

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

我有html元数据标签charset = utf-8 – marcosbeirigo 2009-12-14 11:58:57

+0

这并不总是足够的 – Bozho 2009-12-14 12:01:46

+0

是的我知道,我试过<%@ page pageEncoding =“utf-8”%>但后来我所有的jsp标签都搞砸了,只有JavaScript。 – marcosbeirigo 2009-12-14 12:06:55