热门标签 | 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!



推荐阅读
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 本文介绍了一种处理AJAX操作授权过期的全局方式,以解决Asp.net MVC中Session过期异常的问题。同时还介绍了基于WebImage的图片上传工具类。详细内容请参考链接:https://www.cnblogs.com/starluck/p/8284949.html ... [详细]
  • Python开源库和第三方包的常用框架及库
    本文介绍了Python开源库和第三方包中常用的框架和库,包括Django、CubicWeb等。同时还整理了GitHub中最受欢迎的15个Python开源框架,涵盖了事件I/O、OLAP、Web开发、高性能网络通信、测试和爬虫等领域。 ... [详细]
  • MVC设计模式的介绍和演化过程
    本文介绍了MVC设计模式的基本概念和原理,以及在实际项目中的演化过程。通过分离视图、模型和控制器,实现了代码的解耦和重用,提高了项目的可维护性和可扩展性。详细讲解了分离视图、分离模型和分离控制器的具体步骤和规则,以及它们在项目中的应用。同时,还介绍了基础模型的封装和控制器的命名规则。该文章适合对MVC设计模式感兴趣的读者阅读和学习。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 本文介绍了Sencha Touch的学习使用心得,主要包括搭建项目框架的过程。作者强调了使用MVC模式的重要性,并提供了一个干净的引用示例。文章还介绍了Index.html页面的作用,以及如何通过链接样式表来改变全局风格。 ... [详细]
  • 本文介绍了MVP架构模式及其在国庆技术博客中的应用。MVP架构模式是一种演变自MVC架构的新模式,其中View和Model之间的通信通过Presenter进行。相比MVC架构,MVP架构将交互逻辑放在Presenter内部,而View直接从Model中读取数据而不是通过Controller。本文还探讨了MVP架构在国庆技术博客中的具体应用。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • Asp.net Mvc Framework 七 (Filter及其执行顺序) 的应用示例
    本文介绍了在Asp.net Mvc中应用Filter功能进行登录判断、用户权限控制、输出缓存、防盗链、防蜘蛛、本地化设置等操作的示例,并解释了Filter的执行顺序。通过示例代码,详细说明了如何使用Filter来实现这些功能。 ... [详细]
  • 本文介绍了ASP.NET Core MVC的入门及基础使用教程,根据微软的文档学习,建议阅读英文文档以便更好理解,微软的工具化使用方便且开发速度快。通过vs2017新建项目,可以创建一个基础的ASP.NET网站,也可以实现动态网站开发。ASP.NET MVC框架及其工具简化了开发过程,包括建立业务的数据模型和控制器等步骤。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • 本文详细介绍了Python open()函数的用法,包括文件操作的流程和具体的打开模式。通过该函数,可以打开文件并进行读取、写入等操作。同时,还介绍了文件路径的两种形式和不同的打开模式。 ... [详细]
  • 本文讲述了作者从最初对软件工程的选择迷茫到逐渐喜欢并坚持学习的经历。作者在大学期间通过学习专业课和参与项目开发,不断挑战自己并取得成就感。虽然曾考虑过转专业和复读,但最终决定坚持学习软件工程,并为自己的未来努力奋斗。作者还提到了大学生活与自己最初的预期不同,但对此并没有太多抱怨。 ... [详细]
  • 使用J2SE模拟MVC模式开发桌面应用程序的工程包的介绍
    以我开发过的一个娱乐管理系统为例:下图为我系统的业务逻辑的MVC流程:下图为以Eclipse开发中各包的说明:转载于:https:blog ... [详细]
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社区 版权所有