用过滤器和装饰者设计模式(静态代理)解决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 ...
随机推荐
- js算法
最近面试可能会问这些 1,插入排序 function sort(elements){ var res =[elements[0]]; for (var i = 0; i < elements.l ...
- Connect the Cities(prime)
Connect the Cities Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) ...
- Android UI目录
Android UI目录 序:最近一直想进阶android应用开发,虽然对一些相关的android知识都大体熟悉,但是自己的android知识体系,经不起推敲.经不起高手的垂问.经过几个月的努力学习, ...
- ios5和ios6横竖屏支持及ipad和iphone设备的判断
ios5和ios6横竖屏支持及ipad和iphone设备的判断 判断是ipad还是iphone设备.此定义在PayViewControllerDemo-Prefix.pch 定义如下: #define ...
- windows7旗舰版64位下安装、破解及执行QTP11报错
说明:假设你出现了下面几种情况,希望能解决你的问题:假设没有,就当路过. 1.安装qtp11时报vc++ 2005缺少,但怎么也不能安装成功 解决方法: 1.找到qtp安装包里面的vc++ 2005组 ...
- 如何确定Ubuntu下是否对某个CVE打了补丁
前些日子在月赛中,拿到了一台Ubuntu14.04的服务器,但并不是root权限,需要提权.我Google了一下,找到了CVE-2015-1318,CVE-2015-1328,CVE-2015 ...
- js 正则表达式验证 整理
1.验证首字符是英文字母: var str="123"; var reg=/^[a-zA-Z]/; if(!reg.test(str)){ alert(str+"应以字母 ...
- Java多线程相关知识
1)wait() notify() sleep() sleep是Thread类的函数,wait和notify是Object的函数. sleep的时候keep对象锁,wait的时候release 对 ...
- HDU 1045(Fire Net)题解
以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定大小的棋盘中部分格子存在可以阻止互相攻击的墙,问棋盘中可以放置最多多少个可以横纵攻击炮塔. [题目分析] 这题本来在搜索专题 ...
- Javascript 拖拽雏形中的一些问题——逐行分析代码,让你轻松了解拖拽的原理
今天我们就来解决上一次拖拽雏形中的一些问题.下面看看有哪些问题? 附上上期的Javascript代码,方便大家查看问题. <script type="text/javascript&q ...