新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     >>计算机科学论坛<<     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论Java, J2SE, J2ME, J2EE, 以及Eclipse, NetBeans, JBuilder等Java开发环境,还有JSP, JavaServlet, JavaBean, EJB以及struts, hibernate, spring, webwork2, Java 3D, JOGL等相关技术。
    [返回] 计算机科学论坛计算机技术与应用『 Java/Eclipse 』 → spring的filter与tomcat的get和post(转自我的blog) 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 9934 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: spring的filter与tomcat的get和post(转自我的blog) 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     mfc42d 帅哥哟,离线,有人找我吗?
      
      
      等级:大三暑假(ITELS考了6.5分!)(版主)
      文章:65
      积分:882
      门派:XML.ORG.CN
      注册:2004/6/13

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给mfc42d发送一个短消息 把mfc42d加入好友 查看mfc42d的个人资料 搜索mfc42d在『 Java/Eclipse 』的所有贴子 引用回复这个贴子 回复这个贴子 查看mfc42d的博客楼主
    发贴心情 spring的filter与tomcat的get和post(转自我的blog)

    使用Tomcat 5.0.20,我们使用Form submit 的数据將会以ISO8859-1处理,我们必须自己将字符串转换为GB2312/GBK(简体中文),在web程序中,对所有的 request.getParameter("xx"); 作了 toGBKString() 的处理,发现还是出现了中文问题,中文还是可能变成乱码!
    经过分析,发现问题出在 QueryString的处理上,在使用 Tomcat 4.x时,对于 SUBMIT 時无论采用 GET or POST,Tomcat server 对 parameters 的处理都采用ISO8859-1处理,但在 Tomcat 5.x 版,将get请求独立出来,如果Form 的 Method 採用 GET 及或者在 URL 上的写中文,上传到 Tomcat时,无论如何转码,都是乱码,即使使用 URLEncode结果也一样。
    通过研究tomcat的文档可以找到解决办法,在$TOMCAT_HOME/webapps/tomcat-docs/config/http.html 中写道
    URIEncoding:

    This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, ISO-8859-1 will be used.

    useBodyEncodingForURI:

    This specifies if the encoding specified in contentType should be used for URI query parameters, instead of using the URIEncoding. This setting is present for compatibility with Tomcat 4.1.x, where the encoding specified in the contentType, or explicitely set using Request.setCharacterEncoding method was also used for the parameters from the URL. The default value is false
    以上 Tomcat 参数,是设定在 server.xml 中的 http <Connector />中,必须设定这两个参数其中之一。
    URIEncoding 设定为 URIEncoding="ISO-8859-1" 指定为 "ISO-8859-1" 编码,让 QueryString 的编码与 post body 相同。
    useBodyEncodingForURI 用来兼容 Tomcat 4.x 版的,值是 "true" or "false",指 "要不要让 QueryString 与 POST BODY 采用相同的编码 ",设成 true,就可以做到 "ISO-8859-1" 编码。
    建议采用 URIEncoding 的设定,因为 useBodyEncodingForURI是为了兼容 Tomcat 4.X。不过按照原文的说明,这两个参数都不设,Tomcat 也应该采用 "ISO-8859-1" 的编码,为什末还是有问题呢?
    只好看 Tomcat Source Code了
    在org.apache.tomcat.util.http.Parameters类,Tomcat用来处理QueryString,
    private String urlDecode(ByteChunk bc, String enc)
            throws IOException {
            if( urlDec==null ) {
                urlDec=new UDecoder();   
            }
            urlDec.convert(bc);
            String result = null;
            if (enc != null) {
                bc.setEncoding(enc);
                result = bc.toString();
            } else {
                CharChunk cc = tmpNameC;
                cc.allocate(bc.getLength(), -1);
                // Default encoding: fast conversion
                byte[] bbuf = bc.getBuffer();
                char[] cbuf = cc.getBuffer();
                int start = bc.getStart();
                for (int i = 0; i < bc.getLength(); i++) {
                    cbuf[i] = (char) (bbuf[i + start] & 0xff);
                }
                cc.setChars(cbuf, 0, bc.getLength());
                result = cc.toString();
                cc.recycle();
            }
            return result;
        }
        tomcat处理 QueryString时,如果没有设定 encode,并没有采用 ISO-8859-1 的编码,而是用 fast conversion 来处理,才会造成中文问题,所以必须在 Server.xml 中加上 URLEncoding 的参数才行.
        Connector 的设定
        <Connectordebug="0"acceptCount="100"connectionTimeout="20000"disableUploadTimeout="true"port="80"redirectPort="8443"enableLookups="false"minSpareThreads="25"maxSpareThreads="75"maxThreads="150"maxPostSize="0"URIEncoding="ISO-8859-1"></Connector>
        所以在使用 Tomcat 4 通过 GET or POST 的方式传参数时,通常都是使用 Filter 的方式解决中文传参数的问题。
    但是到了 Tomcat 5.0.20 之后,解决中文传参数的问题,就必须考虑是使用 GET or POST,两种的方式不同。
    使用 GET 的方式
    String name = new String((request.getParameter("name")).getBytes("ISO-8859-1"),"GBK");
    使用 POST 的方式
    request.setCharacterEncoding("GBK");

    如果设定URIEncoding="UTF-8"和使用 IE, 设定总是以 UTF8发送URL,你还可以用<img src="我的图片.jpg" />

    使用Filter的处理 :先判断是使用那种方式( GET or POST),假若是用 GET 的方式就采用第一个;若使用POST 方式,就采用第二个

    HttpServletRequest httpServletRequest = (HttpServletRequest) request;
    if (httpServletRequest.getMethod().equals("POST"))
    {        request.setCharacterEncoding("UTF-8");}
    else if (httpServletRequest.getMethod().equals("GET"))
    {
             //进行处理
    }
    注意spring的filter病没有解决这个问题,以下是他的代码
    protected void doFilterInternal(
       HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
       throws ServletException, IOException {
      
      if (this.forceEncoding || request.getCharacterEncoding() == null) {
       request.setCharacterEncoding(this.encoding);
      }
      filterChain.doFilter(request, response);
    }


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/11/23 17:46:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 Java/Eclipse 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/4/18 5:04:18

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    58.594ms