1. 程式人生 > >get、post請求參數亂碼解決方法(qq:2798641729)

get、post請求參數亂碼解決方法(qq:2798641729)

enc pos http bin imp 解決 encoding 亂碼問題 轉碼

在實際的項目中我們會遇見中文亂碼的問題,這個問題是很惡心的事,所以我在這裏提供了一些解決中文亂碼的方法,希望能給大家一些幫助。

一、單獨參數亂碼

post請求:request.setCharacterEncoding("utf-8");

當客戶端通過GET請求發送數據給服務器時,使用request.getParameter()獲取的數據是被服務器誤認為ISO-8859-1編碼的,也就是說客戶端發送過來的數據無論是UTF-8還是GBK,服務器都認為是ISO-8859-1,這就說明我們需要在使用request.getParameter()獲取數據後,再轉發成正確的編碼。例如客戶端以UTF-8發送的數據,使用如下轉碼方式:

get請求:String name = "獲取參數內容";
       name = new String(name.getBytes("iso-8859-1"),"utf-8");

二、整個項目亂碼

那麽對於整個項目怎麽統一解決亂碼問題呢?這裏我們利用攔截器和裝飾的方法解決這個問題

我們利用裝飾者模式將HttpServletRequest中的getParameter方法進行重新封裝,加入處理亂碼問題的方法。

/**
 * 裝飾reqeust
 * @author cxf
 *
 */
public class EncodingRequest extends HttpServletRequestWrapper {
    
private HttpServletRequest req; public EncodingRequest(HttpServletRequest request) { super(request); this.req = request; } public String getParameter(String name) { String value = req.getParameter(name); // 處理編碼問題 try { value
= new String(value.getBytes("iso-8859-1"), "utf-8"); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } return value; }
public class EncodingFilter implements Filter {
    public void destroy() {

    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        // 處理post請求編碼問題
        request.setCharacterEncoding("utf-8");
        
        HttpServletRequest req = (HttpServletRequest) request;
        
        /*
         * 處理GET請求的編碼問題
         */
//        String username = request.getParameter("username");
//        username = new String(username.getBytes("ISO-8859-1"), "UTF-8");
        
        /*
         * 調包request
         * 1. 寫一個request的裝飾類
         * 2. 在放行時,使用我們自己的request
         */
        if(req.getMethod().equals("GET")) {
            EncodingRequest er = new EncodingRequest(req);
            chain.doFilter(er, response);
        } else if(req.getMethod().equals("POST")) {
            chain.doFilter(request, response);
        }
    }

    public void init(FilterConfig fConfig) throws ServletException {

    }

web.xml配置

  <filter>
    <display-name>EncodingFilter</display-name>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>cn.itcast.web.filter.EncodingFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

這樣post和get亂碼的問題也就解決了。

三、簡單方法

如果覺得上面的方式太繁瑣,也可以通過修改 tomcat 的 server.xml 配置文件:

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

改成

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true"/>

註: 如果是ajax發起的get請求中文依然會亂碼,這時候需要把 useBodyEncodingForURI="true" 改為 URIEncoding="UTF-8" 。

推薦參考文章 :https://www.cnblogs.com/binye-typing/p/6281627.html

get、post請求參數亂碼解決方法(qq:2798641729)