1. 程式人生 > >過濾器解決get和post方式提交的中文亂碼

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

       對於國內的程式設計師來說,在做專案時避免不了的問題是中文亂碼問題。
       如果不使用過濾器的話,在每個servlet中都要進行設定編碼,如果是post請求還好,但是如果是get請求,就要手動進行轉碼,相當麻煩。
下面來介紹一下過濾器解決表單提交中的中文亂碼問題。
        過濾器,顧名思義就是過濾用的,它可以在請求、響應、或者servlet中請求轉發等操作發生時先進行執行,之後程式再往下執行,這裡起到一個過濾的作用。

        平常在servlet中接受請求的資料時可以使用request.getParameter(name)或者request.getParameterValues(name)進行獲取,但這些方法如果不進行編碼設定時,得到的資料都是亂碼

,這是因為瀏覽器傳過來的資料的編碼格式是iso-8859-1,而我們的開發平臺一般都是使用的是utf-8,所以就會出現亂碼現象。

       這時也就是說request.getParameter(name)這些方法滿足不了我們當前的需求,此時我們可以利用裝飾者設計模式對這些方法進行增強。
       而為了方便程式設計師對HttpServletRequest 進行包裝,javaEE中就已經提供好了一個基類HttpServletRequestWrapper這個類中已經實現其他需要實現的介面,我們只需要編寫一個自己的類例如MyRequest繼承它,需要增強哪個方法,就對哪個方法進行重寫就行,沒有重寫的方法原來是如何執行的現在還會如何執行。


下面是具體程式碼實現過程:

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物件。
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接受瀏覽器傳過來的資料時,就不用考慮亂碼的問題,過濾器已經幫我們解決了。

相關推薦

no