使用过滤器(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 ...
随机推荐
- Python 学习笔记10
念念不忘,必有回响. 今天继续学习Python 类.
- arguments对象,caller 和 callee
arguments对象是比较特别的一个对象,arguments非常类似Array,但实际上又不是一个Array实例. 它指的是函数对象里的参数,且只能在函数内部使用. 使用 检测函数的参数个数,引用属 ...
- treecnt
treecnt ﹡ LH (命题人) 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 给定一棵n个节点的树,从1到n标号.选择k个点,你需要选择一些边使得这k个点通过选择 ...
- maven下载,安装与eclipse中maven配置
1.maven下载.安装与环境变量配置 http://blog.csdn.net/jiuqiyuliang/article/details/45390313 2.Eclipse中maven的配置 ht ...
- The first to Python
今天在51cto购买了python教程,今后在这里记录我python的点点滴滴,感谢博客园给予的平台,感谢51cto给予的机会,感谢导师.
- Hbase查看
Client HBase Client使用HBase的RPC机制与HMaster和HRegionServer进行通信,对于管理类操作,Client与HMaster进行RPC:对于数据读写类操作,Cli ...
- 还原openstack配置文件的方法
cp -a /etc/neutron/neutron.conf /etc/neutron/neutron.conf.bakcp -a /etc/neutron/plugins/ml2/ml2_conf ...
- ubuntu/linux 下 git 通过代理下载数据 (最简单的方式)
git国内访问较慢,走代理较快. 方法:git config --global http.proxy http://proxyuser:proxypwd@proxy.server.com:port_n ...
- python+appium使用记录
最近在研究appium+appiumlibrary移动端的两个自动化测试库,特此将使用过程,粗略记录一下 1.环境搭建,略,自行百度. 2.查看apk包名及activity方法,自行百度. 3.基本步 ...
- ob_get_contents()
ob_start();//buf1 echo 'multiple'; ob_start();//buf2 echo 'bufferswork'; $buf2 = ob_get_contents(); ...