背景
举个例子,出现中文乱码的例子:提交表单的时候。
表单
1
2
3
4
5
6
7
8
9
10
11
12
|
<%@ page contentType="text/html;charset=UTF-8" language="java" %> < html > < head > < title >Title</ title > </ head > < body > < form action = "/c02/t1" method = "post" > < input type = "text" name = "name" > < input type = "submit" > </ form > </ body > </ html > |
业务控制类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
package controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class controllerDemo02 { @RequestMapping ( "/c02/t1" ) public String test1(String name, Model model){ System.out.println(name); model.addAttribute( "message" ,name); return "test" ; } } |
结果:出现乱码
解决方案
使用自己写的过滤器
自定义一个Filter过滤器,去过滤乱码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
package Filter; import javax.servlet.*; import java.io.IOException; public class EncodingFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletRequest.setCharacterEncoding( "utf-8" ); servletResponse.setCharacterEncoding( "utf-8" ); filterChain.doFilter(servletRequest,servletResponse); } public void destroy() { } } |
在web.xml中配置这个过滤器
1
2
3
4
5
6
7
8
|
< filter > < filter-name >EncodingFilter</ filter-name > < filter-class >Filter.EncodingFilter</ filter-class > </ filter > < filter-mapping > < filter-name >EncodingFilter</ filter-name > < url-pattern >/*</ url-pattern > </ filter-mapping > |
使用SpringMVC提供的过滤器
直接在web.xml中配置(固定的)
1
2
3
4
5
6
7
8
9
10
11
12
|
< filter > < filter-name >encoding</ filter-name > < filter-class >org.springframework.web.filter.CharacterEncodingFilter</ filter-class > < init-param > < param-name >encoding</ param-name > < param-value >utf-8</ param-value > </ init-param > </ filter > < filter-mapping > < filter-name >encoding</ filter-name > < url-pattern >/*</ url-pattern > </ filter-mapping > |
如果上面两种方法还实现不了,在试试以下这个方法,大神编写的
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
|
package Filter; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Map; public class GenericEncodingFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //处理response的字符编码 HttpServletResponse myResponse=(HttpServletResponse) response; myResponse.setContentType( "text/html;charset=UTF-8" ); // 转型为与协议相关对象 HttpServletRequest httpServletRequest = (HttpServletRequest) request; // 对request包装增强 HttpServletRequest myrequest = new MyRequest(httpServletRequest); chain.doFilter(myrequest, response); } public void init(FilterConfig filterConfig) throws ServletException { } } //自定义request对象,HttpServletRequest的包装类 class MyRequest extends HttpServletRequestWrapper { private HttpServletRequest request; //是否编码的标记 private boolean hasEncode; //定义一个可以传入HttpServletRequest对象的构造函数,以便对其进行装饰 public MyRequest(HttpServletRequest request) { super (request); // super必须写 this .request = request; } // 对需要增强方法 进行覆盖 public Map getParameterMap() { // 先获得请求方式 String method = request.getMethod(); if (method.equalsIgnoreCase( "post" )) { // post请求 try { // 处理post乱码 request.setCharacterEncoding( "utf-8" ); return request.getParameterMap(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } else if (method.equalsIgnoreCase( "get" )) { // get请求 Map<String, String[]> parameterMap = request.getParameterMap(); if (!hasEncode) { // 确保get手动编码逻辑只运行一次 for (String parameterName : parameterMap.keySet()) { String[] values = parameterMap.get(parameterName); if (values != null ) { for ( int i = 0 ; i < values.length; i++) { try { // 处理get乱码 values[i] = new String(values[i] .getBytes( "ISO-8859-1" ), "utf-8" ); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } } hasEncode = true ; } return parameterMap; } return super .getParameterMap(); } //取一个值 public String getParameter(String name) { Map<String, String[]> parameterMap = getParameterMap(); String[] values = parameterMap.get(name); if (values == null ) { return null ; } return values[ 0 ]; // 取回参数的第一个值 } //取所有值 public String[] getParameterValues(String name) { Map<String, String[]> parameterMap = getParameterMap(); String[] values = parameterMap.get(name); return values; } } |
以上就是SpringMVC 中文乱码的解决方案的详细内容,更多关于SpringMVC 中文乱码的资料请关注服务器之家其它相关文章!
原文链接:https://juejin.cn/post/6944667529717481485