用过滤器和装饰者设计模式(静态代理)解决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);
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值