使用Filter來統(tǒng)一全站編碼

由于請求方式get和post的解決亂碼方式是不一樣的。

  1. post請求方式的參數(shù)是存放在消息體中,可以通過setCharacterEncoding()方法來解決
  2. get請求方式的參數(shù)是存放在消息頭中,必須通過獲取URL參數(shù)才能進(jìn)行設(shè)置,為此,可以從寫相應(yīng)的方法來設(shè)置編碼

這時候,就要使用到包裝類。HttpServletRequestWrapper作為request對象的包裝類,采用了裝飾設(shè)計模式。所謂裝飾設(shè)計模式就是通過包裝類的方法,增強(qiáng)類的某個功能。

public class EncodingFilter implements javax.servlet.Filter {
    public void destroy() {
    }
    public void doFilter(javax.servlet.ServletRequest req, javax.servlet.ServletResponse resp, javax.servlet.FilterChain chain) throws javax.servlet.ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        HttpServletRequest enhanceRequest = new EnhanceRequest(request);
        //處理響應(yīng)亂碼
        response.setContentType("text/html;charset=utf-8");
        //傳遞的是加強(qiáng)后的request
        chain.doFilter(enhanceRequest, resp);
    }
    public void init(javax.servlet.FilterConfig config) throws javax.servlet.ServletException {
    }
}


//使用HttpServletRequestWrapper包裝類,增強(qiáng)getParameterMap()等方法
class EnhanceRequest extends HttpServletRequestWrapper{

    private HttpServletRequest request;
    private boolean hasEncoded;

    public EnhanceRequest(HttpServletRequest request) {
        super(request);
        this.request = request;
    }
    @Override
    public Map<String, String[]> getParameterMap() {
        //獲取請求的方式
        String method = request.getMethod();
        //判斷請求方式,不同方式不同的處理
        if (method.equalsIgnoreCase("post")){
            try {
                request.setCharacterEncoding("UTF8");
                return request.getParameterMap();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }else if (method.equalsIgnoreCase("get")){
            Map<String,String[]> parameterMap = request.getParameterMap();
            //確保手動編碼只進(jìn)行一次
            if (!hasEncoded){
                for (String parameterName : parameterMap.keySet()){
                    String[] values = parameterMap.get(parameterName);
                    if (values != null){
                        for (int i=0;i<values.length;i++){
                            try {
                                //重新編碼
                                values[i] = new String(values[i].getBytes("ISO-8859-1"),"utf-8");
                            } catch (UnsupportedEncodingException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
                hasEncoded = true;
            }
            return parameterMap;
        }
        return super.getParameterMap();
    }
    @Override
    public String getParameter(String name) {
        Map<String,String[]> parameterMap = getParameterMap();
        String[] values = parameterMap.get(name);
        if (values ==  null){
            return null;
        }
        return values[0];
    }
    @Override
    public String[] getParameterValues(String name) {
        Map<String,String[]> parameterMap = getParameterMap();
        String[] values = parameterMap.get(name);
        if (values ==  null){
            return null;
        }
        return values;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容