JAVA反射(四)之动态代理解决全局乱码问题
来源:互联网 发布:苏州博奕思网络 编辑:程序博客网 时间:2024/05/21 08:04
乱码出现的原因
在我们向服务端到客户端,或者相反,传送或者接收数据时候,如果编码解码不一致,就会出现乱码现象;
常见的几种中文编码格式: GB2312,iso-8859-1,UTF-8,GBK
Tomcat 默认的编码格式为:iso-8859-1
解决思路
解决乱码有很多办法,比如修改tomcat中config下面的web.xml文件,或者直接在接收发送的servlet中指定编码(麻烦,不推荐,每个servlet都要写重复的代码).
我今天向大家介绍动态代理解决全局乱码:
思路:
1.实现与HttpServletRequest相同接口的代理对象
2.在程序运行过程中对getParameter(String name)方法进行修改前逻辑的增强.
3.返回一个增强的HttpServletRequest对象
代码实现
总体视图
package com.tangbaobao.code;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.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/***@author 唐学俊*@Version 2017年11月18日上午8:58:10*使用动态代理来解决全局乱码问题*/public class CodeFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //增强request,response HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse resp = (HttpServletResponse) response; req = EnhanceRequest(req); //放行 chain.doFilter(req, response); } private HttpServletRequest EnhanceRequest(HttpServletRequest req) { //获取Proxy代理对象 HttpServletRequest EnhanceReq = (HttpServletRequest) Proxy.newProxyInstance( req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //获取对象方法 String name = method.getName(); if(name.equals("getParameter")) { //获取乱码的字符串 String invoke = (String) method.invoke(req, args); invoke = new String(invoke.getBytes("iso-8859-1"),"UTF-8"); return invoke; } return method.invoke(req, args); } } ); return EnhanceReq; }}
package com.tangbaobao.code;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/***@author 唐学俊*@version 2017年11月18日上午9:44:14*接收客户端传递过来的表单*/public class IndexServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); System.out.println(username); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}
<%--客户端提交表单数据 --%><%@ 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>Insert title here</title></head><body><form action="${pageContext.request.contextPath }/index" method = "post"> <input type ="text" name ="username"> <input type = "submit" value = "提交"></form></body></html>
总结
相对传统的增强方法,使用动态代理解决全局乱码很方便;在使用以上方法解决全局乱码,记得把Filter作用域配置 /*,并且jsp页面的编码格式和workspace的编码格式都修改与你的理想编码格式一致;
<filter-mapping> <filter-name>CodeFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
阅读全文
0 0
- JAVA反射(四)之动态代理解决全局乱码问题
- 动态代理解决全局乱码问题
- Java反射机制(四):动态代理
- javaEE动态代理解决乱码问题
- Java 反射之JDK动态代理
- JAVA 反射 总结 之 动态代理
- Java学习之反射机制---动态代理
- java反射应用之动态代理
- java反射之动态代理学习笔记
- JAVA反射(三)之动态代理
- 反射之动态代理
- Java 反射-动态代理
- java动态代理、反射
- Java动态代理(解决编码问题)
- 动态代理解决表单提交的中文乱码问题
- 动态代理解决中文乱码
- 通过动态代理完全解决GET/POST乱码<java过滤器>
- 黑马程序员之----------java 之反射与动态代理模式
- vue的v_else
- win10 使用系统自带windows powershell 计算MD5值
- [中国禅宗书画美学思想史纲].皮朝纲著.扫描版.pdf 免费下载
- leetcode练习(686) python实现
- C 语言编译时报错 request for member''in something not a structure or union
- JAVA反射(四)之动态代理解决全局乱码问题
- 如果父类存在带参数的构造函数,而你又没有在父类中添加空的构造函数 ,子类就要显示(super)的调用父类的构造函数。
- python For 循环 三种遍历方式
- 对象存储迎来爆发期 青云QingCloud有怎样的操作思路?
- mysql控制台闪退
- Centos 安装Redis
- 在本地配置一个apache域名的方法
- [学习笔记]Python基础_列表List
- Linux基础