黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

Tomcat在處理GET和POST請求時(shí)產(chǎn)生的亂碼問題

系統(tǒng) 2277 0

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

request.setCharacterEncoding("GBK");

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

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

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

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


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

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

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

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


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

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

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

?

??? 因?yàn)樯厦娴拇a是利用了Java的編碼能力,對于所有的Web服務(wù)器都會有效,而setCharacterEncoding方法是通過Web服務(wù)器支持的,并不是所有的Web服務(wù)器都會對該方法有很好的支持。

Tomcat在處理GET和POST請求時(shí)產(chǎn)生的亂碼問題


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論