Tin's Blog

You are coming a long way, baby~Thinking, feeling, memory...

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  128 随笔 :: 0 文章 :: 221 评论 :: 0 Trackbacks
使用jakarta commons-upload。
升级到2.2.2后发现上传中文会乱码。
经过跟踪发现在com.opensymphony.webwork.dispatcher.DispatcherUtils的prepare(HttpServletRequest request, HttpServletResponse response)方法。
2.2.1->2.2.2时这个方法发生了非常的的变化。
2.2.1时: 
public void prepare(HttpServletRequest request, HttpServletResponse response) { 
        
if (encoding != null) { 
            
try { 
                request.setCharacterEncoding(encoding); 
            } 
catch (Exception e) { 
                LOG.error(
"Error setting character encoding to '" + encoding + "' - ignoring.", e); 
            } 
        } 

        
if (locale != null) { 
            response.setLocale(locale); 
        } 

        
if (paramsWorkaroundEnabled) { 
            request.getParameter(
"foo"); // simply read any parameter (existing or not) to "prime" the request 
        } 
    }

2.2.2时:
public void prepare(HttpServletRequest request, HttpServletResponse response) { 
        String encoding 
= null
        
if (Configuration.isSet(WebWorkConstants.WEBWORK_I18N_ENCODING)) { 
            encoding 
= Configuration.getString(WebWorkConstants.WEBWORK_I18N_ENCODING); 
        } 

        Locale locale 
= null
        
if (Configuration.isSet(WebWorkConstants.WEBWORK_LOCALE)) { 
            locale 
= LocalizedTextUtil.localeFromString(Configuration.getString(WebWorkConstants.WEBWORK_LOCALE), request.getLocale()); 
        } 

        
if (encoding != null && !MultiPartRequest.isMultiPart(request)) { 
            
try { 
                request.setCharacterEncoding(encoding); 
            } 
catch (Exception e) { 
                LOG.error(
"Error setting character encoding to '" + encoding + "' - ignoring.", e); 
            } 
        } 

        
if (locale != null) { 
            response.setLocale(locale); 
        } 

        
if (paramsWorkaroundEnabled) { 
            request.getParameter(
"foo"); // simply read any parameter (existing or not) to "prime" the request 
        } 
    }


我看了jira没有发现encoding != null && !MultiPartRequest.isMultiPart(request)这个判断的意义。但是它会造成对multiPartRequest的encoding判断失败,中文就会乱码。
所以临时的解决方案是将判断改成:
if (encoding != null)

听说WW的Jira已经不接受新issue了,不知是否真的? Crying or Very sad
posted on 2006-03-30 21:40 Tin 阅读(3955) 评论(11)  编辑  收藏 所属分类: Webwork相关

评论

# re: WebWork 2.2.2中文上传乱码问题[临时解决方案] 2006-05-20 02:46 vinson
用了一个比较苯的办法
自己写了个FileUploadInterceptor
加了个方法:
private Map reEncode(Map parameters) throws IOException{
String keys = "";
byte [] temp_t = new byte[]{};
Set entries = parameters.keySet();
Iterator it = entries.iterator();
while (it.hasNext()){
keys = (String)it.next();
if (parameters.get(keys)!=null && parameters.get(keys) instanceof java.lang.String[]){
temp_t = ((String[])parameters.get(keys))[0].getBytes("ISO8859_1");
parameters.put(keys, new String(temp_t,"GBK"));
}
}
return parameters;
}
然后在下面这个地方用一下:
Map parameters = reEncode(ac.getParameters());  回复  更多评论
  

# re: WebWork 2.2.2中文上传乱码问题[临时解决方案] 2006-05-24 10:13 Tin
呵呵,其实我觉得不如上面说的那个解决彻底。因为问题就出在上面描述的位置,我去Webwork论坛问了,他们也说问题就在这里,现在只需if (encoding != null) 然后每次都request.setCharacterEncoding(encoding);就可以了,不需要手工转码。  回复  更多评论
  

# re: WebWork 2.2.2中文上传乱码问题[临时解决方案] 2006-05-24 14:02 gaston
用utf-8不可以吗?  回复  更多评论
  

# re: WebWork 2.2.2中文上传乱码问题[临时解决方案] 2006-05-24 16:55 Tin
是2.2.2的bug,和UTF-8没有直接关系。  回复  更多评论
  

# re: WebWork 2.2.2中文上传乱码问题[临时解决方案] 2006-05-26 16:16 grave
改了后 抛异常...ERROR [2006-05-26 16:14:32] DispatcherUtils.prepare(402) | Error setting character encoding to 'GBK' - ignoring.
java.lang.IllegalStateException: getReader() or getInputStream() called
at org.mortbay.jetty.servlet.ServletHttpRequest.setCharacterEncoding(ServletHttpRequest.java:602)
at javax.servlet.ServletRequestWrapper.setCharacterEncoding(ServletRequestWrapper.java:105)
at com.opensymphony.webwork.dispatcher.DispatcherUtils.prepare(DispatcherUtils.java:400)
at com.opensymphony.webwork.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:158)
at org.mortbay.jetty.servlet.WebApplicationHandler$CachedChain.doFilter(WebApplicationHandler.java:821)
at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:118)
at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:52)
at org.mortbay.jetty.servlet.WebApplicationHandler$CachedChain.doFilter(WebApplicationHandler.java:821)
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:174)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.mortbay.jetty.servlet.WebApplicationHandler$CachedChain.doFilter(WebApplicationHandler.java:821)
at com.opensymphony.webwork.dispatcher.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:78)
at org.mortbay.jetty.servlet.WebApplicationHandler$CachedChain.doFilter(WebApplicationHandler.java:821)
at org.mortbay.jetty.servlet.WebApplicationHandler.dispatch(WebApplicationHandler.java:471)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:568)
at org.mortbay.http.HttpContext.handle(HttpContext.java:1530)
at org.mortbay.jetty.servlet.WebApplicationContext.handle(WebApplicationContext.java:633)
at org.mortbay.http.HttpContext.handle(HttpContext.java:1482)
at org.mortbay.http.HttpServer.service(HttpServer.java:909)
at org.mortbay.http.HttpConnection.service(HttpConnection.java:816)
at org.mortbay.http.HttpConnection.handleNext(HttpConnection.java:982)
at org.mortbay.http.HttpConnection.handle(HttpConnection.java:833)
at org.mortbay.http.SocketListener.handleConnection(SocketListener.java:244)
at org.mortbay.util.ThreadedServer.handle(ThreadedServer.java:357)
at org.mortbay.util.ThreadPool$PoolThread.run(ThreadPool.java:534)  回复  更多评论
  

# re: WebWork 2.2.2中文上传乱码问题[临时解决方案] 2006-05-29 16:19 Tin
GBK没有测试:D
还有,你用的Jetty我也没有测试。我在Weblogic 9和Tomcat 5上测试通过。你调试一下看看能否搞定:D  回复  更多评论
  

# re: WebWork 2.2.2中文上传乱码问题[临时解决方案] 2006-06-05 15:59 xwiki.com.cn
http://www.xwiki.com.cn/archives/6 也有类似的答案,还有其它关于webwork2.2.2的中文问题。  回复  更多评论
  

# re: WebWork 2.2.2中文上传乱码问题[临时解决方案] 2006-06-12 14:27 桐妍无忌
是不是要修改源码啊,但是要反编译,和编译回来,还要打jar包,反编译好像都通不过啊,咋办啊,救命哦!  回复  更多评论
  

# re: WebWork 2.2.2中文上传乱码问题[临时解决方案] 2006-06-12 15:57 Tin
不用反编译,WebWork2是开源的。只需将修改过的源文件编译后拷贝到/WEB-INF/classes相应目录下就可以,Classloader优先访问/classes,然后才是/lib。  回复  更多评论
  

# re: WebWork 2.2.2中文上传乱码问题[临时解决方案] 2006-06-15 11:43 桐妍无忌
晕啊,怎么放到/WEB-INF/classes相应目录下了,那个目录不是写的程序编译出来的class文件么,我说的是改lib下面的webwork-2.2.2.jar程序(这个是webwork内置的包),改这个内置包放到/WEB-INF/classes相应目录下能起作用么,我是菜鸟,不懂怎么弄啊,我的QQ:52561097,谢谢指教啊:)  回复  更多评论
  

# re: WebWork 2.2.2中文上传乱码问题[临时解决方案] 2007-04-09 13:48 zzuizui
struts2似乎也有这个问题, 可是没有com.opensymphony.webwork.dispatcher.DispatcherUtils这个类了,大家是怎么处理的?
  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: