动态代理解决网站字符集编码
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接口采用了匿名内部类的方式。
动态代理解决网站字符集编码相关推荐
- 使用动态代理解决网站字符集编码问题:(之前通过拦截器)
使用动态代理解决网站字符集编码问题:(之前通过拦截器) 设计模式: 在软件开发的过程中,遇到相识的问题,将问题的解决方式抽象为模型(套路) 单例模式(静态代码只会执行一次),工厂模式,动态代理,装饰者 ...
- chrome查看网站字符集编码的方法(不需要安装charset)
打开需要查看的网站,接着摁快捷键F12 在右上角菜单栏中点击console,console区域既是输出区域,也可以输入 输入: document.charset 回车,会显示字符集编码.
- Cglib实现动态代理-解决大对象值传递问题
整篇基于cglib的3.0 版本实现来介绍下Cglib的一种应用场景.Cglib的底层是调用ASM来实现动态链接的,所以性能方便会比Java原生的Proxy的性能提升很多.Spring框架的AOP也是 ...
- Java动态代理类使用
Java动态代理类使用 Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类: 一.Interface InvocationHandler:该接口中仅定义了一个方法O ...
- 静态代理、动态代理概念及使用
文章目录 1. 为什么要用静态代理 2. 静态代理的实现 3. 静态代理的缺点 4. 动态代理 4.1 JDK动态代理 4.1.1 InvocationHandler 4.1.2 Class 4.1. ...
- 【设计模式】代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 )
文章目录 前言 一.静态代理的弊端 二.动态代理的优势 三.动态代理使用流程 1.目标对象接口 2.被代理对象 3.调用处理程序 4.客户端 四.动态生成 代理对象 类 的 字节码 文件数据 前言 代 ...
- java 委托_动态代理:Java开发必学
一句话概括:java 动态代理通过反射机制,可在不修改原代码的情况下添加新的功能,应用于多种场景,简单.实用.灵活,是 java 开发必学知识,本文将对动态代理使用进行详细介绍. 1. 引言 最近开发 ...
- 4种实例 advice aop_Java动态代理在Spring的应用:AOP编程与动态代理知识
认真写文章,用心做分享.公众号:Java耕耘者 文章都会在里面更新,整理的资料也会放在里面. 关于代理模式的话题有很多,在开发中经常用到的应该是静态代理模式,能很好的去耦合. 动态代理是代理模式的另外 ...
- Java提高班(六)反射和动态代理(JDK Proxy和Cglib)
反射和动态代理放有一定的相关性,但单纯的说动态代理是由反射机制实现的,其实是不够全面不准确的,动态代理是一种功能行为,而它的实现方法有很多.要怎么理解以上这句话,请看下文. 一.反射 反射机制是 Ja ...
最新文章
- java定焦点_Android 开发 Camera1_如何使用对焦功能
- android平台使用java动态生成公私钥,并导出证书文件
- 基于 Apache Hudi 构建流批一体系统实践
- 二进制搜索算法_二进制搜索的一个扭曲故事
- X3950通过MGMT关机产生NMI,PCI,LOG报错
- 专访商汤联合创始人林达华:商汤的开源战略,从算法做起
- openbsd下实现双网卡负载均衡
- Redis 禁止使用耗时命令和时间复杂度为O(n)的命令
- 计算机图形学(一)——数据压缩:道格拉斯普克法
- 总结列表显示ListView知识点
- 《图解算法》学习笔记之快速排序
- php仿小红书,vue仿小红书个人开源项目
- matlab图片纹理特征直方图,常用的图像特征有颜色特征、纹理特征、形状特征、空间关系特征。...
- 图像特效之LOMO效果
- TCP协议--复位报文段
- 保弘实业|工资低的家庭要怎么进行投资理财
- php抢购问题,PHP并发抢购解决方案
- f2fs学习二:预分配
- 解决PL2303_Prolific U转串驱动在win64位系统下报error 10错误
- FPGA对定点数的处理 作业