過濾器解決get和post方式提交的中文亂碼

        對於國內的程序員來講,在作項目時避免不了的問題是中文亂碼問題。
       若是不使用過濾器的話,在每一個servlet中都要進行設置編碼,若是是post請求還好,可是若是是get請求,就要手動進行轉碼,至關麻煩。
        下面來介紹一下過濾器解決表單提交中的中文亂碼問題。java

        過濾器,顧名思義就是過濾用的,它能夠在請求、響應、或者servlet中請求轉發等操做發生時先進行執行,以後程序再往下執行,這裏起到一個過濾的做用。程序員

    日常在 servlet 中接受請求的數據時可使用 request.getParameter(name) 或者 request.getParameterValues(name) 進行獲取,但這些方法若是不進行編碼設置時,獲得的數據都是亂碼,這是由於瀏覽器傳過來的數據的編碼格式是iso-8859-1,而咱們的開發平臺通常都是使用的是utf-8,因此就會出現亂碼現象。設計模式

       這時也就是說request.getParameter(name)這些方法知足不了咱們當前的需求,此時咱們能夠利用裝飾者設計模式對這些方法進行加強。
    而爲了方便程序員對HttpServletRequest 進行包裝,javaEE中就已經提供好了一個基類HttpServletRequestWrapper這個類中已經實現其餘須要實現的接口,咱們只須要編寫一個本身的類例如MyRequest繼承它,須要加強哪一個方法,就對哪一個方法進行重寫就行,沒有重寫的方法原來是如何執行的如今還會如何執行。瀏覽器

下面是具體代碼實現過程:app

public class MyRequest extends HttpServletRequestWrapper{
	
	HttpServletRequest request=null;
	
	public MyRequest(HttpServletRequest request) {
		super(request);
		this.request = request;
	}
	
	@Override
	public String getParameter(String name) {
		
		String method = request.getMethod();
		String value=null;
		try {
			request.setCharacterEncoding("utf-8");
			
			value = request.getParameter(name);
			
			if("get".equalsIgnoreCase(method)){
				value = new String(value.getBytes("iso-8859-1"),"utf-8");
			}
		} catch (Exception e) {
				e.printStackTrace();
		}
		
		return value;
	}
	
	
	@Override
	public String[] getParameterValues(String name) {
		
		String method = request.getMethod();
		String[] values=null;
		try {
			request.setCharacterEncoding("utf-8");
			
			values = request.getParameterValues(name);
			
			if("get".equalsIgnoreCase(method)){
				int i=0;
				for (String str : values) {
					values[i++] = new String(str.getBytes("iso-8859-1"),"utf-8");
				}
			}
		} catch (Exception e) {
				e.printStackTrace();
		}
		
		return values;
	}
	
}

        過濾器中的代碼實現,須要注意的是,在過濾器中放行傳入的request對象,是咱們通過加強後的MyRequest對象。ide

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
		
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) resp;
		
		MyRequest myRrequest = new MyRequest(request);
		
		chain.doFilter(myRrequest, response);
	}

        使用過濾器後,這樣在用servlet接受瀏覽器傳過來的數據時,就不用考慮亂碼的問題,過濾器已經幫咱們解決了。post

相關文章
相關標籤/搜索