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


java高級架構師全套vip教學視頻,需要的加我qq1324981084

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

一、單獨參數亂碼

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM