用过滤器和装饰者设计模式(静态代理)解决getParameter乱码问题
post的乱码问题比较好解决,这里主要是对get请求的乱码做处理
解决思路:增强request对象的getParameter方法,使之 getParameter 直接获取到的就是解决乱码后的数据
有四种方式,
1、继承 :(下下策)
①明确知道全类名
可以打印request实现类,可以知道实现类的全类名
②就是可以在子类中 new 父类
你能确定request实现类,一定可以new么?
确定自己写出的是通用方法。tomcat,weblogic,jboss......
缺点:
①很难实现,几乎没有扩展性
②会占用宝贵的extends位
2、装饰设计模式【静态代理】
优点:
①不用知道实现类,可以用接口。 代码扩展性极强
②不用占用宝贵的extends位
步骤:
①增强类 必须实现 被增强类 实现的所有接口
②增强类 必须能够获得 被增强类 引用
缺点:
如果接口中的无关方法过多,浪费大量实现实现这些无关方法。
解决方案:
1、用动态代理
2、去找包装类,只需要继承包装类,子包装/子增强类
HttpServletRequestWrapper
3、动态代理(暂时先不说)
4、字节码增强(暂时先不说)
具体代码实现:
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);
}
用过滤器和装饰者设计模式(静态代理)解决getParameter乱码问题的更多相关文章
- java 静态代理 JDK动态代理 Cglib动态代理
下面以一个简单的银行账户为例讲述讲述动态代理. 设计一个银行账户类,包含用户的账户余额,实现查询和更新余额功能 这个系统用了一段时间,有客户要求对账说账户余额给弄错了?因为上面没有存取款记录,最后银行 ...
- 静态代理设计模式(StaticProxy)
静态代理设计模式: 要求:真实角色,代理角色:真实角色和代理角色要实现同一个接口,代理角色要持有真实角色的引用. 在Java中线程的设计就使用了静态代理设计模式,其中自定义线程类实现Runable接口 ...
- JAVA设计模式——代理(静态代理)
定义 为其它的对象提供一种代理,以控制这个对象的访问 使用场景 当不想直接访问某个对象的时候,就可以通过代理 1.不想买午餐,同事帮忙带 2.买车不用去厂里,去4s店 3.去代理点买火车票,不用去车站 ...
- 代理设计模式 (静态代理设计模式)+ 动态代理(JDK和Cglib)
一.代理设计模式 1.设计模式:前人总结一套解决特定问题的代码 2.代理设计模式优点: 2.1 保护真实对象 2.2 让真实对象职责更明确 2.3 扩展 3.代理设计模式 3.1 真实对象(老总) 3 ...
- Java设计模式之代理模式(静态代理和JDK、CGLib动态代理)以及应用场景
我做了个例子 ,需要可以下载源码:代理模式 1.前言: Spring 的AOP 面向切面编程,是通过动态代理实现的, 由两部分组成:(a) 如果有接口的话 通过 JDK 接口级别的代理 (b) 如果没 ...
- IOS设计模式第五篇之装饰设计模式的代理设计模式
版权声明:原创作品,谢绝转载!否则将追究法律责任. 代理: 另一个装饰设计模式,代理,是一个代表或者协调另一个对象的行为机制.例如当你用一个tableView,你必须实现他里面的一个tableView ...
- JAVA设计模式:静态代理
一.概念代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关 ...
- Java代理设计模式(Proxy)的四种具体实现:静态代理和动态代理
面试问题:Java里的代理设计模式(Proxy Design Pattern)一共有几种实现方式?这个题目很像孔乙己问"茴香豆的茴字有哪几种写法?" 所谓代理模式,是指客户端(Cl ...
- Mybaits 源码解析 (十一)----- 设计模式精妙使用:静态代理和动态代理结合使用:@MapperScan将Mapper接口生成代理注入到Spring
上一篇文章我们讲了SqlSessionFactoryBean,通过这个FactoryBean创建SqlSessionFactory并注册进Spring容器,这篇文章我们就讲剩下的部分,通过Mapper ...
随机推荐
- spring mvc <mvc:annotation-driven>配置使用出现故障
我在使用converter进行全局的日期类型转换. 1.写converer public class CustomDateConverter implements Converter<Strin ...
- 3-07. 求前缀表达式的值(25) (ZJU_PAT数学)
题目链接:http://pat.zju.edu.cn/contests/ds/3-07 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.前缀表达式指二元运算符位于两个运算数之前,比如2+3*(7 ...
- 自动工作负载库(Automatic Workload Repository,AWR)
自动工作负载库(Automatic Workload Repository,AWR)AWR的由来: 10g之前的oracle:用户的连接将产生会话,当前会话记录保存在v$session中:处于等 ...
- 集合框架-TreeSet
TreeSet是Set集合的常见子类. TreeSet:底层结构是 二叉树 元素是有排序的,但是不可以有重复元素. 相关代码演练: /* TreeSet ;元素是有序的,但是不可以元素重复. */ i ...
- HTML需掌握的基础
首先,我们学习web前端开发基础技术需要掌握的是HTML.CSS.JavaScript语言,那么在下先解释一下何为HTML.CSS.JavaScript语言. HTML是网页内容的载体.内容就是网页制 ...
- UVA 1569 Multiple
题意: 给定m个1位数字,要求用这些数字组成n的倍数的最小数字,如果无法组成就输出0 分析: BFS,由于n最大5000,余数最多5000,利用余数去判重,并记录下路径即可 代码: #include ...
- SQL递归查询(with cte as) 物料分解
需求 最近在做一个MRP的项目,需要根据生产下达的计划从原始无聊表中分解出成品所需要的原材料和数量. 参考 http://www.cnblogs.com/xqhppt/archive/2011/02/ ...
- SQL Server 死锁检查
示例代码 select spid, blocked, status, hostname, program_name, hostprocess, cmd from sysprocesses -- kil ...
- IOS支付宝支付出现6002问题的解决办法
运行支付宝官方demo进行支付测试,会出现6002-网络连接错误,是因为以iOS9 SDK编译的工程会默认以SSL安全协议进行网络传输,即HTTPS,如果依然使用HTTP协议请求网络会报系统异常并中断 ...
- javascript 压缩空格代码演示
压缩空格代码演示 主要是讲解 压缩一个字符串两段空格 例如:javascript函数里的空格不论是这样 var s = "Hello World ...