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 }