Tin's Blog

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

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            128 隨筆 :: 0 文章 :: 221 評(píng)論 :: 0 Trackbacks
          使用jakarta commons-upload。
          升級(jí)到2.2.2后發(fā)現(xiàn)上傳中文會(huì)亂碼。
          經(jīng)過(guò)跟蹤發(fā)現(xiàn)在com.opensymphony.webwork.dispatcher.DispatcherUtils的prepare(HttpServletRequest request, HttpServletResponse response)方法。
          2.2.1->2.2.2時(shí)這個(gè)方法發(fā)生了非常的的變化。
          2.2.1時(shí):?
          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時(shí):
          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沒(méi)有發(fā)現(xiàn)encoding != null && !MultiPartRequest.isMultiPart(request)這個(gè)判斷的意義。但是它會(huì)造成對(duì)multiPartRequest的encoding判斷失敗,中文就會(huì)亂碼。
          所以臨時(shí)的解決方案是將判斷改成:
          if (encoding != null)

          聽(tīng)說(shuō)WW的Jira已經(jīng)不接受新issue了,不知是否真的? Crying or Very sad
          posted on 2006-03-30 21:40 Tin 閱讀(3981) 評(píng)論(11)  編輯  收藏 所屬分類: Webwork相關(guān)

          評(píng)論

          # re: WebWork 2.2.2中文上傳亂碼問(wèn)題[臨時(shí)解決方案] 2006-05-20 02:46 vinson
          用了一個(gè)比較苯的辦法
          自己寫了個(gè)FileUploadInterceptor
          加了個(gè)方法:
          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;
          }
          然后在下面這個(gè)地方用一下:
          Map parameters = reEncode(ac.getParameters());  回復(fù)  更多評(píng)論
            

          # re: WebWork 2.2.2中文上傳亂碼問(wèn)題[臨時(shí)解決方案] 2006-05-24 10:13 Tin
          呵呵,其實(shí)我覺(jué)得不如上面說(shuō)的那個(gè)解決徹底。因?yàn)閱?wèn)題就出在上面描述的位置,我去Webwork論壇問(wèn)了,他們也說(shuō)問(wèn)題就在這里,現(xiàn)在只需if (encoding != null) 然后每次都request.setCharacterEncoding(encoding);就可以了,不需要手工轉(zhuǎn)碼。  回復(fù)  更多評(píng)論
            

          # re: WebWork 2.2.2中文上傳亂碼問(wèn)題[臨時(shí)解決方案] 2006-05-24 14:02 gaston
          用utf-8不可以嗎?  回復(fù)  更多評(píng)論
            

          # re: WebWork 2.2.2中文上傳亂碼問(wèn)題[臨時(shí)解決方案] 2006-05-24 16:55 Tin
          是2.2.2的bug,和UTF-8沒(méi)有直接關(guān)系。  回復(fù)  更多評(píng)論
            

          # re: WebWork 2.2.2中文上傳亂碼問(wèn)題[臨時(shí)解決方案] 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)  回復(fù)  更多評(píng)論
            

          # re: WebWork 2.2.2中文上傳亂碼問(wèn)題[臨時(shí)解決方案] 2006-05-29 16:19 Tin
          GBK沒(méi)有測(cè)試:D
          還有,你用的Jetty我也沒(méi)有測(cè)試。我在Weblogic 9和Tomcat 5上測(cè)試通過(guò)。你調(diào)試一下看看能否搞定:D  回復(fù)  更多評(píng)論
            

          # re: WebWork 2.2.2中文上傳亂碼問(wèn)題[臨時(shí)解決方案] 2006-06-05 15:59 xwiki.com.cn
          http://www.xwiki.com.cn/archives/6 也有類似的答案,還有其它關(guān)于webwork2.2.2的中文問(wèn)題。  回復(fù)  更多評(píng)論
            

          # re: WebWork 2.2.2中文上傳亂碼問(wèn)題[臨時(shí)解決方案] 2006-06-12 14:27 桐妍無(wú)忌
          是不是要修改源碼啊,但是要反編譯,和編譯回來(lái),還要打jar包,反編譯好像都通不過(guò)啊,咋辦啊,救命哦!  回復(fù)  更多評(píng)論
            

          # re: WebWork 2.2.2中文上傳亂碼問(wèn)題[臨時(shí)解決方案] 2006-06-12 15:57 Tin
          不用反編譯,WebWork2是開(kāi)源的。只需將修改過(guò)的源文件編譯后拷貝到/WEB-INF/classes相應(yīng)目錄下就可以,Classloader優(yōu)先訪問(wèn)/classes,然后才是/lib。  回復(fù)  更多評(píng)論
            

          # re: WebWork 2.2.2中文上傳亂碼問(wèn)題[臨時(shí)解決方案] 2006-06-15 11:43 桐妍無(wú)忌
          暈啊,怎么放到/WEB-INF/classes相應(yīng)目錄下了,那個(gè)目錄不是寫的程序編譯出來(lái)的class文件么,我說(shuō)的是改lib下面的webwork-2.2.2.jar程序(這個(gè)是webwork內(nèi)置的包),改這個(gè)內(nèi)置包放到/WEB-INF/classes相應(yīng)目錄下能起作用么,我是菜鳥(niǎo),不懂怎么弄啊,我的QQ:52561097,謝謝指教啊:)  回復(fù)  更多評(píng)論
            

          # re: WebWork 2.2.2中文上傳亂碼問(wèn)題[臨時(shí)解決方案] 2007-04-09 13:48 zzuizui
          struts2似乎也有這個(gè)問(wèn)題, 可是沒(méi)有com.opensymphony.webwork.dispatcher.DispatcherUtils這個(gè)類了,大家是怎么處理的?
            回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 普陀区| 新河县| 大同市| 东源县| 高安市| 庆阳市| 兴业县| 玉门市| 偏关县| 南京市| 台安县| 绥中县| 徐州市| 安溪县| 永春县| 金华市| 藁城市| 积石山| 资中县| 修水县| 麻阳| 雷波县| 三明市| 中宁县| 老河口市| 萍乡市| 靖远县| 沁阳市| 苗栗县| 永丰县| 申扎县| 鄂伦春自治旗| 中阳县| 徐闻县| 定边县| 收藏| 友谊县| 上杭县| 宿松县| 远安县| 沈丘县|