<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
    數據加載中……

    Tomcat在處理GET和POST請求時產生的亂碼問題

    本文為原創,如需轉載,請注明作者和出處,謝謝

        有個朋友寫JSP程序時,在Servlet中取請求參數時出現了亂碼,當然,這種亂碼問題再簡單不過了。由于在JSP中使用了GBK作用頁面的編碼,那么提交的中文信息自然也會被按著GBK進行編碼,為%xx格式的GBK編碼。
        要解決這個問題可以說是方法多多。最簡單的就是使用request.setCharacterEncoding方法設置編碼格式,如下面的代碼所示:

    request.setCharacterEncoding("GBK");

        在設置完編碼格式之后,就可以直接通過request.getParameter方法來獲得請求參數中的中文信息了。當然,為了方便,還可以在過濾器中加入上面的語句,這樣所有的Servlet都可以直接使用
    request.getParameter方法來獲得請求參數中的中文信息了。 除了這兩種方法,還可以不使用request.setCharacterEncoding("GBK"),而使用下面的語言來轉換編碼:

    String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");

        但為了更快解決這個問題,我就直接告訴這位朋友使用了setCharacterEncoding方法來設置編碼。但是說來奇怪,還是出現亂碼,沒有任何解決問題的跡象。 最郁悶的事就是使用了自己認為100%能解決問題的方法,而這種方法卻一點都沒起作用。
        最后又讓朋友試了最后一種方法,說來奇怪,竟然好使了。當然,這也沒什么可奇怪的,本來就應該好使,但奇就奇在setCharacterEncoding方法并沒有去掉,也就是說,同時使用了下面兩條語句,竟然得到了正常的中文請求參數值:

    request.setCharacterEncoding("GBK");
    String name 
    = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");
    System.out.println(name);  
    //  正常輸出中文請求參數

        按著常理來說,這是不可能的,既然使用了setCharacterEncoding方法設置成了GBK,再使用
    new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK")來轉換,得到的應該是?????,不可能是正常的中文,只有將setCharacterEncoding方法去了,以ISO-8859-1格式保存的字符串才可以用ISO-8859-1格式還原,再用GBK重新保存成Java字符串(這一步實際上就是GBK轉Unicode)。

        但經過仔細思考后,決定看下JSP代碼是如何寫的。不看不知道,一看嚇一跳,原來<form>在提交時使用的是GET,而未用POST,這當然沒什么了不起的,用什么都可以,但對編碼就有問題了。自從Tomcat5.x開始,GET和POST方法提交的信息,Tomcat采用了不同的方式來處理編碼,對于POST請求,Tomcat會仍然使用request.setCharacterEncoding方法所設置的編碼來處理,如果未設置,則使用默認的iso-8859-1編碼。而GET請求則不同,Tomcat對于GET請求并不會考慮使用
    request.setCharacterEncoding方法設置的編碼,而會永遠使用iso-8859-1編碼,而這位朋友使用的正好是GET請求,因此,tomcat將會使用iso-8859-1將提交的字節轉換成字符串。

    解決的方法有兩個:
    1.  將GET請求改成POST請求,然后就可以使用
    request.setCharacterEncoding方法設置編碼,并使用request.getParameter方法直接獲得中文請求參數了。
    2.  不用改GET請求,在Servlet中使用如下的代碼來得到中文請求參數。

    String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");

        綜上所述,如果使用了GET請求,則setCharacterEncoding方法不起作用,只能使用上面的代碼來解決,而使用POST請求,盡管
    setCharacterEncoding方法起作用,但使用上面的代碼仍然好使(在這時不能使用setCharacterEncoding方法將編碼格式設置成非iso-8859-1格式)。因此,如果想讓Servlet可以同時處理GET和POST請求中的中文信息,除了判斷這兩種方法外,還可以使用上面的代碼來同時處理這兩種請求的中文信息。

        筆者建議使用如下的代碼來獲得中文請求參數:

    String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");

        因為上面的代碼是利用了Java的編碼能力,對于所有的Web服務器都會有效,而setCharacterEncoding方法是通過Web服務器支持的,并不是所有的Web服務器都會對該方法有很好的支持。





    Android開發完全講義(第2版)(本書版權已輸出到臺灣)

    http://product.dangdang.com/product.aspx?product_id=22741502



    Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


    新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

    posted on 2008-09-05 15:48 銀河使者 閱讀(3063) 評論(8)  編輯  收藏 所屬分類: javaweb 原創

    評論

    # re: Tomcat在處理GET和POST請求時產生的亂碼問題  回復  更多評論   


    我還真以為你發現了什么。
    2008-09-05 19:44 | 隨便

    # re: Tomcat在處理GET和POST請求時產生的亂碼問題  回復  更多評論   

    只是解釋一下為什么最好用String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");,哈哈。
    2008-09-05 20:03 | 銀河使者

    # re: Tomcat在處理GET和POST請求時產生的亂碼問題  回復  更多評論   

    tomcat就是有這樣很變態的問題.
    新人學習中....
    2008-09-12 00:19 | 樓上兩位很垃圾

    # re: Tomcat在處理GET和POST請求時產生的亂碼問題  回復  更多評論   

    謝謝。確實很大幫助。其他網頁上通常說在server.xml中設置URIEncoding就可以,但事實上不起作用。采用筆者使用的方法成功了。 我使用的是Tomcat 6。
    2008-09-25 20:46 | 專吃飯右手

    # re: Tomcat在處理GET和POST請求時產生的亂碼問題  回復  更多評論   

    一直搞不明白為什么request.setCharacterEncoding("GBK")不起作用,看了這篇文章,茅塞頓開。
    2008-10-05 10:14 | 文濤

    # re: Tomcat在處理GET和POST請求時產生的亂碼問題  回復  更多評論   

    好!
    2008-10-24 16:05 | lyshyhaungli

    # re: Tomcat在處理GET和POST請求時產生的亂碼問題  回復  更多評論   

    j2ee的API里說的很清楚
    setCharacterEncoding
    public void setCharacterEncoding(java.lang.String env)
    throws java.io.UnsupportedEncodingExceptionOverrides the name of the character encoding used in the body of this request. This method must be called prior to reading request parameters or reading input using getReader().
    有什么疑問請參考http://rubyeye.javaeye.com/blog/266705

    # re: Tomcat在處理GET和POST請求時產生的亂碼問題  回復  更多評論   

    真是太感謝這篇樓主了,這篇帖子很棒!
    2009-05-31 19:12 | 茅塞頓開
    主站蜘蛛池模板: 亚洲愉拍一区二区三区| 亚洲日本香蕉视频| 免费人成动漫在线播放r18| 性色av免费观看| 亚洲影院天堂中文av色| 亚州免费一级毛片| 亚洲成年人免费网站| 国产免费丝袜调教视频| 亚洲Av无码一区二区二三区| 日本片免费观看一区二区| 亚洲av永久综合在线观看尤物| 亚洲一级免费毛片| 久久国产亚洲精品| 国产成人免费手机在线观看视频| 朝桐光亚洲专区在线中文字幕 | 国产成人无码精品久久久久免费| 亚洲电影日韩精品| 中国国语毛片免费观看视频| 亚洲va无码专区国产乱码| 777爽死你无码免费看一二区 | 亚洲av永久无码天堂网| 四虎永久成人免费| 国产久爱免费精品视频| 婷婷久久久亚洲欧洲日产国码AV | 亚洲中文字幕无码爆乳av中文 | 亚洲精品中文字幕乱码三区| 亚欧免费一级毛片| 亚洲色偷精品一区二区三区| 亚洲国产高清精品线久久| 光棍天堂免费手机观看在线观看| 亚洲综合激情另类小说区| 天天摸天天操免费播放小视频| 亚洲精品偷拍视频免费观看| 亚洲人成电影福利在线播放 | 在线观看免费人成视频色| 噜噜综合亚洲AV中文无码| 亚洲AV无码专区国产乱码电影| 蜜桃视频在线观看免费网址入口| 羞羞视频免费网站日本| 久久精品国产亚洲AV电影| 国产嫩草影院精品免费网址|