用过滤器和装饰者设计模式(静态代理)解决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、自己写的增强类

  

 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     }
时间: 2024-08-06 04:30:37

用过滤器和装饰者设计模式(静态代理)解决getParameter乱码问题的相关文章

利用filter和动态代理解决全站乱码问题

1.利用filter和动态代理解决全站乱码问题 1.1filter的代码 package com.baowei.filter; import java.io.IOException; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import javax.servlet.Filter; import javax.servlet

设计模式(22)-----代理设计模式-----静态代理

一:用继承实现静态代理 1 package com.DesignPatterns.al.Dynamic1; 2 3 public interface Moveable { 4 public void move(); 5 } package com.DesignPatterns.al.Dynamic1; import java.util.Random; public class Tank implements Moveable { @Override public void move() { Sy

设计模式-静态代理

1.静态代理实现要求 有真实的角色 有代理的对象 真实角色和代理对象实现同一个代理接口 2.静态代理事例 MarrayContent代理MarryPerson,MarryPerson只关注结婚其他事情都交给MarrayContent代理对象去做 public class StaticProxy { public static void main(String args[]){ MarryPerson person = new MarryPerson(); Marray content = new

使用动态代理解决全局乱码

javaweb中常常遇到表单提交后,读取表单数据乱码,特别是从request域存取数据最为频繁 ,常用的解决方法就是设置全局乱码文件码通过Filter过滤.无论是post方式提交还是get方式都适用. 我用的JDK1.8,用了Lambda表达式,1.8以下的可以用匿名内部类代替 首先创建一个Filter文件,实现代码如下: package com.practice.web.filter; import javax.servlet.*; import javax.servlet.http.Http

[设计模式]静态代理模式

Subject.java 1 package cn.itcast.proxy; 2 3 //定义一个抽象类,代理角色和真实角色都要实现这个共同的抽象类 4 public abstract class Subject { 5 //定义一个方法,这个方法就好比中介和房东都有向外租房子的方法 6 public abstract void request(); 7 } RealSubject.java 1 package cn.itcast.proxy; 2 3 //这个类好比是真正的房东.实现向外租房

设计模式—静态代理模式(聚合与继承方式比较)

一.概述 1.目标:要在Tank的move()方法做时间代理及日志代理(可以设想以后还要增加很多代理处理),且代理间的顺序可活更换 2.思路: (1)聚合:代理类聚合了被代理类,且代理类及被代理类都实现了movable接口,则可实现灵活多变,具体看代码 (2)继承:继承不够灵活,随着功能需求增多,继承体系会非常臃肿.具体看代码 二.代码 1.Movable.java 2.Tank.java 3.TankTimeProxy.java 4.TankLogProxy.java 5.Tank2Time.

java 静态代理 JDK动态代理 Cglib动态代理

下面以一个简单的银行账户为例讲述讲述动态代理. 设计一个银行账户类,包含用户的账户余额,实现查询和更新余额功能 这个系统用了一段时间,有客户要求对账说账户余额给弄错了?因为上面没有存取款记录,最后银行不认账,客户收到了损失.银行为了避免这种现象再次发生,决定对这个系统进行修改,但是因为bankAccount太过复杂,希望在不修改bankAccount的情况下,增加日志功能. 静态代理 使用静态代理解决上面的问题. 银行要求所有模块都需要添加日志功能,这对苦逼的程序员来说真的是一个不小的工作量啊,

在Filter中使用动态代理解决请求中文乱码问题

使用动态代理解决请求中文乱码问题 1.增强一个类我们常用的几种解决方案: 1.继承 a) 优点简单 b) 必须有被增强类的实现类 2.装饰者模式 a) 要求:1实现相同的接口.2持有被增强的对象 b) 优点:不必知道被增强的实现是谁 c) 缺点:必须实现所有没被增强方法的原始对象的原样调用 3.动态代理 a) 要求:1实现相同接口,2持有被增强的对象 b) 优点:不必手动实现所有不增强方法的原样调用.对方法进行增强时有类似过滤器的功能. c) 缺点:学习成本高. 代理(Proxy): 一个代理对

装饰者设计模式与静态代理设计模式的对比

相同点: (1) 装饰者类与代理类都需要实现目标类所实现的接口 (2) 装饰者类与代理类中都需要声明目标类对象,目的是这些类中都需要调用目标对象的目标方法 (3) 装饰者类与代理类都可以在不改变目标类的前提下对目标对象进行增强 不同点: (1) 目的不同:装饰者类的目的就是为了增强目标类:静态代理类的目的是为了保护和隐藏目标对象. (2) 装饰者类与代理类中都需要声明目标类对象,但对于目标对象的创建方式不同.装饰者类是由带参构造器传入的:代理类中的目标对象,是在无参构造器中直接创建的. (3)