栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JavaWeb(Servlet, SpringMVC, SSM)中文乱码问题总结

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JavaWeb(Servlet, SpringMVC, SSM)中文乱码问题总结

JavaWeb(Servlet, SpringMVC, SSM)中文乱码问题总结

参考:https://blog.csdn.net/qq_53037676/article/details/125907391

0. 太长不看版 0.1 Servlet
  • Post请求中文乱码解决

    • 方式1:
    //也可以使用
    request.setCharacterEncoding("utf-8");
    String username = request.getParameter("username");
    
    • 方式2:
    String username = request.getParameter("username");
    username  = new String(username.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8);
    
  • Get请求中文乱码解决

    • 解决方式
    String username = request.getParameter("username");
    username  = new String(username.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8);
    
0.2 SSM
  • 前端数据传后端乱码

    • web.xml中配置字符集过滤器
    
    
      encoding
      org.springframework.web.filter.CharacterEncodingFilter
      
        encoding
        utf-8
      
    
    
    
      encoding
      
    @WebServlet("/demo")
    public class RequestDemo4 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //1. 获取username
            String username = request.getParameter("username");
            System.out.println("解决乱码前:"+username);
    
            //2. GET,获取参数的方式:getQueryString
            // 乱码原因:tomcat进行URL解码,默认的字符集ISO-8859-1
               
            username  = new String(username.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8);
            System.out.println("解决乱码后:"+username);
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doGet(request, response);
        }
    }
    
    1.3 注意事项
    • 把request.setCharacterEncoding("UTF-8")代码注释掉后,会发现GET请求参数乱码解决方案同时也可也把POST请求参数乱码的问题也解决了
    • 只不过对于POST请求参数一般都会比较多,采用这种方式解决乱码起来比较麻烦,所以对于POST请求还是建议使用设置编码的方式进行
    • Tomcat8.0之后,已将GET请求乱码问题解决,设置默认的解码方式为UTF-8 ==> 也就是说对于Servlet中文乱码问题,只需设置request.setCharacterEncoding("UTF-8")即可
    2. SSM(SpringMVC)页面中文乱码问题 2.1 前端中文数据传入后端乱码 2.1.1 乱码问题

    项目结构:

    1. 新建一个maven项目,pom文件:

      
      
          4.0.0
      
          org.example
          ssmEncoding
          1.0-SNAPSHOT
      
          
              8
              8
              5.3.20
          
        
          
              
                  javax.servlet
                  javax.servlet-api
                  4.0.1
                  provided
              
      
              
                  javax.servlet.jsp
                  jsp-api
                  2.2.1-b03
                  provided
              
      
              
                  org.springframework
                  spring-webmvc
                  5.3.20
              
      
              
                  org.springframework
                  spring-tx
                  5.3.20
              
      
              
                  org.springframework
                  spring-jdbc
                  5.3.20
              
      
              
                  org.springframework
                  spring-context
                  5.3.20
              
          
      
      
    2. 添加web应用程序,web.xml代码:

      
      
      
          
              springmvc
              org.springframework.web.servlet.DispatcherServlet
              
                  contextConfigLocation
                  classpath:conf/dispatcherServlet.xml
              
              1
          
      
          
              springmvc
              /
          
      
      
      
    3. resources中新建conf文件夹,文件夹下新建dispatcherServlet.xml:

      
      
      
          
      
          
        
          
              
              
          
          
      
      
    4. 编写Controller类

      package com.st.Controller;
      
      import org.springframework.stereotype.Controller;
      import org.springframework.ui.Model;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.RequestMethod;
      
      @Controller
      public class Encoding {
          @RequestMapping(value = "/demo1", method = RequestMethod.POST)
          public String test(Model model, String name){
              System.out.println(name);
              model.addAttribute("name",name); //获取表单提交的值
              model.addAttribute("zw","中文测试"); //获取表单提交的值
              return "test"; //跳转到test页面显示输入的值
          }
      }
      
    5. index.jsp代码:

      
      
          $Title$
      
      
          

      test.jsp代码:

      
      
          Title
      
      
          name=${name};
          zw=${zw};
      
      
      
    6. 输入中文测试,发现乱码

    2.1.2 解决方式1:配置SpringMVC提供的过滤器

    ​ 向web.xml加入字符集过滤器:

    
    
    
    		
        
            encoding
            org.springframework.web.filter.CharacterEncodingFilter
            
                encoding
                utf-8
            
        
        
            encoding
            /*
        
    
    
        
            springmvc
            org.springframework.web.servlet.DispatcherServlet
            
                contextConfigLocation
                classpath:conf/dispatcherServlet.xml
            
            1
        
        
            springmvc
            /
        
    
    

    ​ 加入过滤器后,乱码问题解决:

    2.1.3 解决方式2:自定义过滤器

    ​ 方法1可以解决大部分乱码问题,但有些极端情况下,这个过滤器对get的支持不好。

    新建一个Filter:

    package com.st.Filter;
    
    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;
    import javax.servlet.http.HttpServletResponse;
    import java.io.File;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.util.Map;
    
    public class GenericEncodingFilter implements Filter {
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
        }
    
        @Override
        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);
        }
    
        @Override
        public void destroy() {
        }
    }
    //自定义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 {
                    // 处理post乱码
                    request.setCharacterEncoding("utf-8");
                    return request.getParameterMap();
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            } else if (method.equalsIgnoreCase("get")) {
                // get请求
                Map 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();
        }
      
        //取一个值
        @Override
        public String getParameter(String name) {
            Map parameterMap = getParameterMap();
            String[] values = parameterMap.get(name);
            if (values == null) {
                return null;
            }
            return values[0]; // 取回参数的第一个值
        }
    
        //取所有值
        @Override
        public String[] getParameterValues(String name) {
            Map parameterMap = getParameterMap();
            String[] values = parameterMap.get(name);
            return values;
        }
    }
    

    web.xml进行配置:

    
      encoding
      com.st.Filter.GenericEncodingFilter
    
    
      encoding
      /*
    
    

    中文结果测试

    2.2 后端中文数据传入前端乱码 2.2.1 乱码问题
    @RequestMapping("/demo2")
    public String test1(String username){
      String msg = "";
      if(username != null){
        System.out.println("check a1");
        if(username.equals("admin")){
          msg = "ok";
        }else{
          msg = "用户名有误";
        }
      }
      return msg;
    }
    

    运行结果:

    ​ 在SpringMVC中的Controller类中返回了一个中文字符串,在前端HTML页面显示"????"

    2.2.2 解决方法

    在SpringMVC中可以通过注解@RequestMapping中的Produces属性指定返回返回值的字符编码。

    @RequestMapping(value = "/demo2",produces = "text/html;charset=utf8")
    public String test1(String username){
      String msg = "";
      if(username != null){
        System.out.println("check a1");
        if(username.equals("admin")){
          msg = "ok";
        }else{
          msg = "用户名有误";
        }
      }
      return msg;
    }
    
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1031937.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号