1. 程式人生 > >用過濾器和裝飾者設計模式(靜態代理)解決getParameter亂碼問題

用過濾器和裝飾者設計模式(靜態代理)解決getParameter亂碼問題

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);
	}