對於國內的程序員來講,在作項目時避免不了的問題是中文亂碼問題。
若是不使用過濾器的話,在每一個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