解决Request获取请求数据中文乱码问题

 更新时间:2024年07月08日 11:21:32   作者:HuanLe.  
这篇文章主要介绍了Request获取请求数据中文乱码问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Tomcat在7以及更低版本时,解析中文的字符集默认为ISO-8859-1,并且是在底层写死的,所以浏览器发送Get请求或者时Post请求时,字符集格式不匹配,从而引发中文乱码。

但是Tomcat更新到8版本后,默认字符集就更换为了UTF-8。

一、当Request请求字母时,输出正常

package com.huanle.web;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
 
/**
 * @author 欢了
 * @version 1.0
 */
@WebServlet("/req3")
public class RequestDemo3 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("==========字母情况下===========");
        String username = request.getParameter("username");
        System.out.println(username);
    }
 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

启动Tomcat 在输入框 姓名里 输入字母abc

点击提交跳转到上面代码开始执行

控制台打印abc

一切正常

二、当Request请求参数为汉字时

启动Tomcat 在姓名框中输入中文 张三

跳转页面

看控制台的输出

输入的张三在控制台里呈现的就是乱码

三、使用伪代码了解乱码的形成

解决乱码问题之前,首先我们要了解乱码的形成。

我们写一个测试类,里面用到了URL编码,我们先了解一下;

URL编码

  • 1. 将字符串按照编码格式转为二进制
  • 2.每个字节转为2个16进制数,并在前面加上 %

例如 张三

假设浏览器给Tomcat发送的字符集格式为UTF-8,即编码格式为UTF-8;Tomcat也用UTF-8来接收,即解码格式也为UTF-8,那么就可以正常的接收到 "张三" 。

但是由于tomcat的默认解码是ISO-8859-1,并且还是底层是写死的,就只能走下面示例tomcatDecode对象(乱码)。

tomcatDecode对象直接转UTF-8虽然会出问题,但是底层的二进制是不会变的,我们就有了一个思路:

先将tomcatDecode的解码%E5%BC%A0%E4%B8%89 转为字节数组(-27 -68 -96 -28 -72 -119)

再将字节数组转为字符串。

package com.huanle.web;
 
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
 
/**
 * @author 欢了
 * @version 1.0
 *
 * 演示浏览器的URL编码 和 tomcat的URL解码
 * 以及解决默认tomcat字符集中文乱码
 */
public class UrlDemo {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String username = "张三";
 
        //URL编码
        String encode = URLEncoder.encode(username, "UTF-8");
        System.out.println(encode);//%E5%BC%A0%E4%B8%89
 
 
        //URL解码
        String decode = URLDecoder.decode(encode, "UTF-8");
        System.out.println(decode);//张三
 
        //但是tomcat的默认解码是ISO-8859-1,并且底层是写死的
        String tomcatDecode = URLDecoder.decode(encode, "ISO-8859-1");
        System.out.println(tomcatDecode);
 
        /**
         * 解决get请求的中文乱码
         *      将tomcat的乱码,先用tomcat默认的字符集ISO-8859-1转为字节数组  编码
         *      再将字节数组转为字符串  解码
         * */
        byte[] bytes = tomcatDecode.getBytes("ISO-8859-1");
        //可以先遍历看一下
        for (byte b : bytes) {
            System.out.print(b + " ");
        }//-27 -68 -96 -28 -72 -119 
        //换行
        System.out.println();
        //将这些十进制转为字符串
        String s = new String(bytes, "UTF-8");
        System.out.println(s);//张三
    }
}

最终的结果如下:

四、Request请求参数中文乱码-Post请求解决方案

讲完上面的案例,大家也就知道为什么中文会出现乱码了,我们就在代码中解决

因为Post是通过流的getReader()方法来传输数据,只需要改变流的编码格式为utf-8即可

我们需要用到一个方法 setCharacterEncoding(""); //这里的参数是编码格式

启动Tomcat 姓名为 张三

跳转页面后没有显示请求参数 ,所以是Post请求

package com.huanle.web;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
 
/**
 * @author 欢了
 * @version 1.0
 *
 * 中文乱码解决方案
 */
@WebServlet("/req4")
public class RequestDemo4 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.先解决乱码问题Post,因为Post是通过流getReader()方法 传输数据,改变流的编码格式为utf-8
        request.setCharacterEncoding("utf-8");
 
 
        //2.获取username
        System.out.println("==========获取username=========");
        String username = request.getParameter("username");
        System.out.println("解决后" + username);
 
    }
 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

输出正常! 解决~

五、Request请求参数中文乱码-Get请求解决方案

get请求就很像我们举得测试类里的例子

先将乱码的数据转成字节数组

再将字节数组转成字符串

package com.huanle.web;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
 
/**
 * @author 欢了
 * @version 1.0
 *
 * 中文乱码解决方案
 */
@WebServlet("/req4")
public class RequestDemo5 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
        //1.获取username
        System.out.println("==========获取username=========");
        String username = request.getParameter("username");
        System.out.println("解决前:" + username);
 
 
        //2.解决乱码问题Get Get是通过getQueryString
        //  乱码原因,tomcat进行URL解码的时候用的是ISO-8859-1的字符集,和页面字符集不匹配
        //  解决方案:
        //  2.1   先将乱码的数据转成字节数组
        //  2.2   再将字节数组转成字符串
        byte[] bytes = username.getBytes("ISO-8859-1");
        String s = new String(bytes, "UTF-8");
        System.out.println("解决后:" + s);
 
    }
 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

启动Tomcat

跳转页面,有显示参数,表明是Get请求

输出正常!解决~

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot使用validation-api实现对枚举类参数校验的方法

    SpringBoot使用validation-api实现对枚举类参数校验的方法

    这篇文章主要介绍了SpringBoot使用validation-api实现对枚举类参数校验,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Java concurrency集合之 CopyOnWriteArrayList_动力节点Java学院整理

    Java concurrency集合之 CopyOnWriteArrayList_动力节点Java学院整理

    这篇文章主要介绍了Java concurrency集合之 CopyOnWriteArrayList的相关资料,需要的朋友可以参考下
    2017-06-06
  • Java Gradle项目中的资源正确获取方式

    Java Gradle项目中的资源正确获取方式

    这篇文章主要介绍了Java Gradle项目中的资源正确获取方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • SpringBoot文件上传大小设置方式(yml中配置)

    SpringBoot文件上传大小设置方式(yml中配置)

    这篇文章主要介绍了SpringBoot文件上传大小设置方式(yml中配置),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Spring-ImportSelector接口功能使用案例

    Spring-ImportSelector接口功能使用案例

    ImportSelector接口是至spring中导入内部类或者外部类的核心接口,只需要其定义的方法内返回需要创建bean的class字符串就好了,这篇文章主要介绍了Spring-ImportSelector接口功能介绍,需要的朋友可以参考下
    2023-09-09
  • Java 8 的异步编程利器 CompletableFuture的实例详解

    Java 8 的异步编程利器 CompletableFuture的实例详解

    这篇文章主要介绍了Java 8 的异步编程利器 CompletableFuture 详解,本文通过一个例子给大家介绍下Java 8  CompletableFuture异步编程的相关知识,需要的朋友可以参考下
    2022-03-03
  • Java中的RPC框架Dubbo原理和机制详解

    Java中的RPC框架Dubbo原理和机制详解

    这篇文章主要介绍了Java中的RPC框架Dubbo原理和机制详解,Dubbo 是一款Java RPC框架,致力于提供高性能的 RPC 远程服务调用方案,作为主流的微服务框架之一,Dubbo 为开发人员带来了非常多的便利,需要的朋友可以参考下
    2024-01-01
  • 关于Hadoop的HDFS集群

    关于Hadoop的HDFS集群

    这篇文章主要介绍了关于Hadoop的HDFS集群,Hadoop 如何配置集群、不同的计算机里又应该有怎样的配置,这些问题是在学习中产生的。本章的配置中将会提供一个典型的示例,需要的朋友可以参考下
    2023-05-05
  • 用SpringBoot+Vue+uniapp小程序实现在线房屋装修管理系统

    用SpringBoot+Vue+uniapp小程序实现在线房屋装修管理系统

    这篇文章主要介绍了用SpringBoot+Vue+uniapp实现在线房屋装修管理系统,针对装修样板信息管理混乱,出错率高,信息安全性差,劳动强度大,费时费力等问题开发了这套系统,需要的朋友可以参考下
    2023-03-03
  • Java设计模式七大原则之里氏替换原则详解

    Java设计模式七大原则之里氏替换原则详解

    在面向对象的程序设计中,里氏替换原则(Liskov Substitution principle)是对子类型的特别定义。本文将为大家详细介绍Java设计模式七大原则之一的里氏替换原则,需要的可以参考一下
    2022-02-02

最新评论