使用过滤器(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 ...
随机推荐
- AltiumDesigner14绘制四层板设置
1,快捷键(O+K)进入板层设置界面: 2,选择AddLayer,里边有两个选项(add layer(添加信号层)||add internal plane(增加平面)) 四层板的话一般层次的划分是t ...
- __doPostBack初识
周五在公司看到有看到Request.Params["__EVENTARGUMENT"]的代码不解,不解遂上网查找,发现一篇文章<Understanding the JavaS ...
- SPOJ 705 New Distinct Substrings
后缀数组.按照排序完的后缀一个一个统计.每一个后缀对答案做出的贡献为:n-SA[i]-height[i]. #pragma comment(linker, "/STACK:102400000 ...
- iOSNSDate的相关操作
//获取当前时间 时间根据格林威治时间显示 //时间 8小时 英国格林威治 7小时 NSDate *date = [NSDate date]; NSLog(@"%@",date ...
- VNC VIEWER的使用集锦
关于颜色深度的问题, 今天用VNC Viewser ,连上去之后,发现色彩可能只有8或者16位 然后修改了 sever的depth,也不好使, 于是,就修改了 client的 colourlevel ...
- allegro 导Gerber文件
今天抽空好好整理了一下有关Allegro出Gerber文件文档,此文档在网上搜到的基础上进一步完善,把每个需要注意的地方都用红色字体框出 http://files.cnblogs.com/files/ ...
- 二分图匹配之KM求二分图最佳匹配算法
参考网址:http://blog.163.com/suntroop@yeah/blog/static/17012103120115185927194/ 对于具有二部划分( V1, V2 )的加权完全二 ...
- android网络编程之HttpUrlConnection的讲解--DownLoadManager基本用法
1.DownLoadManager是Android用系统服务(Service)的方式来优化处理长时间的下载操作的一个工具类.避免了我们去处理多线程,通知栏等等. 2.不要忘记添加权限 <uses ...
- Eclipse中配置weka,以及添加算法
Eclipse中配置weka 1 找到weka的安装位置,寻找weka的压缩文件weka-src.jar,将压缩文件解压,解压出的文件夹weka-src. 2 打开Eclipse,新建Java pro ...
- malloc without free, what happens?
It's per-process. Once your process exits, the allocated memory is returned to the OS for use by oth ...