過濾器解決get和post方式提交的中文亂碼
阿新 • • 發佈:2019-01-12
對於國內的程式設計師來說,在做專案時避免不了的問題是中文亂碼問題。
如果不使用過濾器的話,在每個servlet中都要進行設定編碼,如果是post請求還好,但是如果是get請求,就要手動進行轉碼,相當麻煩。
下面來介紹一下過濾器解決表單提交中的中文亂碼問題。
過濾器,顧名思義就是過濾用的,它可以在請求、響應、或者servlet中請求轉發等操作發生時先進行執行,之後程式再往下執行,這裡起到一個過濾的作用。
平常在servlet中接受請求的資料時可以使用request.getParameter(name)或者request.getParameterValues(name)進行獲取,但這些方法如果不進行編碼設定時,得到的資料都是亂碼
這時也就是說request.getParameter(name)這些方法滿足不了我們當前的需求,此時我們可以利用裝飾者設計模式對這些方法進行增強。
而為了方便程式設計師對HttpServletRequest 進行包裝,javaEE中就已經提供好了一個基類HttpServletRequestWrapper這個類中已經實現其他需要實現的介面,我們只需要編寫一個自己的類例如MyRequest繼承它,需要增強哪個方法,就對哪個方法進行重寫就行,沒有重寫的方法原來是如何執行的現在還會如何執行。
下面是具體程式碼實現過程:
過濾器中的程式碼實現,需要注意的是,在過濾器中放行傳入的request物件,是我們經過增強後的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; } }
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接受瀏覽器傳過來的資料時,就不用考慮亂碼的問題,過濾器已經幫我們解決了。