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. }

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

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

    下面以一个简单的银行账户为例讲述讲述动态代理. 设计一个银行账户类,包含用户的账户余额,实现查询和更新余额功能 这个系统用了一段时间,有客户要求对账说账户余额给弄错了?因为上面没有存取款记录,最后银行 ...

  2. 静态代理设计模式(StaticProxy)

    静态代理设计模式: 要求:真实角色,代理角色:真实角色和代理角色要实现同一个接口,代理角色要持有真实角色的引用. 在Java中线程的设计就使用了静态代理设计模式,其中自定义线程类实现Runable接口 ...

  3. JAVA设计模式——代理(静态代理)

    定义 为其它的对象提供一种代理,以控制这个对象的访问 使用场景 当不想直接访问某个对象的时候,就可以通过代理 1.不想买午餐,同事帮忙带 2.买车不用去厂里,去4s店 3.去代理点买火车票,不用去车站 ...

  4. 代理设计模式 (静态代理设计模式)+ 动态代理(JDK和Cglib)

    一.代理设计模式 1.设计模式:前人总结一套解决特定问题的代码 2.代理设计模式优点: 2.1 保护真实对象 2.2 让真实对象职责更明确 2.3 扩展 3.代理设计模式 3.1 真实对象(老总) 3 ...

  5. Java设计模式之代理模式(静态代理和JDK、CGLib动态代理)以及应用场景

    我做了个例子 ,需要可以下载源码:代理模式 1.前言: Spring 的AOP 面向切面编程,是通过动态代理实现的, 由两部分组成:(a) 如果有接口的话 通过 JDK 接口级别的代理 (b) 如果没 ...

  6. IOS设计模式第五篇之装饰设计模式的代理设计模式

    版权声明:原创作品,谢绝转载!否则将追究法律责任. 代理: 另一个装饰设计模式,代理,是一个代表或者协调另一个对象的行为机制.例如当你用一个tableView,你必须实现他里面的一个tableView ...

  7. JAVA设计模式:静态代理

    一.概念代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关 ...

  8. Java代理设计模式(Proxy)的四种具体实现:静态代理和动态代理

    面试问题:Java里的代理设计模式(Proxy Design Pattern)一共有几种实现方式?这个题目很像孔乙己问"茴香豆的茴字有哪几种写法?" 所谓代理模式,是指客户端(Cl ...

  9. Mybaits 源码解析 (十一)----- 设计模式精妙使用:静态代理和动态代理结合使用:@MapperScan将Mapper接口生成代理注入到Spring

    上一篇文章我们讲了SqlSessionFactoryBean,通过这个FactoryBean创建SqlSessionFactory并注册进Spring容器,这篇文章我们就讲剩下的部分,通过Mapper ...

随机推荐

  1. js算法

    最近面试可能会问这些 1,插入排序 function sort(elements){ var res =[elements[0]]; for (var i = 0; i < elements.l ...

  2. Connect the Cities(prime)

    Connect the Cities Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) ...

  3. Android UI目录

    Android UI目录 序:最近一直想进阶android应用开发,虽然对一些相关的android知识都大体熟悉,但是自己的android知识体系,经不起推敲.经不起高手的垂问.经过几个月的努力学习, ...

  4. ios5和ios6横竖屏支持及ipad和iphone设备的判断

    ios5和ios6横竖屏支持及ipad和iphone设备的判断 判断是ipad还是iphone设备.此定义在PayViewControllerDemo-Prefix.pch 定义如下: #define ...

  5. windows7旗舰版64位下安装、破解及执行QTP11报错

    说明:假设你出现了下面几种情况,希望能解决你的问题:假设没有,就当路过. 1.安装qtp11时报vc++ 2005缺少,但怎么也不能安装成功 解决方法: 1.找到qtp安装包里面的vc++ 2005组 ...

  6. 如何确定Ubuntu下是否对某个CVE打了补丁

        前些日子在月赛中,拿到了一台Ubuntu14.04的服务器,但并不是root权限,需要提权.我Google了一下,找到了CVE-2015-1318,CVE-2015-1328,CVE-2015 ...

  7. js 正则表达式验证 整理

    1.验证首字符是英文字母: var str="123"; var reg=/^[a-zA-Z]/; if(!reg.test(str)){ alert(str+"应以字母 ...

  8. Java多线程相关知识

    1)wait()  notify()  sleep() sleep是Thread类的函数,wait和notify是Object的函数. sleep的时候keep对象锁,wait的时候release 对 ...

  9. HDU 1045(Fire Net)题解

    以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定大小的棋盘中部分格子存在可以阻止互相攻击的墙,问棋盘中可以放置最多多少个可以横纵攻击炮塔. [题目分析] 这题本来在搜索专题 ...

  10. Javascript 拖拽雏形中的一些问题——逐行分析代码,让你轻松了解拖拽的原理

    今天我们就来解决上一次拖拽雏形中的一些问题.下面看看有哪些问题? 附上上期的Javascript代码,方便大家查看问题. <script type="text/javascript&q ...