• 乱码问题解决


    一、乱码问题

    测试步骤:
    沿用上一篇博客项目!

    1.1、编写一个提交的表单

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <form action="/e/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

    1.2、后台编写对应的处理类

    package com.massimo.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.PostMapping;
    
    @Controller
    public class EncodingController {
    
        @PostMapping("/e/t1")
        public String test1(String name , Model model){
            model.addAttribute("msg" , name);
            return "hello";
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    1.3、输入中文测试,发现乱码

    在这里插入图片描述
    在这里插入图片描述

    二、解决

    2.1、方式一:过滤器

    编写过滤器:

    package com.massimo.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() {
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    注册:

    <filter>
            <filter-name>encoding</filter-name>
            <filter-class>com.massimo.filter.EncodingFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>encoding</filter-name>
            <url-pattern>/</url-pattern>
        </filter-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    测试:
    在这里插入图片描述
    发现还是不能解决,但是将提交方式改为get,测试结果如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    2.2、方式二:

    以前乱码问题通过过滤器解决,而SpringMVC给我们提供了一个过滤器,可以在web.xml中配置。

    首先删除上面编写的过滤器,及其注册!

    在web.xml中配置如下:

        <!--配置SpringMVC的乱码过滤器-->
        <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

    get方式测试如下:
    在这里插入图片描述

    post方式测试如下:
    在这里插入图片描述
    发现采用post方式提交,还是乱码!
    改进:
    在这里插入图片描述
    测试:
    在这里插入图片描述
    问题解决。

    2.3、方式三:

    修改Tomcat配置文件:设置编码
    在这里插入图片描述
    自定义过滤器:

    package com.massimo.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;
    
    //解决get和post请求全部乱码的过滤器
    public class GenericEncodingFilter implements Filter {
    
        public void destroy(){
        }
    
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            //处理response的字符编码
            HttpServletResponse myResponse = (HttpServletResponse) servletResponse;
            myResponse.setContentType("text/html;charset=UTF-8");
    
            //转型为协议相关对象
            HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
            //对request包装增强
            HttpServletRequest myRequest = new MyRequest(httpServletRequest);
            filterChain.doFilter(myRequest,servletResponse);
        }
    
        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;
        }
    
        //对需要增强方法 进行覆盖
        @Override
        public Map getParameterMap() {
            //鲜活的请求方式
            String method = request.getMethod();
            if (method.equalsIgnoreCase("post")){
                //post请求
                try {
                    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 {
                                    values[i] = new String(values[i]
                                    .getBytes("ISO-8859-1"),"utf-8");
                                } catch (UnsupportedEncodingException e) {
                                    e.printStackTrace();
                                }
                            }
                        }
                    }
                    hasEncode = true;
                }
                return parameterMap;
            }
            return super.getParameterMap();
        }
    
        //取一个值
        @Override
        public String getParameter(String name) {
            Map<String , String[]> parameterMap = getParameterMap();
            String[] values = parameterMap.get(name);
            if (values == null){
                return null;
            }
            return values[0];//取回参数的第一个值
        }
    
        //取所有值
        @Override
        public String[] getParameterValues(String name) {
            Map<String,String[]> parameterMap = getParameterMap();
            String[] values = parameterMap.get(name);
            return values;
        }
    }
    
    
    • 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

    注册:

    <filter>
            <filter-name>encoding</filter-name>
            <filter-class>com.massimo.filter.GenericEncodingFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>encoding</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    测试:
    在这里插入图片描述
    可以发现用这种方式,不论是get还是post请求都可以处理乱码!

  • 相关阅读:
    [GYCTF2020]Ezsqli-1|SQL注入
    __builtin_return_address()函数的使用方法
    前端进阶特训营-TDD制造rollup-0
    ubuntu 22.04安装cuda、cudnn、conda、pytorch
    JVM—Class类文件结构详解
    【LeetCode每日一题】【递归/位运算】2022-10-20 779. 第K个语法符号 Java实现
    【ArcGIS模型构建器】05:批量为多个矢量数据添加相同的字段
    第七第八mooc+循环练习
    第四次作业
    TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension “.ts“ for xxx
  • 原文地址:https://blog.csdn.net/Massimo__JAVA/article/details/125556523