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

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

测试步骤:

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

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

 <?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">
     <!--1.注册servlet-->
     <servlet>
         <servlet-name>SpringMVC</servlet-name>
         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
         <!--通过初始化参数指定SpringMVC配置文件的位置,进行关联-->
         <init-param>
             <param-name>contextConfigLocation</param-name>
             <param-value>classpath:springmvc-servlet.xml</param-value>
         </init-param>
         <!-- 启动顺序,数字越小,启动越早 -->
         <load-on-startup>1</load-on-startup>
     </servlet>
 
     <!--所有请求都会被springmvc拦截 -->
     <servlet-mapping>
         <servlet-name>SpringMVC</servlet-name>
         <url-pattern>/</url-pattern>
     </servlet-mapping>
     
     <!--过滤器解决乱码问题-->
     <filter>
         <filter-name>encoding</filter-name>
         <filter-class>com.xing.filter.EncodingFilter</filter-class>
     </filter>
     
     <filter-mapping>
         <filter-name>encoding</filter-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>Title</title>
 </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

 <?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">
     <!--1.注册servlet-->
     <servlet>
         <servlet-name>SpringMVC</servlet-name>
         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
         <!--通过初始化参数指定SpringMVC配置文件的位置,进行关联-->
         <init-param>
             <param-name>contextConfigLocation</param-name>
             <param-value>classpath:springmvc-servlet.xml</param-value>
         </init-param>
         <!-- 启动顺序,数字越小,启动越早 -->
         <load-on-startup>1</load-on-startup>
     </servlet>
 
     <!--所有请求都会被springmvc拦截 -->
     <servlet-mapping>
         <servlet-name>SpringMVC</servlet-name>
         <url-pattern>/</url-pattern>
     </servlet-mapping>
 
 
     <!--配置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>
 
 </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中配置这个过滤器即可!

 <?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">
     <!--1.注册servlet-->
     <servlet>
         <servlet-name>SpringMVC</servlet-name>
         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
         <!--通过初始化参数指定SpringMVC配置文件的位置,进行关联-->
         <init-param>
             <param-name>contextConfigLocation</param-name>
             <param-value>classpath:springmvc-servlet.xml</param-value>
         </init-param>
         <!-- 启动顺序,数字越小,启动越早 -->
         <load-on-startup>1</load-on-startup>
     </servlet>
 
     <!--所有请求都会被springmvc拦截 -->
     <servlet-mapping>
         <servlet-name>SpringMVC</servlet-name>
         <url-pattern>/</url-pattern>
     </servlet-mapping>
     
     <!--过滤器解决乱码问题-->
     <filter>
         <filter-name>encoding</filter-name>
         <filter-class>com.xing.filter.GenericEncodingFilter</filter-class>
     </filter>
 
     <filter-mapping>
         <filter-name>encoding</filter-name>
         <!--过滤所有请求-->
         <url-pattern>/*</url-pattern>
     </filter-mapping>
 </web-app>

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

posted @   暴躁C语言  阅读(52)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示