中文字符乱码过滤器
介绍
在JavaWeb开发中,自己编写一个过滤器,来解决的全站的中文乱码问题。注意:在对request对象进行增强时,必须重写它的3个方法
① getParameter(String name)
② getParameterValues(String name)
③ getParameterMap()
案例
(1)CharacterEncodingFilter.java
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134package cn.itcast.filter; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Map; 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.HttpServletRequestWrapper; /** * 说明:全站字符乱码过滤器 * 注意:过滤器编写好后,需要去web.xml文件中配置才能使用,在默认情况下,服务器启动时创建过滤器对象 * 特点:可以解决HTTP请求(GET & POST)提交给服务器的数据出现乱码的问题 * 思路: * ①动态代理 * ②使用HttpServletRequestWrapper类(本案例采用的是它) */ public class CharacterEncodingFilter implements Filter { private String charset; public void destroy(){} public void init(FilterConfig filterConfig) throws ServletException { charset = filterConfig.getInitParameter("charset"); //从web.xml文件内的当前过滤器配置中获取设置的字符编码参数 charset = (charset==null? "UTF-8" : charset); //若没有在web.xml文件中配置,则charset值设置为UTF-8 } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding(charset); //为request对象设置码表 PowerRequest powerRequest = new PowerRequest((HttpServletRequest)request); //创建request对象的包装对象(一个对request对象进行增强的对象) chain.doFilter(powerRequest, response); //对请求进行放行 } } //--------------------------------------------------------------------------------------------------------------------------------------------------- /** * 说明: * ①在JavaEE规范中专门提供了一个采用装饰设计模式的类HttpServletRequestWrapper * ②在HttpServletRequestWrapper类的内部,其实已经定义了一个类型为HttpServletRequest的成员变量 * ③在HttpServletRequestWrapper类中的所有方法,其实都是使用它内部的HttpServletRequest类型的成员变量去掉用的 * ④该HttpServletRequestWrapper类的作用就是专门提供给程序使用的,程序员用来重写其某些方法,从而达到"增强请求对象"的目的 * * 思路:通过自己编写一个类来继承HttpServletRequestWrapper,然后重写该类的某些方法,从而达到解决中文乱码问题 */ class PowerRequest extends HttpServletRequestWrapper { private String charset; //构造函数 public PowerRequest(HttpServletRequest request) { super(request); charset = super.getCharacterEncoding(); //若之前有人为的设置过request对象的编码,则获取成功,否则获取为null charset = (charset == null? "ISO-8859-1" : charset); } @Override public String getParameter(String name) { if("GET".equalsIgnoreCase(super.getMethod())) { String data = super.getParameter(name); //获取请求参数数据 if(data != null) { try { data = new String(data.getBytes("ISO-8859-1"), charset); } catch(UnsupportedEncodingException e) { throw new RuntimeException(e); } } return data; } return super.getParameter(name); } @Override public String[] getParameterValues(String name) { if("GET".equalsIgnoreCase(super.getMethod())) { String[] values = super.getParameterValues(name); for(int i=0; values!=null && i<values.length; i++) { try { values[i] = new String(values[i].getBytes("ISO-8859-1"), charset); } catch(UnsupportedEncodingException e) { throw new RuntimeException(e); } } return values; } return super.getParameterValues(name); } @Override public Map getParameterMap() { if("GET".equalsIgnoreCase(super.getMethod())) { Map<String,String[]> map = super.getParameterMap(); if(map != null) { for(Map.Entry<String,String[]> me : map.entrySet()) { String[] values = me.getValue(); for(int i=0; values!=null && i<values.length; i++) { try { values[i] = new String(values[i].getBytes("ISO-8859-1"), charset); } catch(UnsupportedEncodingException e) { throw new RuntimeException(e); } } } } return map; } return super.getParameterMap(); } }
(2)web.xml
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15<filter> <description>中文字符乱码过滤器</description> <display-name>CharacterEncodingFilter</display-name> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>cn.itcast.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>charset</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
最后
以上就是单身寒风最近收集整理的关于中文乱码过滤器(用于解决全站中文字符乱码的过滤器) 中文字符乱码过滤器的全部内容,更多相关中文乱码过滤器(用于解决全站中文字符乱码的过滤器) 内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复