使用过滤器(Filter)解决请求参数中文乱码问题(复杂方式)
前述:

1 //第一种
2 //request.setCharacterEncoding(this.getServletContext().getInitParameter("charset"));
3 //备注:这种获取方式是因为在web.xml中进行了如下配置
4 <!-- 设置编码 -->
5 <context-param>
6 <param-name>charset</param-name>
7 <param-value>UTF-8</param-value>
8 </context-param>
9
10 //第二种
11 request.setCharacterEncoding("utf-8");

1 String value = request.getParameter("value");
2 if(value == null || value.trim().equals("")){
3 value="";
4 }
5 value = new String(value.getBytes("ISO-8859-1"),"utf-8");

1 <filter>
2 <filter-name>EncodingFilter</filter-name>
3 <filter-class>com.cqy.filter.EncodingFilter</filter-class>
4 </filter>
5
6 <filter-mapping>
7 <filter-name>EncodingFilter</filter-name>
8 <url-pattern>/*</url-pattern>
9 </filter-mapping>


1 package com.cqy.filter;
2
3 import java.io.IOException;
4
5 import javax.servlet.Filter;
6 import javax.servlet.FilterChain;
7 import javax.servlet.FilterConfig;
8 import javax.servlet.ServletException;
9 import javax.servlet.ServletRequest;
10 import javax.servlet.ServletResponse;
11 import javax.servlet.http.HttpServletRequest;
12 import javax.servlet.http.HttpServletResponse;
13
14 import com.cqy.domain.MyRequest;
15
16 public class EncodingFilter implements Filter {
17
18 @Override
19 public void destroy() {
20
21 }
22
23 @Override
24 public void doFilter(ServletRequest req, ServletResponse res,
25 FilterChain chain) throws IOException, ServletException {
26 // 将请求和响应强制转换成Http形式
27 HttpServletRequest request = (HttpServletRequest) req;
28 HttpServletResponse response = (HttpServletResponse) res;
29
30 // 处理响应乱码
31 response.setContentType("text/html;charset=utf-8");
32
33 // 自定义一个request对象:MyRequest,对服务器原来的requset进行增强,使用装饰设计模式
34 // 要增强原来的request对象,必须先获取到原来的request对象
35 MyRequest myRequest = new MyRequest(request);
36
37 // 注意:放行的时候应该传入增强后的request对象
38 chain.doFilter(myRequest, response);
39 }
40
41 @Override
42 public void init(FilterConfig arg0) throws ServletException {
43
44 }
45
46 }


1 package com.domain;
2
3 import java.io.UnsupportedEncodingException;
4 import java.util.Map;
5 import java.util.Set;
6
7 import javax.servlet.http.HttpServletRequest;
8 import javax.servlet.http.HttpServletRequestWrapper;
9
10 /**
11 * @author 继承HttpServletRequestWrapper相当于实现了HttpServletRequest
12 * HttpServletRequestWrapper类,它本身实现了所有HttpServletRequest的方法
13 * 继承它之后,需要修改的方法MyRequest可以自己定义,不需要修改的方法,直接使用父类的方法
14 *
15 * 第一步:总结:继承HttpServletRequestWrapper,为了偷懒,
16 * 不用自己去实现所有HttpServletRequest的方法 第二步:使用构造函数将原来的request对象保存到当前自定义对象中
17 * 第三步:针对要修改的方法,进行增强 第四步:定义一个flag标记,防止编码重复执行
18 */
19 public class MyRequest extends HttpServletRequestWrapper {
20
21 // 定义了一个成员变量,用来保存构造函数传入的requset对象
22 private HttpServletRequest request = null;
23
24 // 定义一个标记,用来标注:当前requset中,请求参数,是否已经编码过了
25 private boolean flag = false;
26
27 public MyRequest(HttpServletRequest request) {
28 super(request);
29 this.request = request;
30
31 }
32
33 // 总需求:对request对象的获取数据的方法,进行增强(统一编码)
34
35 @Override
36 public Map<String, String[]> getParameterMap() {
37 // 获得请求方式request.getMethod()方法
38 String method = this.request.getMethod();
39 // post请求
40 if ("post".equalsIgnoreCase(method)) {
41 // 设置编码格式
42 try {
43 request.setCharacterEncoding("utf-8");
44 } catch (UnsupportedEncodingException e) {
45 e.printStackTrace();
46 }
47 Map<String, String[]> map = this.request.getParameterMap();
48 return map;
49
50 } else if ("get".equalsIgnoreCase(method)) {
51 // get请求
52 // 分析:get请求需要对每一个参数都进行转换,因此需要对map中的每个元素进行遍历
53 // 首先获得map集合
54 Map<String, String[]> map = this.request.getParameterMap();
55
56 //第一次获取请求参数,flag==false,执行后面的额乱码处理动作
57 //第二次获取请求参数的时候,flag==true,不执行后面的处理,直接返回已经编码过的map集合
58 if (flag) {
59 return map;
60 }
61 if (map == null) {
62 return super.getParameterMap();
63 } else {
64 // 然后获得map集合的key
65 Set<String> key = map.keySet();
66 // 通过key将map中的元素取出来
67 for (String string : key) {
68 String[] value = map.get(string);
69 // 接下来需要将String中的每一个都进行遍历,转换参数
70 for (int i = 0; i < value.length; i++) {
71 try {
72 String string2 = new String(
73 value[i].getBytes("iso-8859-1"), "utf-8");
74 value[i] = string2;
75 } catch (UnsupportedEncodingException e) {
76 e.printStackTrace();
77 }
78 }
79 }
80 flag = true;
81 return map;
82 }
83 } else {
84 //位置请求方式,自定义对象处理不了,使用父类的方法处理
85 return super.getParameterMap();
86 }
87 }
88
89 @Override
90 public String[] getParameterValues(String name) {
91 // 通过map集合获取参数
92 Map<String, String[]> map = this.getParameterMap();
93 if (map == null) {
94 return super.getParameterValues(name);
95 } else {
96 String[] strings = map.get(name);
97 return strings;
98 }
99 }
100
101 @Override
102 public String getParameter(String name) {
103 // 通过values获取参数
104 String[] values = this.getParameterValues(name);
105 if (values == null) {
106 return super.getParameter(name);
107 } else {
108 return values[0];
109 }
110 }
111
112 }

使用过滤器(Filter)解决请求参数中文乱码问题(复杂方式)的更多相关文章
- SpringMVC 接收表单数据、数据绑定、解决请求参数中文乱码
接收表单数据有3种方式. 1.使用简单类型接收表单数据(绑定简单数据类型) 表单: <form action="${pageContext.request.contextPath}/u ...
- 详解get请求和post请求参数中文乱码的解决办法
首先出现中文乱码的原因是tomcat默认的编码方式是"ISO-8859-1",这种编码方式以单个字节作为一个字符,而汉字是以两个字节表示一个字符的. 一,get请求参数中文乱码的解 ...
- get请求和post请求参数中文乱码的解决办法
get请求参数中文乱码的解决办法 在tomcat的server.xml里的Connector加个URIEncoding="UTF-8",把 <Connector connec ...
- java web项目get,post请求参数中文乱码解决
[转载]原文地址:https://www.cnblogs.com/tom-plus/p/6392279.html 在开发过程中,有时候会碰到get,post请求参数中文乱码. 原因: Http请求传输 ...
- JSP中解决获取请求参数中文乱码问题
分两种情况: 1.获取访问请求参数时乱码 解决方法:构造一个新的String String user = new String(request.getParameter("user" ...
- 解决jmeter 请求参数中文乱码
今天在用jmeter 写脚本时发现查看结果树request post请求中文参数值是乱码,故记录下解决过程. 解决过程如下: 1.修改本地配置文件 因为此处的数据,还没有发送出去,所以,肯定是这个变量 ...
- Spring MVC的Post请求参数中文乱码的原因&处理
一.项目配置: Spring 4.4.1-RELEASE Jetty 9.3.5 JDK 1.8 Servlet 3.1.0 web.xml文件中没有配置编解码Filter 二.实际遇到的问题:客户端 ...
- Http GET 请求参数中文乱码
两种解决方式 第1种:代码里转换 String name = request.getParamter("name"); String nameUtf8 = new String(n ...
- jsp或Action获取请求参数中文乱码
普通情况下,中文字符会被自动转换成iso-8859-1的编码格式通过网络传输,而这种格式是没办法直接表示出我们认识的中文字符的,所以还要手动将他转换回之前的字符集. 一般在servlet或者actio ...
随机推荐
- 飞雪桌面日历软件 V8.6 免费绿色版
软件名称: 飞雪桌面日历软件软件语言: 简体中文授权方式: 免费软件运行环境: Win7 / Vista / Win2003 / WinXP / Win2008软件大小: 4MB图片预览: 软件简介: ...
- 表单提交是ajax提交,PC提交没问题但是手机提交就会一直跳到error,并且也没状态码一直是0
真是被自己蠢死了button标签他会自动提交刷新页面 <form id="baoming_from"> <p>请填写您的个人信息</p> < ...
- php编译错误:Cannot find OpenSSL's <evp.h>
yum install openssl openssl-devel ln -s /usr/lib64/libssl.so /usr/lib/
- error while loading shared libraries: libseaudit.so.4: cannot open shared object file: Error 40
安装共享库后要注意共享库路径设置问题, 如下: 1) 如果共享库文件安装到了/lib或/usr/lib目录下, 那么需执行一下ldconfig命令 ldconfig命令的用途, 主要是在默认搜寻目录( ...
- spring框架--IOC容器,依赖注入
思考: 1. 对象创建创建能否写死? 2. 对象创建细节 对象数量 action 多个 [维护成员变量] service 一个 [不需要维护公共变量] dao 一个 [不需要维护 ...
- 数组按时间(字符串->Date)排序
不说了 ,直接上代码.Talk is cheap , show me the code. NSArray *stortedArray = [wkSelf.dataArray sortedArrayUs ...
- Android自动测试之monkeyrunner工具
monkeyrunner工具 前言: 最近开始研究Android自动化测试方法,对其中的一些工具.方法和框架做了一些简单的整理,其中包括 android测试框架.CTS.Monkey.Monkeyr ...
- pudn下载地址的规律
A:http://download.pudn.com/downloads15/sourcecode/app/354278Cams.rar(随机数字6个)B:http://www.pudn.com/do ...
- Linux系统监控实用工具Glances
Linux系统监控实用工具Glances Glances安装 Glances安装要求:python >= 2.6 和 psutil >= 0.4.1 1.第一步,安装了python-> ...
- 第三十节,正则表达式re模块
正则表达式 正则表达式本身是一种小型的.高度专业化的编程语言,而在python中,通过内嵌集成re模块,程序员们可以直接调用来实现正则匹配.正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引 ...