好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

     }

}

结果:出现乱码

解决方案

使用自己写的过滤器

自定义一个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 中文乱码的解决方案的详细内容...

  阅读:27次