1、首先看一个装饰模式解决字符集编码问题

  我们使用装饰者对request进行增强,从而使得get和post使用request.getParameter()获得的数据没有乱码:

  首先来一个Servlet,用于处理客户端请求:

package 装饰者模式解决乱码;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class DataServlet extends HttpServlet {private static final long serialVersionUID = 1L;public DataServlet() {super();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获得数据String username = request.getParameter("username");String password = request.getParameter("password");System.out.println("前:" +username+"@"+password);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获得数据String username = request.getParameter("username");String password = request.getParameter("password");System.out.println("前:" +username+"@"+password);}}

  创建HttpServletRequest的增强类,借助HttpServletRequestWrapper:

package 装饰者模式解决乱码;import java.io.UnsupportedEncodingException;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;/****  sun 提供 HttpServletRequest 接口使用装饰者编写默认类,及所有的方法都没有增强的。*  * 之后我们只需要继承即可*  *  增强response对象,提供使用装饰者设计模式编写默认类:HttpServletResponseWrapper*/
public class MyRequest extends HttpServletRequestWrapper {//保持对接口的引用private HttpServletRequest request;//构造方法public MyRequest(HttpServletRequest request) {super(request);//赋值this.request = request;}//重写某个方法@Overridepublic String getParameter(String name) {//首先获得参数,这是没有改变编码的值String value =  request.getParameter(name);//首先判断请求方式String method = request.getMethod();if ("GET".equals(method)) {try {value = new String(value.getBytes("ISO-8859-1"), "utf-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}}else {try {request.setCharacterEncoding("utf-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}}return value;}}

  在客户端向服务器发送请求时,我们需要对其进行拦截:

package 装饰者模式解决乱码;import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class EncodingFilter implements Filter {public EncodingFilter() {}public void destroy() {}public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {//强转HttpServletRequest request = (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse) res;//post编码response.setCharacterEncoding("UTF-8");//使用装饰者模式增强MyRequest myRequest = new MyRequest(request);//放行chain.doFilter(myRequest, response);System.out.println("我是中国人!");/*//0 强转HttpServletRequest request = (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse) resp;           //1 post乱码request.setCharacterEncoding("UTF-8");      //2 使用装饰者增强requestMyRequest myRequest = new MyRequest(request);        chain.doFilter(myRequest, response);*/}public void init(FilterConfig fConfig) throws ServletException {}}

2、动态代理解决

  客户端页面:

<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>动态代理解决get方式乱码问题</title>
</head>
<body><form action="/proxy/DataServlet" method="get">用户名:<input type="text" name="username" value="胡根得" /><br/>密码:<input type="password" name=password value="就不告诉你"><br/><input type="submit" value="提交get请求"></form>
</body>
</html>

  写一个Servlet:

package solveresponseencoding;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet("/DataServlet")
public class DataServlet extends HttpServlet {private static final long serialVersionUID = 1L;public DataServlet() {super();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获得请求参数String username = request.getParameter("username");String password = request.getParameter("password");//打印值System.out.println(request.getMethod() + " : " + username + " @ " + password);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}

  对请求进行拦截的过滤器:

<span style="font-size:18px;">package solveresponseencoding;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.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebFilter("/*")
public class EncodingFilter implements Filter {public EncodingFilter() {}public void destroy() {}/** 本方法会拦截所有请求,在本方法中对request进行增强*/public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {//强转final HttpServletRequest request = (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse) res;//解决post乱码request.setCharacterEncoding("utf-8");//创建动态代理对象HttpServletRequest myRequest = (HttpServletRequest) Proxy.newProxyInstance(EncodingFilter.class.getClassLoader(), new Class[]{HttpServletRequest.class},new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//如果是getParameter方法,获取参数if ("getParameter".equals(method.getName())) {String value = request.getParameter((String)args[0]);//System.out.println("value值为:"+value);//如果是get请求,就增强if ("GET".equalsIgnoreCase(request.getMethod())) {value = new String(value.getBytes("ISO-8859-1"), "utf-8");System.out.println("我是get方法:");}return value;}return method.invoke(request, args);}});chain.doFilter(myRequest, response);}public void init(FilterConfig fConfig) throws ServletException {}}
</span>

  动态代理解决这个问题,将增强放到了过滤器中,不同之处他没有专门的增强类,而是通过动态代理技术在运行期间动态生成的,对于InvocationHandler接口采用了匿名内部类的方式。

动态代理解决网站字符集编码相关推荐

  1. 使用动态代理解决网站字符集编码问题:(之前通过拦截器)

    使用动态代理解决网站字符集编码问题:(之前通过拦截器) 设计模式: 在软件开发的过程中,遇到相识的问题,将问题的解决方式抽象为模型(套路) 单例模式(静态代码只会执行一次),工厂模式,动态代理,装饰者 ...

  2. chrome查看网站字符集编码的方法(不需要安装charset)

    打开需要查看的网站,接着摁快捷键F12 在右上角菜单栏中点击console,console区域既是输出区域,也可以输入 输入: document.charset 回车,会显示字符集编码.

  3. Cglib实现动态代理-解决大对象值传递问题

    整篇基于cglib的3.0 版本实现来介绍下Cglib的一种应用场景.Cglib的底层是调用ASM来实现动态链接的,所以性能方便会比Java原生的Proxy的性能提升很多.Spring框架的AOP也是 ...

  4. Java动态代理类使用

    Java动态代理类使用 Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类: 一.Interface InvocationHandler:该接口中仅定义了一个方法O ...

  5. 静态代理、动态代理概念及使用

    文章目录 1. 为什么要用静态代理 2. 静态代理的实现 3. 静态代理的缺点 4. 动态代理 4.1 JDK动态代理 4.1.1 InvocationHandler 4.1.2 Class 4.1. ...

  6. 【设计模式】代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 )

    文章目录 前言 一.静态代理的弊端 二.动态代理的优势 三.动态代理使用流程 1.目标对象接口 2.被代理对象 3.调用处理程序 4.客户端 四.动态生成 代理对象 类 的 字节码 文件数据 前言 代 ...

  7. java 委托_动态代理:Java开发必学

    一句话概括:java 动态代理通过反射机制,可在不修改原代码的情况下添加新的功能,应用于多种场景,简单.实用.灵活,是 java 开发必学知识,本文将对动态代理使用进行详细介绍. 1. 引言 最近开发 ...

  8. 4种实例 advice aop_Java动态代理在Spring的应用:AOP编程与动态代理知识

    认真写文章,用心做分享.公众号:Java耕耘者 文章都会在里面更新,整理的资料也会放在里面. 关于代理模式的话题有很多,在开发中经常用到的应该是静态代理模式,能很好的去耦合. 动态代理是代理模式的另外 ...

  9. Java提高班(六)反射和动态代理(JDK Proxy和Cglib)

    反射和动态代理放有一定的相关性,但单纯的说动态代理是由反射机制实现的,其实是不够全面不准确的,动态代理是一种功能行为,而它的实现方法有很多.要怎么理解以上这句话,请看下文. 一.反射 反射机制是 Ja ...

最新文章

  1. java定焦点_Android 开发 Camera1_如何使用对焦功能
  2. android平台使用java动态生成公私钥,并导出证书文件
  3. 基于 Apache Hudi 构建流批一体系统实践
  4. 二进制搜索算法_二进制搜索的一个扭曲故事
  5. X3950通过MGMT关机产生NMI,PCI,LOG报错
  6. 专访商汤联合创始人林达华:商汤的开源战略,从算法做起
  7. openbsd下实现双网卡负载均衡
  8. Redis 禁止使用耗时命令和时间复杂度为O(n)的命令
  9. 计算机图形学(一)——数据压缩:道格拉斯普克法
  10. 总结列表显示ListView知识点
  11. 《图解算法》学习笔记之快速排序
  12. php仿小红书,vue仿小红书个人开源项目
  13. matlab图片纹理特征直方图,常用的图像特征有颜色特征、纹理特征、形状特征、空间关系特征。...
  14. 图像特效之LOMO效果
  15. TCP协议--复位报文段
  16. 保弘实业|工资低的家庭要怎么进行投资理财
  17. php抢购问题,PHP并发抢购解决方案
  18. f2fs学习二:预分配
  19. 解决PL2303_Prolific U转串驱动在win64位系统下报error 10错误
  20. FPGA对定点数的处理 作业

热门文章

  1. Web设计里的软件工程思想
  2. 最简单的小程序怎么做?
  3. 大多数物联网仍采用2.4GHz频段的原因
  4. Spark机器学习之协同过滤算法
  5. Android之SwipeRefreshLayout下拉刷新组件
  6. SSRF攻击实例解析
  7. CSS3控制背景图片大小
  8. 行连接和列连接的区别
  9. 继承、私有属性-Python
  10. 大数据项目实战数仓4——总纲