用过滤器和装饰者设计模式(静态代理)解决getParameter乱码问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用过滤器和装饰者设计模式(静态代理)解决getParameter乱码问题相关的知识,希望对你有一定的参考价值。
post的乱码问题比较好解决,这里主要是对get请求的乱码做处理
解决思路:增强request对象的getParameter方法,使之 getParameter 直接获取到的就是解决乱码后的数据
有四种方式,
1、继承 :(下下策)
①明确知道全类名
可以打印request实现类,可以知道实现类的全类名
②就是可以在子类中 new 父类
你能确定request实现类,一定可以new么?
确定自己写出的是通用方法。tomcat,weblogic,jboss......
缺点:
①很难实现,几乎没有扩展性
②会占用宝贵的extends位
2、装饰设计模式【静态代理】
优点:
①不用知道实现类,可以用接口。 代码扩展性极强
②不用占用宝贵的extends位
步骤:
①增强类 必须实现 被增强类 实现的所有接口
②增强类 必须能够获得 被增强类 引用
缺点:
如果接口中的无关方法过多,浪费大量实现实现这些无关方法。
解决方案:
1、用动态代理
2、去找包装类,只需要继承包装类,子包装/子增强类
HttpServletRequestWrapper
3、动态代理(暂时先不说)
4、字节码增强(暂时先不说)
具体代码实现:
1、自己写的增强类
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 }
以上是关于用过滤器和装饰者设计模式(静态代理)解决getParameter乱码问题的主要内容,如果未能解决你的问题,请参考以下文章