1. 程式人生 > >編寫filter,處理get和post中文亂碼問題

編寫filter,處理get和post中文亂碼問題

寫web程式遇到中文亂碼是無法避免的問題,雖然有好多框架都都做了處理,但是還是對於剛剛學習jsp和servlet的新手來說,亂碼還是不好處理,所以幾天貼出福利程式碼包裝一下Httprequest處理get亂碼問題,post亂碼只需要修改字元編碼就好了

所以只需要包裝處理一下get請求就好了程式碼如下

package com.leige.filter;



import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletRequestWrapper; /** * 對GET請求引數加以處理! * @author qdmmy6 * */ public class GetRequest extends HttpServletRequestWrapper { private HttpServletRequest request; private String charset; public GetRequest(HttpServletRequest request, String charset) { super
(request); this.request = request; this.charset = charset; } @Override public String getParameter(String name) { // 獲取引數 String value = request.getParameter(name); if(value == null) return null;//如果為null,直接返回null try { // 對引數進行編碼處理後返回
return new String(value.getBytes("ISO-8859-1"), charset); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } } @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public Map getParameterMap() { Map<String,String[]> map = request.getParameterMap(); if(map == null) return map; // 遍歷map,對每個值進行編碼處理 for(String key : map.keySet()) { String[] values = map.get(key); for(int i = 0; i < values.length; i++) { try { values[i] = new String(values[i].getBytes("ISO-8859-1"), charset); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } } } // 處理後返回 return map; } @Override public String[] getParameterValues(String name) { String[] values = super.getParameterValues(name); for(int i = 0; i < values.length; i++) { try { values[i] = new String(values[i].getBytes("ISO-8859-1"), charset); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } } return values; } }

編寫filter

package com.leige.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;


public class EncodingFilter implements Filter {
    private String charset = "UTF-8";
    @Override
    public void destroy() {}

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        if(req.getMethod().equalsIgnoreCase("GET")) {
            if(!(req instanceof GetRequest)) {
                req = new GetRequest(req, charset);//處理get請求編碼
            }
        } else {
            req.setCharacterEncoding(charset);//處理post請求編碼
        }
        chain.doFilter(req, response);
    }

    @Override
    public void init(FilterConfig fConfig) throws ServletException {
        String charset = fConfig.getInitParameter("charset");
        if(charset != null && !charset.isEmpty()) {
            this.charset = charset;
        }
    }
}

最後在web.xml中配置filter就可以處理中文亂碼了,伺服器使用什麼編碼就在程式碼中修改即可