您現在的位置是:電腦技術吧?>? 編程技術 ??>??上傳參數亂碼,request參數亂碼??>??正文詳情

上傳參數亂碼,request參數亂碼

忻云夢2019-12-16 11:21:59 人圍觀
簡介ajax傳遞中文參數亂碼計算機誕生于美國,英語是他的母語,其他語言是他的外語。像我們一樣,不管他掌握得多好,他也不會像母語那樣使用外語。他經常犯一些拼寫錯誤。產生誤碼的

計算機生于美國,英語是他的母語,而英語以外的其它語言對他來說都是外語。

他跟我們一樣,不管外語掌握到什么程度,也不會像母語那樣使用得那么好,時常也會出一些拼寫錯誤問題。

亂碼的出現根本原因在于編碼和解碼使用了不同的編碼方案。

比如用GBK編碼的文件,用UTF-8去解碼結果肯定都是火星文。

所以要解決這個問題,中心思想就在于使用統一的編碼方案。

jsp頁面間的參數傳遞有以下幾種方式:1、表單(form)的提交。

2、直接使用URL后接參數的形式(超級鏈接)。

3、如果兩個jsp頁面在兩個不同的窗口中,并且這兩個窗口是父子的關系,子窗口中的jsp也可以使用javascript和DOM(window.opener.XXX.value)來取得父窗口中的jsp的輸入元素的值。

下面就前兩種方式中出現的亂碼問題做一下剖析。

1、表單(form)的提交實現參數頁面間的傳遞在介紹表單傳遞參數的內容之前,先來了解一些預備知識。

表單的提交方式和請求報文中對漢字的處理。

表單的提交方式:通常使用的表單的提交方式主要是:post和get兩種。

兩者的區別在于:post方式是把數據內容放在請求的數據正文部分,沒有長度的限制;get方式則是把數據內容直接跟在請求的頭部的URL后面,有長度的限制。

下面是同一個頁面兩種方式的請求報許文。

Requesttest.jsp代碼

    %@pagelanguage=javacontentType=text/html;charset=UTF-8 pageEncoding=UTF-8% !DOCTYPEhtmlPUBLIC-//W3C//DTDHTML4.01Transitional//ENhttp://www.w3.org/TR/html4/loose.dtd html head metahttp-equiv=Content-Typecontent=text/html;charset=UTF-8 titleInserttitlehere/title /head body %--post方式提交表單--% formaction=http://localhost:8888/EncodingTest/requestresult.jspmethod=post UserName:inputtype=textname=username/ Password:inputtype=passwordname=password/ inputtype=submitvalue=Submit /form /body /html
    %@pagelanguage=javacontentType=text/html;charset=UTF-8pageEncoding=UTF-8%!DOCTYPEhtmlPUBLIC-//W3C//DTDHTML4.01Transitional//ENhttp://www.w3.org/TR/html4/loose.dtdhtmlheadmetahttp-equiv=Content-Typecontent=text/html;charset=UTF-8titleInserttitlehere/title/headbody%--post方式提交表單--%formaction=http://localhost:8888/EncodingTestb/requestresult.jspmethod=postUserName:inputtype=textname=username/Password:inputtype=passwordname=password/inputtype=submitvalue=Submit/form/body/html
在上面的請求頁面的username輸入框里輸入的是世界杯三個漢字,password輸入框中輸入123后按下Submit按鈕提交請求。

截獲到的請求報文如下:Post方式的請求報文代碼

    POST/EncodingTest/requestresult.jspHTTP/1.1 Accept:image/gif,image/jpeg,image/pjpeg,image/pjpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/* Referer:http://localhost:8080/TomcatJndiTest/requesttest.jsp Accept-Language:zh-cn User-Agent:Mozilla/4.0(compatible;MSIE8.0;WindowsNT5.1;Trident/4.0;CIBA;aff-kingsoft-ciba;.NETCLR2.0.50727) Content-Type:application/x-www-form-urlencoded Accept-Encoding:gzip,deflate Host:localhost:8888 Content-Length:49 Connection:Keep-Alive Cache-Control:no-cache username=世界杯password=123 POST/EncodingTest/requestresult.jspHTTP/1.1Accept:image/gif,image/jpeg,image/pjpeg,image/pjpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/*Referer:http://localhost:8080/TomcatJndiTest/requesttest.jspAccept-Language:zh-cnUser-Agent:Mozilla/4.0(compatible;MSIE8.0;WindowsNT5.1;Trident/4.0;CIBA;aff-kingsoft-ciba;.NETCLR2.0.50727)Content-Type:application/x-www-form-urlencodedAccept-Encoding:gzip,deflateHost:localhost:8888Content-Length:49Connection:Keep-AliveCache-Control:no-cacheusername=世界杯password=123
以上報文內容,可以看出post方式的請求報文是有專門的數據部的。

,下面的同一請求頁面的get提交方式的請求報文:Get方式的請求報文代碼

    GET/EncodingTest/requestresult.jsp?username=世界杯password=123HTTP/1.1 Accept:image/gif,image/jpeg,image/pjpeg,image/pjpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/* Referer:http://localhost:8080/TomcatJndiTest/requesttest.jsp Accept-Language:zh-cn User-Agent:Mozilla/4.0(compatible;MSIE8.0;WindowsNT5.1;Trident/4.0;CIBA;aff-kingsoft-ciba;.NETCLR2.0.50727) Accept-Encoding:gzip,deflate Host:localhost:8888 Connection:Keep-Alive GET/EncodingTest/requestresult.jsp?username=世界杯password=123HTTP/1.1Accept:image/gif,image/jpeg,image/pjpeg,image/pjpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/*Referer:http://localhost:8080/TomcatJndiTest/requesttest.jspAccept-Language:zh-cnUser-Agent:Mozilla/4.0(compatible;MSIE8.0;WindowsNT5.1;Trident/4.0;CIBA;aff-kingsoft-ciba;.NETCLR2.0.50727)Accept-Encoding:gzip,deflateHost:localhost:8888Connection:Keep-Alive
以上報文內容,可以看出get方式的請求報文沒有專門的數據部,數據是直接跟在url的后面。

請求報文中對漢字的處理:從上面兩種報文可以看出頁面上輸入的世界杯三個漢字被替換成了世界杯這樣一個字符串,然后發給服務器的。

看到這,可能會有兩個問題:問題一、這個字符串是什么?

問題二、為什么要做這樣的替換?

這個字符串是世界杯這三個漢字對應的UTF-8編碼E4B896E7958CE69DAF在每個字節前追加一個%后形成的。

至于為什么要做這樣的轉化,我的理解是:因為請求報文會以ISO-8859-1的編碼方式編碼后,通過網絡流的方式傳送到服務器端。

ISO-8859-1僅支持數字、英文字母和一些特殊字符,所以像漢字等這樣的字符ISO-8859-1是不認識的。

所以就必須先給這些ISO-8859-1不支持的字符做個整形手術。

這樣才能正確的將頁面上的信息傳送到服務器端。

這時可能又會有另外一個問題:上面的例子中為什么會選用UTF-8編碼,其它的編碼方案可以嗎?

答案是可以的。

在jsp頁面代碼的頭部有這樣一段代碼%@ page language=java contentType=text/html; charset=UTF-8 pageEncoding=UTF-8%其中charset的值就是瀏覽器在提交請求報文前,對請求報文做整形手術時用的字符集,同是也是瀏覽器解釋服務器的響應頁面時的字符集。

在了解了以上內容后,開始剖析表單方式傳遞參數的亂碼問題。

以上例為例,點擊Submit按鈕后,瀏覽器將做完整形手術后的請求報文發送給WEB服務器上的Servlet容器,容器在收到這個請求報文后,會解析這個請求報文并用這個報文的信息生成一個HttpServletRequest對象,然后將這個HttpServletRequest對象傳給這個頁面所要請求的jsp或Servlet(上例中為requestresult.jsp)。

在這個被請求的jsp或Servlet(上例中為requestresult.jsp)中,使用HttpServletRequest對象的getParameter()方法來取得上一頁面傳來的參數。

默認情況下,這一方法使用的是ISO-8859-1來解碼,所以對于英文或數字的參數值自然能正確取得,但對于漢字這樣的字符是解不出來的,因為那幾個漢字曾經做過整形手術,已經認不出來了。

要想再把它們認出來,那就得要把手術的主刀醫生找到,然后再做一次還原手術。

下面提供的幾個方案,可用于不同的情況。

方案一代碼

    %Stringstr=newString(request.getParameter(username).getBytes(ISO-8859-1),utf-8);% Username:%=str% %Stringstr=newString(request.getParameter(username).getBytes(ISO-8859-1),utf-8);%Username:%=str%
既然request.getParameter(username)默認情況下返回的字符串是用ISO-8859-1解出來的,那就先把這個不可辨認的字符串再用ISO-8859-1來打散,也就是:request.getParameter(username).getBytes(ISO-8859-1)。

最后再用跟你的頁面的charset一致的字符集來重組這個字符串:new String(request.getParameter(username).getBytes(ISO-8859-1),utf-8)。

這樣就能見到它的廬山真面目了。

方案一是一種比較萬能的方法,不管是post還是get都適用,但可以看出它的缺點是:對于每個可能出現漢字的參數都要顯示的做這么一段處理。

一個兩個還行,要是很多的話,那就應該考慮一下是不是可以選用下一種方案。

方案二代碼

    %request.setCharacterEncoding(UTF-8);% %request.setCharacterEncoding(UTF-8);%
方案二是在頁面的最開始或者是在該頁面中使用的第一個request.getParameter()方法之前加上上述一段代碼,它的作用是用作為參數傳入的編碼集去覆蓋request對象中的默認的ISO-8859-1編碼集。

這樣request.getParameter()方法就會用新的編碼集去解碼,因為UTF-8支持中文,所以作為參數傳過來的世界杯三個漢字就能正確的接收到了。

但關于request.setCharacterEncoding()方法,API文檔中有如下的說明: Overrides 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(). Otherwise, it has no effectb. 所以方案二只對post方式提交的請求有效,因為參數都在request的body區。

而對get方式提交的請求則是無效的,這時你會發現同樣的做法但顯示的還是亂碼。

所以你的請求要是是以get方式提交的話,那你還是乖乖的選用方案一吧!從上面的敘述可以知道,方案二需要在每個頁面的前頭加上%request.setCharacterEncoding(UTF-8); %這段代碼,這樣做是不是也挺累的,所以我們想到了使用過濾器來幫助我們做這件事兒,那就清爽、簡單多了。

Encodingfilter代碼

    publicclassEncodingFilterimplementsFilter{ privateStringcharset; @Override publicvoiddestroy(){ //TODOAuto-generatedmethodstub } @Override publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse, FilterChainchain)throwsIOException,ServletException{ //用init方法取得的charset覆蓋被攔截下來的request對象的charset request.setCharacterEncoding(this.charset); //將請求移交給下一下過濾器,如果還有的情況下。

    chain.doFilter(request,response); } @Override publicvoidinit(FilterConfigconfig)throwsServletException{ //從web.xml中的filter的配制信息中取得字符集 this.charset=config.getInitParameter(charset); } } publicclassEncodingFilterimplementsFilter{privateStringcharset;@Overridepublicvoiddestroy(){//TODOAuto-generatedmethodstub}@OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{//用init方法取得的charset覆蓋被攔截下來的request對象的charsetrequest.setCharacterEncoding(this.charset);//將請求移交給下一下過濾器,如果還有的情況下。

    chain.doFilter(request,response);}@Overridepublicvoidinit(FilterConfigconfig)throwsServletException{//從web.xml中的filter的配制信息中取得字符集this.charset=config.getInitParameter(charset);}}

要想這個過濾器生效,還得到web.xml里加入下面的配制信息。

Web.xml代碼

    filter filter-nameEncodingFilter/filter-name filter-classcn.eric.encodingtest.filter.EncodingFilter/filter-class init-param param-namecharset/param-name param-valueUTF-8/param-value /init-param /filter filter-mapping filter-nameEncodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping filterfilter-nameEncodingFilter/filter-namefilter-classcn.eric.encodingtest.filter.EncodingFilter/filter-classinit-paramparam-namecharset/param-nameparam-valueUTF-8/param-value/init-param/filterfilter-mappingfilter-nameEncodingFilter/filter-nameurl-pattern/*/url-pattern/filter-mapping
2、直接使用URL后接參數的形式(超級鏈接)。

有些時候可能會遇到通過一個超級鏈接來把參數傳到下一個頁面,而剛好這個參數的值有可能會出現中文的情況。

就像下面這樣:

    ahref=./jstlresult.jsp?content=世界杯GoSouthAfrica
跟form提交有些不同的是:當你點擊這個超級鏈接后在瀏覽器的地址欄里看到的是http://localhost:8080/TomcatJndiTest/jstlresult.jsp?content=世界杯,而不是http://localhost:8080/TomcatJndiTest/jstlresult.jsp?content=世界杯這里瀏覽器并沒有幫我們把這個轉化工作搞定,所以這里要自己動手,豐衣足食了。

做法如下:

    ahref=./jstlresult.jsp?content=%=java.net.URLEncoder.encode(世界杯,utf-8)%GoSouthAfrica
這樣的話在第二個頁面就能使用
    %Stringstr=newString(request.getParameter(content).getBytes(ISO-8859-1),utf-8);%
的方法來正確的得到這個參數值了。

總結一下:1、post提交的方式:使用過濾器,將到達頁面前的request對象中的字符編碼設定成跟你頁面統一的編碼。

2、get提交的方式:%String str = new String(request.getParameter(content).getBytes(ISO-8859-1),utf-8); %這樣的字符串重組的方法。

3、超級鏈接方式:先將鏈接url中的漢字用java.net.URLEncoder.encode(paramValue,charset)方法處理一下,下面的做法參照2。

版權聲明:本文由 忻云夢 整理編輯。

原標題:ajax中文參數亂碼,python37文件參數亂碼

轉載注明出處:http://www.dn9ww09s.icu/program/15474.html

文章評論

    共有條評論來說兩句吧...

    用戶名:

    驗證碼:

作者推薦

  • u盤寫入無響應,軟碟通寫入無響應

    u盤寫入無響應,軟碟通寫入無響應 相關圖片寫入ISO失敗將asp生成的內容寫入響應流的最有效方法是什么?使用ASP的主要原因之一是在服務器上生成動態內容。因此,顯然,我們測試的起點是確定將動態內容發送到響應流的最合適...

  • exists和in的區別,數據庫exists與in的區別

    exists和in的區別,數據庫exists與in的區別 相關圖片not exists用法本文的例子說明了在PHP中存在ISSET和ARRAYXKEY的區別。與您分享以供參考。具體分析如下:1。數組值的判斷不同。對于NULL或“OR”或“false”mysql exists用法...

  • 小米主題設置自定義,同花順自定義界面設置

    小米主題設置自定義,同花順自定義界面設置 相關圖片吃雞自定義布局設置微軟推出的Windows 8和Windows 10操作系統中,有近兩個采用了向導界面風格。事實上,在現代UI(新用戶界面)中也有類似的界面樣式。如果用戶設計了歡微信發現界面...

  • excel生成文件夾目錄,生成pdf

    excel生成文件夾目錄,生成pdf 相關圖片如何制作pdf格式文件如果我們與其他人共享模塊,我們希望Access2000將刪除可編輯的源代碼。這樣,VBA程序可以繼續運行,但其他用戶無法查看或編輯它。我們可以通過單擊“工具”,...

  • 話永遠不會掉在地上,什么東西往上升永遠不會往下掉

    話永遠不會掉在地上,什么東西往上升永遠不會往下掉 相關圖片是最里面兩個板牙永遠不會掉Android系統有自己的內存管理方法。為了保證系統的有序穩定運行,系統會自動分配和控制程序的內存使用。當系統認為當前的資源非常有限時,為了保證一...

  • 分頁的實現思路,通用的分頁思路

    分頁的實現思路,通用的分頁思路 相關圖片分頁查詢思路在搜索復雜條件時,somefield somefieldmysql排序的東西會搜索數據庫,找到所有符合條件的記錄,然后取出M,n條記錄。如果你有數十萬條數據,用js分頁...

  • 輕松轉聯盟,輕松轉奶

    輕松轉聯盟,輕松轉奶 相關圖片廣信貸簡單賺如何轉輕松賺將SQL數據庫傳輸到access數據庫的步驟如下:1。建立access數據庫:在access中建立access數據庫和表,access字段類型與SQL字段類型的轉奶技巧...

  • oracle存儲過程是什么,oracle存儲過程詳解

    oracle存儲過程是什么,oracle存儲過程詳解 相關圖片oracle如何調用存儲過程如果不小心覆蓋了上一個存儲過程,則需要刷新。時間越長,閃回的可能性就越小。這是恢復原則。如果不小心覆蓋了上一個存儲過程,則需要刷新。時間越長,...

  • 應用程序大小,應用程序窗口大小調整

    應用程序大小,應用程序窗口大小調整 相關圖片縮小應用程序窗口問:如何使我的安裝包更小,下載和安裝程序更快?答:本文收集了一些關于減小安裝包大小的技巧(在第一次下載和安裝程序時)。如果是升級程序,您可以閱讀本...

  • SciPy入門指南,grails 入門指南

    SciPy入門指南,grails 入門指南 相關圖片php入門指南本文主要介紹JavaScript的requirejs庫的介紹指南。近年來,requirejs庫的普及程度迅速提高。您可以參考目前最常用的JavaScript庫之明日之后新手入門指南...

熱評文章

  • winform嵌入html,ashx引用到html5中

    winform嵌入html,ashx引用到html5中 相關圖片mysql下載本文主要介紹了HTML ashx表單提交的具體實現。對于您的朋友,請參考以下1。sumbit form submission webform1.aspx的源代碼ashx如何寫控件的點擊事件...

  • iOS3D游戲,ios 3dtouch

    iOS3D游戲,ios 3dtouch 相關圖片ios3dtouch在哪開首先需要獲取mono.data.sqlite.dll文件和system.data.dll文件。如果你在MAC上使用unity,那就太悲劇了。我找不到這兩個文件,3dtouch怎么用...

  • 如何調整列寬,如何調整表格的行高和列寬

    如何調整列寬,如何調整表格的行高和列寬 相關圖片excel自動調整行高列寬DataGridView有一個名為autosizecolumnmode的屬性,它有幾個枚舉值:1。所有單元格調整列寬以適應列中所有單元格(包括標題單元格)的內容如何設置列寬...

  • memcached安裝,memcached安裝教程

    memcached安裝,memcached安裝教程 相關圖片memcached教程本文主要介紹在PHP中安裝memcached擴展的注意事項。本文介紹了服務器的安裝、launchpad、memcached擴展的安裝以及php.ini的配置。對緩存memcached...

  • 字符串去掉空格,c去掉字符串的空格

    字符串去掉空格,c去掉字符串的空格 相關圖片去掉字符串中的某個字符一。弦。Trim()Trim()是刪除第一個和最后一個空格。2。replace(,);要刪除所有空格,包括第一個和最后一個空格,中間代碼如下:String St字符串刪除空格...

  • asp分頁代碼,asp分頁代碼123

    asp分頁代碼,asp分頁代碼123 相關圖片asp下一頁代碼這是用于生成靜態頁的ASP paging list的ASP applet腳本代碼:!--include file=CONN.ASP--htmlheadlitleasp帶數字的分頁...

  • 程序崩潰怎么解決,應用程序崩潰怎么解決

    程序崩潰怎么解決,應用程序崩潰怎么解決 相關圖片微信小程序崩潰我們經常在iPhone或iPad平板電腦上遇到應用程序崩潰的問題。有時我們打開一個應用程序,它就會閃回。這對開發人員來說絕對是個頭疼的問題。如何獲取IOS設備崩軟件崩...

  • 數組長度和字符串長度,數組的長度可以是字符串嗎

    數組長度和字符串長度,數組的長度可以是字符串嗎 相關圖片java字符串長度本文的例子描述了PHP將字符串隨機劃分為不同長度的數組的方法。與您分享以供參考。具體分析如下:這里使用PHP對指定長度范圍內的字符串進行隨機劃分,劃分后的結果...

  • 因為找不到必要的CMap文件,找不到必要的cmap文件

    因為找不到必要的CMap文件,找不到必要的cmap文件 相關圖片無法置入文檔因為上周安裝Office 2003升級修補程序失敗后,每次打開excel時,都會找到安裝文件,并提示您找不到必需的安裝文件sku001.cab。在網上搜索后,我發現保存pdf格式...

  • 網頁亂碼如何解決,網頁打開亂碼怎么解決

    網頁亂碼如何解決,網頁打開亂碼怎么解決 相關圖片電腦顯示亂碼JSP開發與應用中,中文置亂是一個常見的問題,其根源是:web容器默認字符處理代碼是iso-8859-1。示例1:當顯示JSP頁面時,htmlheadtitle手機解決html文件亂碼...

關注微信

变脸官网查询