热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

2022.7.30乱码问题(一般使用mvc自己配置的过滤器)

乱码问题(一般使用mvc自己配置的过滤器)测试步骤:1、我们可以在首页编写一个提交的表单 

乱码问题(一般使用mvc自己配置的过滤器)

测试步骤:

1、我们可以在首页编写一个提交的表单

 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 <html>
 <head>
     <title>Titletitle>
 head>
 <body>
 <form action="/t" method="post">
     <input type="text" name="username">
     <input type="submit">
 form>
 body>
 html>
 

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

 package com.xing.controller;
 
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.PostMapping;
 
 @Controller
 public class Encoding {
     @PostMapping("/t")   //表单提交是post方式
     public String test(Model model, String username){
         model.addAttribute("msg",username); //获取表单提交的值
         return "test"; //跳转到test页面显示输入的值
    }
 }
 
 

 

 

提交到了/t请求

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

 

 

不得不说,乱码问题是在我们开发中十分常见的问题,也是让我们程序猿比较头大的问题!

使用自己配置的过滤器

EncodingFilter

 package com.xing.filter;
 
 import javax.servlet.*;
 import java.io.IOException;
 
 /**
  * @program: SpringMVC
  * @Date: 2022/07/11
  * @author: 16159
  * @description:
  * @Modified By:
  **/
 public class EncodingFilter implements Filter {
 
     @Override
     public void init(FilterConfig filterConfig) throws ServletException {
         
    }
 
     @Override
     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
         servletRequest.setCharacterEncoding("utf-8");
         servletResponse.setCharacterEncoding("utf-8");
         
         filterChain.doFilter(servletRequest,servletResponse);
    }
 
     @Override
     public void destroy() {
 
    }
 }
 

web.xml

 version="1.0" encoding="UTF-8"?>
 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
          version="4.0">
     
     <servlet>
         <servlet-name>SpringMVCservlet-name>
         <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
         
         <init-param>
             <param-name>contextConfigLocationparam-name>
             <param-value>classpath:springmvc-servlet.xmlparam-value>
         init-param>
         
         <load-on-startup>1load-on-startup>
     servlet>
 
     
     <servlet-mapping>
         <servlet-name>SpringMVCservlet-name>
         <url-pattern>/url-pattern>
     servlet-mapping>
     
     
     <filter>
         <filter-name>encodingfilter-name>
         <filter-class>com.xing.filter.EncodingFilterfilter-class>
     filter>
     
     <filter-mapping>
         <filter-name>encodingfilter-name>
         
         <url-pattern>/*url-pattern>
     filter-mapping>
 
 web-app>

还是乱码

 

将post改为get方法

form.jsp

 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 <html>
 <head>
     <title>Titletitle>
 head>
 <body>
 <form action="/t" method="get">
     <input type="text" name="username">
     <input type="submit">
 form>
 body>
 html>
 

Encoding

 package com.xing.controller;
 
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.GetMapping;
 
 @Controller
 public class Encoding {
     @GetMapping("/t")   //表单提交是get方式
     public String test(Model model, String username){
         model.addAttribute("msg",username); //获取表单提交的值
         return "test"; //跳转到test页面显示输入的值
    }
 }
 
 

乱码解决

使用springmvc自配的过滤器

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

web.xml

 version="1.0" encoding="UTF-8"?>
 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
          version="4.0">
     
     <servlet>
         <servlet-name>SpringMVCservlet-name>
         <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
         
         <init-param>
             <param-name>contextConfigLocationparam-name>
             <param-value>classpath:springmvc-servlet.xmlparam-value>
         init-param>
         
         <load-on-startup>1load-on-startup>
     servlet>
 
     
     <servlet-mapping>
         <servlet-name>SpringMVCservlet-name>
         <url-pattern>/url-pattern>
     servlet-mapping>
 
 
     
     <filter>
         <filter-name>encodingfilter-name>
         <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
         <init-param>
             <param-name>encodingparam-name>
             <param-value>utf-8param-value>
         init-param>
     filter>
     <filter-mapping>
         <filter-name>encodingfilter-name>
         <url-pattern>/*url-pattern>
     filter-mapping>
 
 web-app>

最终极解决乱码方法

但是我们发现 , 有些极端情况下,这个过滤器对get的支持不好 .

处理方法 :

1、修改tomcat配置文件 :设置编码!

D:\ruanjian\environment\apache-tomcat-9.0.62\conf\server.xml

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

 

 

2、自定义过滤器

 package com.xing.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 {
 
    @Override
    public void destroy() {
  }
   
     @Override
     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);
    }
 
    @Override
    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 {
                // 处理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();
  }
 
    //取一个值
    @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;
  }
 }

这个也是我在网上找的一些大神写的,一般情况下,SpringMVC默认的乱码处理就已经能够很好的解决了!

然后在web.xml中配置这个过滤器即可!

 version="1.0" encoding="UTF-8"?>
 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
          version="4.0">
     
     <servlet>
         <servlet-name>SpringMVCservlet-name>
         <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
         
         <init-param>
             <param-name>contextConfigLocationparam-name>
             <param-value>classpath:springmvc-servlet.xmlparam-value>
         init-param>
         
         <load-on-startup>1load-on-startup>
     servlet>
 
     
     <servlet-mapping>
         <servlet-name>SpringMVCservlet-name>
         <url-pattern>/url-pattern>
     servlet-mapping>
     
     
     <filter>
         <filter-name>encodingfilter-name>
         <filter-class>com.xing.filter.GenericEncodingFilterfilter-class>
     filter>
 
     <filter-mapping>
         <filter-name>encodingfilter-name>
         
         <url-pattern>/*url-pattern>
     filter-mapping>
 web-app>

乱码问题,需要平时多注意,在尽可能能设置编码的地方,都设置为统一编码 UTF-8!



推荐阅读
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 本文讨论了如何根据特定条件动态显示或隐藏文件上传控件中的默认文本(如“未选择文件”)。通过结合CSS和JavaScript,可以实现更灵活的用户界面。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 本文探讨了如何在 PHP 的 Eloquent ORM 中实现数据表之间的关联查询,并通过具体示例详细解释了如何将关联数据嵌入到查询结果中。这不仅提高了数据查询的效率,还简化了代码逻辑。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 本文探讨了dbforms框架的核心设计理念及其背后的技术原理,详细分析了该框架如何通过其独特的设计模式来简化开发流程,并为开发者提供了优化使用方法的建议。 ... [详细]
  • 本文探讨了在 ASP.NET MVC 5 中实现松耦合组件的方法。通过分离关注点,应用程序的各个组件可以更加独立且易于维护和测试。文中详细介绍了依赖项注入(DI)及其在实现松耦合中的作用。 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • 深入理解ASP.NET MVC中的_ViewStart.cshtml
    本文介绍了_ViewStart.cshtml文件在ASP.NET MVC 3.0及以上版本中的作用和使用方法。该文件位于Views目录下,主要用于统一配置视图布局和其他全局设置。 ... [详细]
  • FineUI 是一款基于 jQuery 的专业级控件库,专为 ASP.NET WebForms 和 MVC 开发设计。它提供了丰富的用户界面组件,简化了复杂 Web 应用程序的开发过程。 ... [详细]
  • Struts与Spring框架的集成指南
    本文详细介绍了如何将Struts和Spring两个流行的Java Web开发框架进行整合,涵盖从环境配置到代码实现的具体步骤。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • Java项目分层架构设计与实践
    本文探讨了Java项目中应用分层的最佳实践,不仅介绍了常见的三层架构(Controller、Service、DAO),还深入分析了各层的职责划分及优化建议。通过合理的分层设计,可以提高代码的可维护性、扩展性和团队协作效率。 ... [详细]
  • 深入理解Vue.js:从入门到精通
    本文详细介绍了Vue.js的基础知识、安装方法、核心概念及实战案例,帮助开发者全面掌握这一流行的前端框架。 ... [详细]
  • Redux入门指南
    本文介绍Redux的基本概念和工作原理,帮助初学者理解如何使用Redux管理应用程序的状态。Redux是一个用于JavaScript应用的状态管理库,特别适用于React项目。 ... [详细]
author-avatar
伴生约定_879
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有