1. 程式人生 > >解決get和post請求和相應時中文亂碼的問題

解決get和post請求和相應時中文亂碼的問題

這個問題遇到過n次了,每次都要搜,當時明白了以後遇到還是忘了,所以特意找來一篇自己認為條理清晰的文章記錄下來,以防以後再次遇到同樣的問題。(以下是轉載內容)

之所以出現亂碼,主要是由於編碼和解碼採用的方法不同。

因此保證編碼解碼格式一致是避免亂碼發生的重要前提。

問題背景:JavaWeb技術下,Tomcat作為容器,傳送請求的時候出現亂碼問題。

下面以兩種常見的請求方式為例講解亂碼問題的解決方法。

1.Post方式請求亂碼。

    自從Tomcat5.x以來,Get方式和Post方式提交的請求,tomcat會採用不同的方式來處理編碼。

對於Post請求,Tomcat會使用request.setCharacterEncoding和response.setCharacterEncoding方法設定的編碼格式進行處理。

如果未設定,則預設都採用iso-8859-1編碼。因此如果在傳送Post請求的時候出現亂碼,常見的解決方法如下:

a)  request.setCharacterEncoding("utf-8");

b)  String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "UTF-8"); 
(當然response的編碼也不要忘記設定成utf-8的)

【注】:上面提供的是兩種不同的方法,並不是一種方法的兩個步驟!!!

我們可以看出來第一種方式寫法固定,非常很適合通過寫成過濾器的方式進行編碼的統一轉換。

  1. publicclass EncodingFilter 
    extends HttpFilter {  
  2.     publicvoid doFilter(HttpServletRequest request,  HttpServletResponse response, FilterChain chain) throws IOException, ServletException {  
  3.        Stringcharset = this.getInitParameter("charset");  
  4.        if(charset == null ||charset.isEmpty()) {  
  5.            charset ="UTF-8";  
  6.        }  
  7.         request.setCharacterEncoding(charset);  
  8.        response.setContentType("text/html;charset=" + charset);  
  9.        chain.doFilter(request, response);  
  10.     }  
  11. }  

2.Get方式請求亂碼

   我們剛談到Tomcat對Post請求的編碼處理策略,並且從字裡行間讀出了Tomcat對Post和Get的編碼策略有所不同,

那麼Tomcat對Get請求的編碼策略到底是如何不同的呢?答案就是Tomcat對於Get請求並不會考慮使用request.setCharacterEncoding方法設定的編碼

言外之意就是我們無法通過request.setCharacterEncoding方式來改變編碼,因為最終Tomcat會永遠使用iso-8859-1進行編碼(但是要注意一下,

respon還是可以通過呼叫response.setCharacterEncoding方式進行編碼的設定的),既然是這樣的話下面這個方法還是勉強可行的

a)

步驟一:response.setCharacterEncoding("UTF-8")

步驟二:String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "UTF-8"); 

通過這兩步,可以看到我們的request的字元編碼格式是預設的“iso-8859-1" 我們的response字元編碼是自己設定的”utf-8"

顯然兩個是不相容的,因此我們在獲取請求引數的時候才進行了一下字符集的轉換即步驟二:

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

     既然有a),那肯定還有b)咯?當然!而且方案b更加乾淨,利落,徹底。讓我們一起看一下吧:

b)

修改Tomcat安裝目錄下conf子目錄下的server.xml檔案(解決get方式) 【注:記得先停掉伺服器】

找到檔案中類似這樣的段落:
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

在裡面加上這樣一段:URIEncoding="UTF-8" 即變成下面這段
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8" />

最後重啟Tomcat即可。

對於Get請求編碼的統一處理也可以寫成過濾器的形式,只不過稍微有些複雜。

EncodingRequest.java

  1. publicclass EncodingRequest extends HttpServletRequestWrapper {  
  2.     private String charset;  
  3.     public EncodingRequest(HttpServletRequest request, String charset) {  
  4.         super(request);  
  5.         this.charset = charset;  
  6.     }  
  7.     public String getParameter(String name) {  
  8.         HttpServletRequest request = (HttpServletRequest) getRequest();  
  9.         String method = request.getMethod();  
  10.         if(method.equalsIgnoreCase("post")) {  
  11.             try {  
  12.                 request.setCharacterEncoding(charset);  
  13.             } catch (UnsupportedEncodingException e) {}  
  14.         } elseif(method.equalsIgnoreCase("get")) {  
  15.             String value = request.getParameter(name);  
  16.             try {  
  17.                 value = new String(name.getBytes("ISO-8859-1"), charset);  
  18.             } catch (UnsupportedEncodingException e) {  
  19.             }  
  20.             return value;  
  21.         }  
  22.         return request.getParameter(name);  
  23.     }  
  24. }  

EncodingFilter.java

  1. publicclass EncodingFilter extends HttpFilter {  
  2.     publicvoid doFilter(HttpServletRequest request,  
  3.             HttpServletResponse response, FilterChain chain)  
  4.             throws IOException, ServletException {  
  5.         String charset = this.getInitParameter("charset");  
  6.         if(charset == null || charset.isEmpty()) {  
  7.             charset = "UTF-8";  
  8.         }  
  9.         response.setCharacterEncoding(charset);  
  10.         response.setContentType("text/html;charset=" + charset);  
  11.         EncodingRequest res = new EncodingRequest(request, charset);  
  12.         chain.doFilter(res, response);  
  13.     }  
  14. }  

web.xml

  1. <filter>
  2.     <filter-name>EncodingFilter</filter-name>
  3.     <filter-class>cn.itcast.filter.EncodingFilter</filter-class>
  4.     <init-param>
  5.         <param-name>charset</param-name>
  6.         <param-value>UTF-8</param-value>
  7.     </init-param>
  8. </filter>
  9. <filter-mapping>
  10.     <filter-name>EncodingFilter</filter-name>
  11.     <url-pattern>/*</url-pattern>
  12. </filter-mapping>

【注】為了避免您的測試與我給的解決方案結果不符,請在專案編碼格式為utf-8,jsp頁面 pageEncoding="utf-8"的環境下測試。

本文轉自https://blog.csdn.net/u014424628/article/details/48255263

相關推薦

解決getpost請求相應中文亂碼的問題

這個問題遇到過n次了,每次都要搜,當時明白了以後遇到還是忘了,所以特意找來一篇自己認為條理清晰的文章記錄下來,以防以後再次遇到同樣的問題。(以下是轉載內容)之所以出現亂碼,主要是由於編碼和解碼採用的方法不同。因此保證編碼解碼格式一致是避免亂碼發生的重要前提。問題背景:Java

GetPost請求如何在Servlet中獲取請求資訊

1.Get請求和Post請求1).使用GET方式傳遞引數:①.在瀏覽器位址列中輸入某個URL地址或單擊網頁上的一個超連結時,瀏覽器發出的HTTP請求訊息的請求方式GET。②.如果網頁中的<form>表單元素的method屬性被設定為了“GET”。瀏覽器提交這個FO

解決spingMVC將引數傳回jsp頁面中文亂碼

解決spingMVC將引數傳回jsp頁面時中文亂碼 今天寫springmvc練手例子的時候將引數送回jsp頁面時中文出現亂碼,如下: 在web.xm加入一個過濾器重新執行一下就可以了 <!-- Spring字符集過濾器 --> <filter

Java採用HttpURLConnection請求呼叫服務中文亂碼問題

歡迎使用Markdown編輯器寫部落格 public class HN_cer { /** * 向指定URL傳送GET方法的請求 * * @param url * 傳送請求的URL

Servlet接收GetPost請求亂碼問題及解決

當我們使用get或者post請求向服務端發起請求時,由於客戶端沒有告訴伺服器,請求正文的編碼,於是伺服器預設用ISO-8859-1進行編碼。 1.post請求方式亂碼解決。 request.setCharacterEncoding("UTF-8"); 2。get請求方式亂碼解決。 Str

發送getpost請求常用的content-type

encode json數據格式 ima for www 下載 orm 文件上傳 服務器 常見的媒體格式類型如下: text/html : HTML格式 text/plain :純文本格式 text/xml : XML格式

PHP中使用CURL實現模擬GETPOST請求,親測完美解決

//初始化 $curl = curl_init(); //設定抓取的url curl_setopt($curl, CURLOPT_URL, 'http://www.baidu.com'); //設定標頭檔案的資訊作為資料流輸出 curl_setopt($cur

關於getpost請求中文亂碼解決辦法

web專案中經常遇到中文亂碼問題,本文簡單記錄遇到中文亂碼問題時的解決方案,程式碼如下: <form class="form-horizontal" role="form" action="${pageContext.request.contextPath}/add

http相應getpost請求示例

public class TestGetPost { /** * 向指定URL傳送GET方法的請求 * @param url 傳送請求的URL * @param param 請求引數,請求引數應該是name1=value1&name2=value2的形

解決Getpost請求中文亂碼問題

1.1 post請求解決亂碼 1.對於Post請求,只需在Servlet或者jsp中寫入如下程式碼就可以把解決從表單中傳入的中文亂碼問題   request.setCharacterEncoding("utf-8");   String str=request.getPar

J2EE中get方式post請求方式亂碼解決辦法

J2EE中中文亂碼的問題 J2EE中中文亂碼的問題主要就是出現在瀏覽器給伺服器提交引數資料的時候出現的。而瀏覽器與伺服器傳遞資料的方式有兩種 ①post提交方式,因為post提交方式都是把請求引數放在

HttpClient GETPOST請求

pri execute public methods gre col esp odt stringbu package com.rogue.hclient; import java.io.BufferedReader; import java.io.IOExceptio

http基本getpost請求

read exce pen timeout etc builder pri void tin get請求: private static void httpGet(){ BufferedReader br = null; HttpU

GETPOST請求的區別

cat nal 賬號 span asc 交互 cap 開發 code GET和POST請求的區別 GET請求GET /books/?sex=man&name=Professional HTTP/1.1Host: www.wrox.comUser-Agent: Mo

iOS開發-AFNetworking封裝Get(自定義HTTP Header)Post請求及文件下載

謝謝 filepath pos cat style -type poe repo eth 前面提到AFNetworking是一個很強大的網絡三方庫,首先你需要引入AFNetworking三方庫;如封裝的有誤還請指出,謝謝! 1.Get請求 /**Get請求 url 服務器

python request 接口測試getpost請求

.post .get access username int 用戶 post請求 運行 開發 開發IDE:pycharm python:2.7.10 get請求 # coding: UTF-8 #兼容中文字符,如果沒有這句,程序中有中文字符時,運行會報錯import

小程序的getpost請求頭的區別

type www 成功 ava form brush quest -type function 小程序在使用wx.request()接口 時 header 請求頭默認是這樣的 wx.request({ url: ‘test.php‘, //僅為示例,並非真實的接口

php-getpost請求

output class ray 工作日 打印 init print bsp clas 1.get請求 <?php //判斷20130101是否是工作日 //工作日對應結果為 0, 休息日對應結果為 1, 節假日對應的結果為 2; $url=‘http://www

PHP中使用CURL實現GETPOST請求

由於 protocol 對稱加密 即使 匯報 bst 接口 useragent 拷貝 一、什麽是CURL? cURL 是一個利用URL語法規定來傳輸文件和數據的工具,支持很多協議,如HTTP、FTP、TELNET等。最爽的是,PHP也支持 cURL 庫。使用php的cURL

CURL實現發送GetPost請求(PHP)

結果 基本 釋放 初始 常用 header 理解 介紹 今天 1.cURL介紹   cURL 是一個利用URL語法規定來傳輸文件和數據的工具,支持很多協議,如HTTP、FTP、TELNET等。最爽的是,PHP也支持 cURL 庫。本文將介紹 cURL 的一些高級特性,以及