当前位置: 首页 > news >正文

【Servlet篇】如何解决Request请求中文乱码的问题?

前言

前面一篇文章我们探讨了 Servlet 中的 Request 对象,Request 请求对象中封装了请求数据,使用相应的 API 就可以获取请求参数。

【Servlet篇】一文带你读懂 Request 对象

也许有小伙伴已经发现了前面的方式获取请求参数时,会出现中文乱码的情况,本文就是为了解决获取请求参数中文乱码的问题,本文以 POST 请求方式和 GET 请求方式为例,其他的请求方式类似,这里不再赘述。

问题引入

第一步:在 webapps 文件目录下创建 req.html ,在 HTML 添加表单,并且指定页面的请求方式为 get 。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><form action="/servlet-project/demo" method="get"><input type="text" name="username"><br><input type="password" name="password"><br><input type="checkbox" name="hobby" value="1"> 游泳<input type="checkbox" name="hobby" value="2"> 爬山 <br><input type="submit">
</form>
</body>
</html>

第二步:在 Servlet 获取参数并打印。

@WebServlet("/demo")
public class ServletDemo extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");System.out.println(username);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
}

第三步:启动服务器,在页面上输入中文。

在这里插入图片描述

第四步:查看控制台输出

image-20230210181009527

修改 form 表单中页面发送请求的方式为 post ,继续上面的步骤进行验证。我们发现,不管是 get 请求还是 post 请求,在发送的请求中如果存在中文,那么服务器接收到的数据都会出现中文乱码的情况,具体该如何解决这个问题呢?

POST请求的解决方案

出现中文乱码的情况的原因:

在 post 请求方式中,我们通过 request 对象的 getReader() 方法来获取流中的数据,其中,页面的编码方式为 UTF-8,而 TomCat 在获取流的时候采取的是 ISO-8859-1 的编码方式,而此方式是不支持中文的。由于编码和解码的方式不相同,ISO-8859-1 编码方式不支持中文,导致了控制台出现中文乱码的情况。

要想解决这个问题,我们只需要将页面的编码方式和 TomCat 在获取流数据之前的编码方式都设置为 UTF-8。通过下面的方式设置 TomCat 获取流对象之前的编码方式:

request.setCharacterEncoding("utf-8");

示例:

@WebServlet("/demo")
public class ServletDemo extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.解决中文乱码的问题//设置编码方式为utf-8request.setCharacterEncoding("utf-8");String username = request.getParameter("username");System.out.println(username);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);}
}

此时重新发送 post 请求就会在控制台正常展示中文结果。

我们已经解决了 post 请求中文乱码的问题,但是这个方法不适用于 get 请求,接下来我们探讨 get 请求中文乱码的解决方案。

GET请求的解决方案

在 post 请求方式中,使用流的方式获取请求数据,所以出现中文乱码后我们可以通过设置流的编码方式来解决,但是这样的方式并不适用于 get 请求方式,因为 get 请求使用的并不是流的方式来获取请求数据。get 请求方式获取数据:

request.getQueryString();

get 请求方式出现乱码的原因分析:

浏览器通过 HTTP 协议发送请求和数据到服务器,在这个过程中会对中文进行 URL 编码,编码的方式为页面指定的 UTF-8,服务器接收到这个编码的数据以后会按照 ISO-8859-1 的编码方式进行 URL 解码,由于前后编码的方式不同导致了中文乱码。ISO-8859-1 本身是不支持中文的,所以即使我们修改页面的编码方式为 ISO-8859-1 编码也不能解决中文乱码的问题。

image-20230210204128161

那么什么是 URL 编码,URL 解码呢?我们如何解决 get 请求方式中文乱码的问题?

URL 编码的大致过程是这样的,首先,将字符串按照编码的方式转换为二进制,然后每个字节转换为 2 个 16 进制的数据并在前面加上 %

示例:将 张三 进行 URL 编码

第一步:按照 UTF-8 的方式,找到张三两个汉字对应的十进制并转换为二进制

1110 0101 1011 1100 1010 0000 1110 0100 1011 1000 1000 1001

第二步:每个字节转换为 2 为 16 进制数,并且在前面加上 %

%E5%BC%A0%E4%B8%89

Java 中提供编码和解码的 API 工具类让我们更加快速的进行编码和解码的操作。

编码:

java.net.URLEncoder.encode("需要被编码的内容","字符集(UTF-8)")

解码:

java.net.URLDecoder.decode("需要被解码的内容","字符集(UTF-8)")

知道了乱码产生的原因,我们就来解决这个问题。

image-20230210203936986

从上图可以看出,不管使用哪一种字符集,其对应的 %E5%BC%A0%E4%B8%89 都是相同的,即二进制数据是相同的,所以我们可以将乱码的数据转化为字节,再把字节转换为正确的中文汉字,在转换的过程中保证编码的一致,这样就解决了中文乱么的问题。具体实现步骤为:

  • 获取乱码数据对应的二进制数组
  • 按照 UTF-8 的形式获取二进制数据对应的字符串

示例:

public class URLDemo {public static void main(String[] args) throws UnsupportedEncodingException {String username = "张三";//1. URL编码String encode = URLEncoder.encode(username, "utf-8");System.out.println(encode);//2. URL解码String decode = URLDecoder.decode(encode, "ISO-8859-1");System.out.println(decode); //此处打印的是对应的乱码数据//3. 转换为字节数据,编码byte[] bytes = decode.getBytes("ISO-8859-1");for (byte b : bytes) {System.out.print(b + " ");}//此处打印的是:-27 -68 -96 -28 -72 -119//4. 将字节数组转为字符串,解码String s = new String(bytes, "utf-8");System.out.println(s); //此处打印的是张三}
}

回到开始的问题,解决 get 请求中请求参数的中文乱码问题:

@WebServlet("/demo")
public class ServletDemo extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String username = request.getParameter("username");System.out.println("解决乱码前:"+username);byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);username = new String(bytes, StandardCharsets.UTF_8);System.out.println("解决乱码后:"+username);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

同样,这种方式也适用于 post 请求方式解决中文乱码问题。

重点:在 TomCat 8 以后,get 请求方式的中文乱码的问题已经解决,其解决的思路就是官方将解码的方式由原来的 ISO-8859-1 转换为 UTF-8。所以,如果你的 Maven 坐标中配置的是 TomCat 8 以后的版本,get 请求方式不再出现乱码。


你问我青春还剩几年?我的回答是,趁现在,正当时。身边朋友都在问我怎样学好一门编程语言,怎样学好Java?怎样通过 Java 找到一份满意的工作?推荐学习此专栏:Java编程基础教程系列(零基础小白搬砖逆袭)

下期见。

相关文章:

【Servlet篇】如何解决Request请求中文乱码的问题?

前言 前面一篇文章我们探讨了 Servlet 中的 Request 对象&#xff0c;Request 请求对象中封装了请求数据&#xff0c;使用相应的 API 就可以获取请求参数。 【Servlet篇】一文带你读懂 Request 对象 也许有小伙伴已经发现了前面的方式获取请求参数时&#xff0c;会出现中文乱…...

SpringBoot:SpringBoot简介与快速入门(1)

SpringBoot快速入门1. SpringBoot简介2. SpringBoot快速入门2.1 创建SpringBoot项目&#xff08;必须联网&#xff0c;要不然创建失败&#xff0c;在模块3会讲到原因&#xff09;2.2 编写对应的Controller类2.3 启动测试3. Spring官网构建工程4. SpringBoot工程快速启动4.1 为什…...

RabbitMQ学习(十一):RabbitMQ 集群

一、集群1.1 为什么要使用集群前面我们介绍了如何安装及运行 RabbitMQ 服务&#xff0c;不过这些是单机版的&#xff0c;无法满足目前真实应用的 要求。如果 RabbitMQ 服务器遇到内存崩溃、机器掉电或者主板故障等情况&#xff0c;该怎么办&#xff1f;单台 RabbitMQ 服务器可以…...

学渣适用版——Transformer理论和代码以及注意力机制attention的学习

参考一篇玩具级别不错的代码和案例 自注意力机制 注意力机制是为了transform打基础。 参考这个自注意力机制的讲解流程很详细&#xff0c; 但是学渣一般不知道 key&#xff0c;query&#xff0c;value是啥。 结合B站和GPT理解 注意力机制是一种常见的神经网络结构&#xff0…...

网上这么多IT的培训机构,我们该怎么选?

说实话&#xff0c;千万不要把这个答案放在网上来找&#xff0c;因为你只能得到别人觉得合适的或者机构的广告&#xff1b;当然个人的培训经历可以听一听的&#xff0c;毕竟不靠谱的机构也有&#xff0c;比如让你交一两万去上线上课程或者一百号来人坐一起看视频&#xff0c;这…...

数据结构与算法—跳表(skiplist)

目录 前言 跳表 查询时间分析 1、时间复杂度 o(logn) 2、空间复杂度O(n) 动态插入和删除 跳表动态更新 跳表与红黑树比较 跳表实现 前言 二分查找用的数组 链表可不可以实现二分查找呢&#xff1f; 跳表 各方面性能比较优秀的动态数据结构&#xff0c;可以支持快速…...

【C++】5.C/C++内存管理

1.C/C内存管理 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] {1, 2, 3, 4};char char2[] "abcd";char* pChar3 "abcd";int* ptr1 (int*)malloc(sizeof (int)*4);int* ptr2 …...

一文让你彻底理解关于消息队列的使用

一、消息队列概述 消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用解耦&#xff0c;异步消息&#xff0c;流量削锋等问题&#xff0c;实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性架构。目前使用较多的消息队列有ActiveMQ&#xff0c;Rabbit…...

条件期望3

条件期望例题—连续发生的事情 连续地做二项实验, 每一次成功概率为p. 当连续k次成功时, 停止实验. 求停止实验时做的总实验次数的期望. 解: 错误解法 设NkN_kNk​为停止实验时做的总实验次数, 则 E[Nk]E[E[Nk∣Nk−1]]∑jk−1∞E[Nk∣Nk−1j]\begin{split} E[N_k] & E[E…...

第四届蓝桥杯省赛 C++ B组 - 翻硬币

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;蓝桥杯题解集合 &#x1f4dd;原题地址&#xff1a;翻硬币 &#x1f4e3;专栏定位&#xff1a;为想参加蓝桥杯的小伙伴整理常考算法题解&#xff0c;祝大家都…...

linux shell 入门学习笔记14 shell脚本+数学计算

概念 把复杂的命令执行过程&#xff0c;通过逻辑代码&#xff0c;组成一个脚本文件的方式就叫做shell脚本。 shebang #! /bin/bash #! /bin/perl #! /bin/python执行脚本的方式 source my_first.sh . my_first.shbash my_first.sh ./my_first.sh变量引用 ${var} 取出变量结果 …...

ESP32设备驱动-MAX30100心率监测传感器驱动

MAX30100心率监测传感器驱动 1、MAX30100介绍 MAX30100 是一款集成脉搏血氧饱和度和心率监测传感器解决方案。 它结合了两个 LED、一个光电探测器、优化的光学器件和低噪声模拟信号处理,以检测脉搏血氧饱和度和心率信号。 MAX30100 采用 1.8V 和 3.3V 电源供电,可通过软件…...

RTD2169芯片停产|完美替代RTD2169芯片|CS5260低BOM成本替代RTD2169方案设计

RTD2169芯片停产|完美替代RTD2169芯片|CS5260低BOM成本替代RTD2169方案设计 瑞昱的RTD2169芯片目前已经停产了&#xff0c; 那么之前用RTD2169来设计TYPEC转VGA方案的产品&#xff0c;该如何生产这类产品&#xff1f;且RTD2169芯片价格较贵&#xff0c;芯片封装尺寸是QFN40&…...

urho3d数据库

只有在启用以下两个构建选项之一时&#xff0c;数据库子系统才会构建到Urho3D库中&#xff1a;Urho3D_Database_ODBC和Urho3D-Database_SQLITE。当两个选项都启用时&#xff0c;URHO3D_DATABASE_ODBC优先。这些构建选项决定子系统将使用哪个数据库API。ODBC DB API更适用于本地…...

141. 周期

Powered by:NEFU AB-IN Link 文章目录141. 周期题意思路代码141. 周期 题意 一个字符串的前缀是从第一个字符开始的连续若干个字符&#xff0c;例如 abaab 共有 5个前缀&#xff0c;分别是 a&#xff0c;ab&#xff0c;aba&#xff0c;abaa&#xff0c;abaab。 我们希望知道一…...

Windows下命令执行绕过技巧总结(渗透测试专用)

一、连接符1、双引号不要求双引号闭合举例&#xff1a;"who"a"mi" //闭合的 "who"a"mi //不闭合的2、圆括号必须在两边&#xff0c;不能包括中间的字符。举例&#xff1a;((whoami))3、^符号&#xff08;转译符号&#xff09;不可以在结尾&…...

mindspore的MLP模型(多层感知机)

导入模块 import hashlib import os import tarfile import zipfile import requests import numpy as np import pandas as pd import mindspore import mindspore.dataset as ds from mindspore import nn import mindspore.ops as ops import mindspore.numpy as mnp from …...

【论文极速读】VQ-VAE:一种稀疏表征学习方法

【论文极速读】VQ-VAE&#xff1a;一种稀疏表征学习方法 FesianXu 20221208 at Baidu Search Team 前言 最近有需求对特征进行稀疏编码&#xff0c;看到一篇论文VQ-VAE&#xff0c;简单进行笔记下。如有谬误请联系指出&#xff0c;本文遵循 CC 4.0 BY-SA 版权协议&#xff0c;…...

Flask-Blueprint

Flask-Blueprint 一、简介 概念&#xff1a; Blueprint 是一个存储操作方法的容器&#xff0c;这些操作在这个Blueprint 被注册到一个应用之后就可以被调用&#xff0c;Flask 可以通过Blueprint来组织URL以及处理请求 。 好处&#xff1a; 其本质上来说就是让程序更加松耦合…...

png图片转eps格式

下载latex工具后 在要转换的png图片文件夹路径下&#xff0c;打开命令行窗口&#xff0c;输入以下命令&#xff1a; bmeps -c fig图片名.png 图片名.eps...

智能配置引擎如何攻克AMD黑苹果的三大技术壁垒

智能配置引擎如何攻克AMD黑苹果的三大技术壁垒 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 在黑苹果领域&#xff0c;AMD平台曾被视为技术禁区&…...

eMMC5.1协议详解:从CMD0到CSD寄存器,手把手教你读懂关键命令

eMMC5.1协议深度解析&#xff1a;关键命令与寄存器实战指南 在嵌入式存储领域&#xff0c;eMMC5.1协议作为主流存储解决方案的核心规范&#xff0c;其命令集与寄存器操作直接决定了设备性能与稳定性。本文将聚焦协议中最关键的CMD命令序列与CSD寄存器结构&#xff0c;通过实际示…...

vLLM-v0.17.1助力Java微服务:高并发下的模型推理集成方案

vLLM-v0.17.1助力Java微服务&#xff1a;高并发下的模型推理集成方案 1. 引言&#xff1a;当Java微服务遇见大模型推理 最近两年&#xff0c;大模型技术在企业应用中的落地速度远超预期。作为Java开发者&#xff0c;我们可能已经习惯了SpringBoot生态的舒适区&#xff0c;但当…...

基于LMS算法的16位SAR ADC中电容失配数字校正技术研究:Split ADC原理、MAT...

基于lms电容失配数字校正的16bit sar adc的split adc MATLAB可对比校正前后精度&#xff0c;原理基于国外论文&#xff0c;不支持。 适合进阶学习&#xff0c;想要对sar adc数字校正建模有了解的同学可以。SAR ADC设计里最头疼的就是电容失配问题。当工艺跑到16bit精度时&#…...

零成本体验软路由:京东云AX1800 Pro刷iStoreOS OpenWrt的完整教程(含空间扩容技巧)

京东云AX1800 Pro软路由改造全指南&#xff1a;从刷机到空间优化的实战手册 在智能家居和高速网络需求激增的今天&#xff0c;一台性能出色的路由器已成为家庭数字生活的核心枢纽。京东云AX1800 Pro作为一款性价比极高的Wi-Fi 6路由器&#xff0c;其硬件配置远超同价位产品——…...

终极指南:3步在3DS上原生运行GBA游戏,告别模拟器延迟!

终极指南&#xff1a;3步在3DS上原生运行GBA游戏&#xff0c;告别模拟器延迟&#xff01; 【免费下载链接】open_agb_firm open_agb_firm is a bare metal app for running GBA homebrew/games using the 3DS builtin GBA hardware. 项目地址: https://gitcode.com/gh_mirror…...

深入解析SD卡CMD指令集:从寄存器操作到数据传输实战

1. SD卡基础寄存器全解析 当你把一张SD卡插入读卡器时&#xff0c;系统瞬间就能识别出容量和型号&#xff0c;这个过程背后其实是SD卡内部寄存器的功劳。这些寄存器就像SD卡的"身份证"和"体检报告"&#xff0c;存储着所有关键信息。我刚开始接触嵌入式开发…...

Qwen-Image-2512-Pixel-Art-LoRA 跨界创作:生成像素风音乐专辑封面与海报

Qwen-Image-2512-Pixel-Art-LoRA 跨界创作&#xff1a;生成像素风音乐专辑封面与海报 最近在玩一个挺有意思的AI工具&#xff0c;叫Qwen-Image-2512-Pixel-Art-LoRA。名字有点长&#xff0c;但功能很直接&#xff0c;就是专门生成像素艺术。我琢磨着&#xff0c;像素风这种复古…...

Qwen3-ASR-1.7B与QT集成:开发跨平台语音识别桌面应用

Qwen3-ASR-1.7B与QT集成&#xff1a;开发跨平台语音识别桌面应用 1. 引言 想象一下&#xff0c;你正在开发一个需要语音输入功能的桌面应用。传统的语音识别方案要么需要联网调用云端API&#xff0c;要么识别准确率不够理想。现在&#xff0c;有了Qwen3-ASR-1.7B这个强大的开…...

EVA-01开发者案例:Qwen2.5-VL-7B集成至MAGI类AI平台实现多源视觉融合

EVA-01开发者案例&#xff1a;Qwen2.5-VL-7B集成至MAGI类AI平台实现多源视觉融合 1. 引言&#xff1a;当视觉AI遇见机甲美学 想象一下&#xff0c;你正在处理一份复杂的市场分析报告&#xff0c;里面混杂着数据图表、产品照片和手写笔记。传统的AI工具要么只能看文字&#xf…...