一:原理

  • 1.對於Post方式提交的資料,我們可以通過直接設定request和response的編碼方式來解決亂碼問題;但是Get方式提交的資料,那麼就需要編碼再解碼的方式解決亂碼問題。
  • 2.我們一般對於GET請求獲取引數有兩個常用方法:
    request.getParameter(String name)是獲得相應名的資料,如果有重複的名,則返回第一個的值 . 接收一般變數 ,如text型別。
    request.getParameterValues(String name)是獲得如checkbox類(名字相同,但值有多個)的資料。 接收陣列變數 ,如checkobx型別 。
  • 3.所以我們的思路就是重寫上述這兩個方法,達到解決GET取參亂碼問題。

二:程式碼

package cn.zyzpp.filter;

import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;

/**
 * 指定過濾器的名稱以及過濾的內容
 * 單個頁面可用urlPatterns="/advice"
 * 多個頁面可用urlPatterns={"/advice","/advice"}
 * @author www.zyzpp.cn
 *
 */
@WebFilter(filterName="filter", urlPatterns="/*")
public class FilterImpl implements javax.servlet.Filter {

    private String encoding="UTF-8";

    public FilterImpl() {

    }

    public void destroy() {

    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {   

        //1 解決中文亂碼問題:1)只能解決POST亂碼2)響應亂碼
        request.setCharacterEncoding(encoding);
        response.setContentType("text/html;charset="+encoding);  

        //2 建立自定義的Request物件 :解決get亂碼
        MyRequest myRequest = new MyRequest((HttpServletRequest) request);  

        //3 放行
        chain.doFilter(myRequest, response);  

    }

    public void init(FilterConfig fConfig) throws ServletException {

    }

}
  • 繼承HttpServletRequestWrapper類 , 重寫getParameter()和 getParameterValues()方法
package cn.zyzpp.filter;

import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
/**
 * 繼承HttpServletRequestWrapper
 * 重寫getParameter()和 getParameterValues()方法
 * @author www.zyzpp.cn
 */
public class MyRequest extends HttpServletRequestWrapper {

    public MyRequest(HttpServletRequest request) {
        super(request);
    }

    @Override
    public String getParameter(String name) {
        String value = super.getParameter(name);
        if (super.getMethod().equalsIgnoreCase("GET")&&value!=null) {
            try {
                value = new String(value.getBytes("ISO-8859-1"), "utf-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        return value;
    }

    @Override
    public String[] getParameterValues(String name) {
        String[] values = super.getParameterValues(name);
        if (super.getMethod().equalsIgnoreCase("GET")&&values!=null) {
            try {
                int i=0;
                for (String value : values) {
                    values[i++] = new String(value.getBytes("ISO-8859-1"), "utf-8");
                }
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        return values;
    }

}

本篇部落格借鑑於:
http:// blog.csdn.net/melissa_heixiu/article/details/52705457
http:// blog.csdn.net/csdn_gia/article/details/54094426
可以看到,第一篇部落格的思想是利用的req.getParameterMap()來獲取到單個或多個引數;第二篇部落格較簡單,重寫了request.getParameter()。
筆者比著葫蘆畫瓢,增加了request.getParameterValues()方法,並解決了引數為空導致的自定義Request類空指標異常。