post的亂碼問題比較好解決,這裡主要是對get請求的亂碼做處理
解決思路:增強request對象的getParameter方法,使之 getParameter 直接獲取到的就是解決亂碼後的數據
有四種方式,
1、繼承 :(下下策)
①明確知道全類名
可以打印request實現類,可以知道實現類的全類名
②就是可以在子類中 new 父類
你能確定request實現類,一定可以new麼?
確定自己寫出的是通用方法。tomcat,weblogic,jboss......
缺點:
①很難實現,幾乎沒有擴展性
②會占用寶貴的extends位
2、裝飾設計模式【靜態代理】
優點:
①不用知道實現類,可以用接口。 代碼擴展性極強
②不用占用寶貴的extends位
步驟:
①增強類 必須實現 被增強類 實現的所有接口
②增強類 必須能夠獲得 被增強類 引用
缺點:
如果接口中的無關方法過多,浪費大量實現實現這些無關方法。
解決方案:
1、用動態代理
2、去找包裝類,只需要繼承包裝類,子包裝/子增強類
HttpServletRequestWrapper
3、動態代理(暫時先不說)
4、字節碼增強(暫時先不說)
具體代碼實現:
解決方式:使用裝飾者設計模式(靜態代理)對getParameter進行功能增強
1、自己的類繼承HttpServletRequestWrapper,對其中的getParameter方法進行重寫
1 package com.itheim.utils; 2 import java.io.UnsupportedEncodingException; 3 import javax.servlet.http.HttpServletRequest; 4 import javax.servlet.http.HttpServletRequestWrapper; 5 public class MyHttpRequest extends HttpServletRequestWrapper { 6 HttpServletRequest req; 7 public MyHttpRequest(HttpServletRequest old) { 8 super(old); 9 // TODO Auto-generated constructor stub 10 this.req=old; 11 } 12 @Override 13 public String getParameter(String name) { 14 String method = req.getMethod(); 15 if("get".equalsIgnoreCase(method)){ 16 String par = req.getParameter(name); 17 if(par!=null){ 18 String result = null; 19 try { 20 result=new String(par.getBytes("iso8859-1"), "utf-8"); 21 } catch (UnsupportedEncodingException e) { 22 // TODO Auto-generated catch block 23 throw new RuntimeException(e); 24 } 25 return result; 26 } 27 28 } 29 30 return req.getParameter(name); 31 } 32 }
2、過濾器中的代碼實現
1 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 2 //解決post亂碼 3 request.setCharacterEncoding("utf-8"); 4 //解決get亂碼 5 HttpServletRequest httpServletRequest=(HttpServletRequest) request; 6 MyHttpRequest request2=new MyHttpRequest(httpServletRequest); 7 chain.doFilter(request2, response); 8 }