1. 程式人生 > >解決get方法傳遞URL引數中文亂碼和解決tomcat下中文亂碼問題

解決get方法傳遞URL引數中文亂碼和解決tomcat下中文亂碼問題

應用一:解決tomcat下中文亂碼問題(先來個簡單的) 

在tomcat下,我們通常這樣來解決中文亂碼問題:

過濾器程式碼:

Java程式碼  收藏程式碼
  1. package filter;  
  2. import java.io.*;  
  3. import javax.servlet.*;  
  4. import javax.servlet.http.*;  
  5. import wrapper.GetHttpServletRequestWrapper;  
  6. public class ContentTypeFilter implements Filter {  
  7.     private String charset = "UTF-8"
    ;  
  8.     private FilterConfig config;  
  9.     public void destroy() {  
  10.         System.out.println(config.getFilterName()+"被銷燬");  
  11.         charset = null;  
  12.         config = null;  
  13.     }  
  14.     public void doFilter(ServletRequest request, ServletResponse response,  
  15.             FilterChain chain) throws IOException, ServletException {  
  16.         //設定請求響應字元編碼  
  17.         request.setCharacterEncoding(charset);  
  18.         response.setCharacterEncoding(charset);  
  19.         HttpServletRequest req = (HttpServletRequest)request;  
  20.         System.out.println("----請求被"+config.getFilterName()+"過濾");  
  21.         //執行下一個過濾器(如果有的話,否則執行目標servlet)  
  22.         chain.doFilter(req, response);  
  23.         System.out.println("----響應被"+config.getFilterName()+"過濾");  
  24.     }  
  25.     public void init(FilterConfig config) throws ServletException {  
  26.             this.config = config;  
  27.             String charset = config.getServletContext().getInitParameter("charset");    
  28.             if( charset != null && charset.trim().length() != 0)  
  29.             {  
  30.                 this.charset = charset;  
  31.             }  
  32.     }  
  33. }  
 

web.xml中過濾器配置:

Xml程式碼  收藏程式碼
  1. <!--將採用的字元編碼配置成應用初始化引數而不是過濾器私有的初始化引數是因為在JSP和其他地方也可能需要使用-->  
  2.     <context-param>  
  3.             <param-name>charset</param-name>  
  4.             <param-value>UTF-8</param-value>  
  5.     </context-param>  
  6.     <filter>  
  7.         <filter-name>ContentTypeFilter</filter-name>  
  8.         <filter-class>filter.ContentTypeFilter</filter-class>  
  9.     </filter>  
  10.     <filter-mapping>  
  11.         <filter-name>ContentTypeFilter</filter-name>  
  12.         <url-pattern>/*</url-pattern>  
  13.     </filter-mapping>  

request.setCharacterEncoding(charset); 必須寫在第一次使用request.getParameter()之前,這樣才能保證引數是按照已經設定的字元編碼來獲取。
response.setCharacterEncoding(charset);必須寫在PrintWriter out = request.getWriter()之前,這樣才能保證out按照已經設定的字元編碼來進行字元輸出。

通過過濾器,我們可以保證在Servlet或JSP執行之前就設定好了請求和響應的字元編碼。

但是這樣並不能完全解決中文亂碼問題:

對於post請求,無論是“獲取引數環節”還是“輸出環節"都是沒問題的;

對於get請求,"輸出環節"沒有問題,但是"獲取引數環節"依然出現中文亂碼,所以在輸出時直接將亂碼輸出了。

原因是post請求和get請求存放參數位置是不同的:

post方式引數存放在請求資料包的訊息體中。get方式引數存放在請求資料包的請求行的URI欄位中,以?開始以param=value&parame2=value2的形式附加在URI欄位之後。而request.setCharacterEncoding(charset); 只對訊息體中的資料起作用,對於URI欄位中的引數不起作用,我們通常通過下面的程式碼來完成編碼轉換:

Java程式碼  收藏程式碼
  1. String paramValue = request.getParameter("paramName");  
  2. paramValue = new String(paramValue.trim().getBytes("ISO-8859-1"), charset);  

但是每次進行這樣的轉換實在是很麻煩,有沒有統一的解決方案呢?

解決方案1: 在tomcat_home\conf\server.xml 中的Connector元素中設定URIEncoding屬性為合適的字元編碼

Java程式碼  收藏程式碼
  1. <Connector port="8080" protocol="HTTP/1.1"   
  2.            connectionTimeout="20000"   
  3.            redirectPort="8443"   
  4.            URIEncoding="UTF-8"  
  5.  />  

這樣做的缺點是,同一個tomcat下的其他應用也將受到影響。而其每次部署時都需要類修改配置也很麻煩。

解決方案2:自定義請求包裝器包裝請求,將字元編碼轉換的工作新增到getParameter()方法中

Java程式碼  收藏程式碼
  1. package wrapper;  
  2. import java.io.UnsupportedEncodingException;  
  3. import java.net.URLDecoder;  
  4. import javax.servlet.http.HttpServletRequest;  
  5. import javax.servlet.http.HttpServletRequestWrapper;  
  6. public class GetHttpServletRequestWrapper extends HttpServletRequestWrapper {  
  7.     private String charset = "UTF-8";  
  8.     public GetHttpServletRequestWrapper(HttpServletRequest request) {  
  9.         super(request);  
  10.     }  
  11.     /** 
  12.      * 獲得被裝飾物件的引用和採用的字元編碼 
  13.      * @param request 
  14.      * @param charset 
  15.      */  
  16.     public GetHttpServletRequestWrapper(HttpServletRequest request,  
  17.             String charset) {  
  18.         super(request);  
  19.         this.charset = charset;  
  20.     }  
  21.     /** 
  22.      * 實際上就是呼叫被包裝的請求物件的getParameter方法獲得引數,然後再進行編碼轉換 
  23.      */  
  24.     public String getParameter(String name) {  
  25.         String value = super.getParameter(name);  
  26.         value = value == null ? null : convert(value);  
  27.         return value;  
  28.     }  
  29.     public String convert(String target) {  
  30.         System.out.println("編碼轉換之前:" + target);  
  31.         try {  
  32.             return new String(target.trim().getBytes("ISO-8859-1"), charset);  
  33.         } catch (UnsupportedEncodingException e) {  
  34.             return target;  
  35.         }  
  36.     }  
  37. }  

修改過濾器的doFilter方法 程式碼如下:

Java程式碼  收藏程式碼
  1. public void doFilter(ServletRequest request, ServletResponse response,  
  2.             FilterChain chain) throws IOException, ServletException {  
  3.         //設定請求響應字元編碼  
  4.         request.setCharacterEncoding(charset);  
  5.         response.setCharacterEncoding(charset);  
  6.         //新增加的程式碼          
  7.         HttpServletRequest req = (HttpServletRequest)request;  
  8.         if(req.getMethod().equalsIgnoreCase("get"))  
  9.         {  
  10.             req = new GetHttpServletRequestWrapper(req,charset);  
  11.         }  
  12.         System.out.println("----請求被"+config.getFilterName()+"過濾");  
  13.         //傳遞給目標servlet或jsp的實際上時包裝器物件的引用,而不是原始的HttpServletRequest物件  
  14.         chain.doFilter(req, response);  
  15.         System.out.println("----響應被"+config.getFilterName()+"過濾");  
  16.     }  

這樣一來,在servlet中呼叫包裝器的getParameters方法來獲取引數,就已經完成了字元編碼的轉換過程,我們就不需要在每次獲取引數時來進行字元編碼轉換了。

相關推薦

解決get方法傳遞URL引數中文亂碼問題

應用一:解決tomcat下中文亂碼問題(先來個簡單的)  在tomcat下,我們通常這樣來解決中文亂碼問題: 過濾器程式碼: package filter;   import java.io.*;   import javax.servlet.*;   impor

解決get方法傳遞URL引數中文亂碼解決tomcat中文亂碼問題

應用一:解決tomcat下中文亂碼問題(先來個簡單的)  在tomcat下,我們通常這樣來解決中文亂碼問題: 過濾器程式碼: Java程式碼   package filter;  import java.io.*;  import javax.servlet.*; 

Tomcat解決GET方式傳遞引數URL中的引數亂碼問題

在Tomcat中(其它的webserver中也一樣),引數可以通過GET和POST方式傳遞。通過GET和POST方式傳遞的引數,遇到亂碼時的解決辦法也不一樣。 在Tomcat中遇到GET方式傳遞的引數(URL中的引數)亂碼時,可以通過下面的方式解決(解決方式之

Get方法獲取url引數

GET方法的引數記錄在REQUEST_METHOD環境變數裡 示例: 環境: perl 5.20.2  apache(httpd2.4.16) #!i:/Perl64/bin/Perl.exe

前端傳遞url引數中有中文,後端傳過來的有亂碼解決方案

一、問題重現: 原始碼:用get方式傳遞 @ResponseBody @RequestMapping(value = {"/findGroupByGroupName/{batchNo

tomcat8.0環境解決get方法中文引數亂碼問題

環境:java 1.7 ,tomcat8.0問題:tomcat8.0環境下,使用get方法提交由英文字母數字組合的內容顯示正常,但提交中文引數編碼亂碼,然而使用post方法程式一切正常,不出現亂碼問題。 原因:高版本tomcat 中,get 與 post 方法對引數內容

表單用get方法傳遞中文亂碼解決

檔案request_demo01.htm原始碼如下: <html> <head><title>www.mldnjava.cn,MLDN高階Java培訓</title></head> <body> <

linuxcurl get方法傳遞引數

例如  url 為 http://mywebsite.com/index.php?a=1&b=2&c=3 web形式下訪問url地址,使用$_GET是可以獲取到所有的引數 然而在linux下 curl http://mywebsite.com

httpclient中getmethod方法url引數如果含有中文的處理辦法

轉自:http://fuliang.iteye.com/blog/565832 URI uri = new URI(url,false,"UTF-8"); 在getmethod的前面加上上面這句程式碼就OK了,有的I

關於為何TreeMap中用列印語句列印get方法會返回null的原因(解決辦法有待完善)

以上會get到null值,究其原因,可以從get方法原始碼中找到答案。TreeMap集合中實現Map集合的get程式碼如下:       public V get(Object key) {       &

JQ get請求 拼接 url 引數 (查詢條件)

//查詢拼接引數 function query_sample_order(){ var i_url=""; var condition= $('#query_sample_order_condition').val();//具體查詢條件 var begin_time=$

js 方法傳遞物件引數

js 方法傳遞物件引數 2017年12月06日 16:35:39 qq_26676207 閱讀數:7696  版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/qq_26676207/article/details

javascript match方法獲取url引數的正則表示式(用來獲取某個引數值)很重要!!!!!

方法一:正則分析法 複製程式碼 程式碼如下: function getQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); var r

解決 js setTimeout 傳遞引數的函式無效果

最近 js  用到 setTimeout 遞迴呼叫 重新整理進度 setTimeout ("getProgress(name,type)", 3000)發現getProgress函式 帶上引數 就失效

解決CentOS7中文語言亂碼(包括Tomcat日誌中文亂碼)問題

   Linux系統中文語言亂碼,是很多小夥伴在開始接觸Linux時經常遇到的問題,而且當我們將已在Wndows部署好的專案搬到Linux上執行時,Tomcat的輸出日誌中文全為亂碼(在Windows上正常),看著非常心塞,那麼我們應該怎麼解決呢?          

URL傳遞引數進行編碼解碼

一 編碼部分 1 程式碼 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR

Node子程序async/await方法不正常執行的思考解決

前段時間,我做了一個node模組node-multi-worker ,希望通過這個模組讓node能夠脫離單執行緒的限制,具體的使用可以看一下上面的連結。其思路就是註冊任務後,分出子程序,然後在主程序需要執行任務時,向reactor子程序傳送命令,而reactor收到命令後分配到worker子程序在執行完成後返

在同一個類中,一個方法呼叫另外一個有註解(比如@Async,@Transational)的方法,註解失效的原因解決方法

在同一個類中,一個方法呼叫另外一個有註解(比如@Async,@Transational)的方法,註解是不會生效的。 比如,下面程式碼例子中,有兩方法,一個有@Transational註解,一個沒有。如果呼叫了有註解的addPerson()方法,會啟動一個Transaction;如果呼叫updatePerso

Swift中自定義類==比較方法未被呼叫的分析解決

在專案中自定義了2個類:A和B,其中A含有B的例項變數. 在這2個類中都定義了==比較方法,按照正常來說:比較A,必然比較B.因為需要比較A中型別為B的例項變數. 但實際執行中發現,兩個字面上完全一樣的A例項物件,比較竟然不相等!!! 在A的==方法中下斷點,發

Xcode other link flag引數詳解解決靜態庫衝突分析

1.Xcode設定Other Link Flag 先猜一下這個引數,Other Link Flag 其他連結標誌,從字面上的意思來看,肯定程式碼連結的時候有關和連結器有關。 一個程式從簡單易讀的程式碼到可執行檔案往往要經歷以下步驟: 原始碼 > 前處理器 &