【SpringMVC】(六)乱码问题

乱码问题


1.测试环境

  • index.jsp:编写一个表单

    <form action="/e/t1" method="post" >
        <input type="text" name="name">
        <input type="submit">
    </form>
    
  • Controller

    @Controller
    public class EncodingController {
    
        @PostMapping("/e/t1")
        public String test1(String name, Model model) {
            model.addAttribute("msg", name);
            return "test";
        }
    
    }
    
  • test.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    ${msg}
    </body>
    </html>
    


2.以前的办法:自定义简单过滤器

  • EncodingFilter.java

    @WebFilter("/*") //注意servlet导入依赖版本一定是3.0及以上的
    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() {
    
        }
    }
    

3.解决办法一:SpringMVC提供的过滤器

  • 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>
    
    url-pattern为/和/*的区别:
    1./会匹配请求,不会匹配*.jsp等后缀型url
    2./*会所有请求和后缀型的url
    

4.解决办法二:修改tomcat配置文件,设置编码

  • D:\Tomcat\apache-tomcat-8.5.39\apache-tomcat-8.5.39\conf\server.xml

    <Connector URIEncoding = "utf-8" port = "8080" protocol = "HTTP/1.1" connectionTimeout = "20000" redirectPort = "8443" />
    

5.解决办法三:终极自定义过滤器

  • GenericEncodingFilter.java

    public class GenericEncodingFilter implements Filter {
    
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        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 destroy() {
    
        }
    }
    
    //自定义request对象,HttpServletRequest的包装类
    class MyRequest extends HttpServletRequestWrapper {
    
        private HttpServletRequest request;
    
        //是否编码的标记
        private boolean hasEncode;
    
        //定义一个可以传入HttpServletRequest对象的构造函数,以便对其进行装饰
        public MyRequest(HttpServletRequest request) {
            super(request);
            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) {
                    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;
        }
    
    }
    
  • web.xml

    	<!--配置SpringMVC的乱码过滤-->
        <filter>
            <filter-name>encoding</filter-name>
            <filter-class>com.musecho.filter.GenericEncodingFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>encoding</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    
posted @ 2021-02-12 16:41  musecho  阅读(59)  评论(0)    收藏  举报