背景
举个例子,出现中文乱码的例子:提交表单的时候。
表单
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