用過濾器和裝飾者設計模式(靜態代理)解決getParameter亂碼問題
阿新 • • 發佈:2019-01-24
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; import java.io.UnsupportedEncodingException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; public class MyHttpRequest extends HttpServletRequestWrapper { HttpServletRequest req; public MyHttpRequest(HttpServletRequest old) { super(old); // TODO Auto-generated constructor stub this.req=old; } @Override public String getParameter(String name) { String method = req.getMethod(); if("get".equalsIgnoreCase(method)){ String par = req.getParameter(name); if(par!=null){ String result = null; try { result=new String(par.getBytes("iso8859-1"), "utf-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block throw new RuntimeException(e); } return result; } } return req.getParameter(name); } }
2、過濾器中程式碼
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //解決post亂碼 request.setCharacterEncoding("utf-8"); //解決get亂碼 HttpServletRequest httpServletRequest=(HttpServletRequest) request; MyHttpRequest request2=new MyHttpRequest(httpServletRequest); chain.doFilter(request2, response); }