gpt4 book ai didi

SpringMVC 中文乱码的解决方案

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章SpringMVC 中文乱码的解决方案由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

背景

举个例子,出现中文乱码的例子:提交表单的时候.

表单 。

?
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" ;
     }
}

结果:出现乱码 。

SpringMVC 中文乱码的解决方案

解决方案

使用自己写的过滤器

自定义一个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 。

最后此篇关于SpringMVC 中文乱码的解决方案的文章就讲到这里了,如果你想了解更多关于SpringMVC 中文乱码的解决方案的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com