Servlet中response、request乱码问题解决(转载)

如何用 OBProxy 实现 OceanBase 的最佳路由策略 本文基于业务中一类常见的路由问题展开,对OceanBase的路由功能及对应配置项做详细介绍,指导用户在业务实践中如何正确的配置路由策略及快速排查路由问题 阅读详情

此处转载 博主“续杯凉茶”的文章
链接:https://www.cnblogs.com/whgk/p/6412475.html

一、request请求参数出现的乱码问题

  • get请求:get请求的参数是在url后面提交过来的,也就是在请求行中

    MyServlet是一个普通的Servlet,浏览器访问它时,使用get请求方式提交了一个name=小明的参数值,在doGet中获取该参数值,并且打印到控制台,发现出现乱码

    出现乱码的原因:

    这里只能够代表经过一次编码例子,有些程序中,会将一个汉字或者一个字母用不同的码表连续编码几次,那么第一次编码还是上面所说的作用,第二次编码的话,就是将电脑能够认识的语言转换为电脑能够认识的语言(转换规则不同),那么该解码过程,就必须要经过两次解码,也就是编码的逆过程,下面这个例子就很好的说明了这个问题。

    浏览器使用的是UTF-8码表,通过http协议传输,http协议只支持IS0-8859-1,到了服务器,默认也是使用的是IS0-8859-1的码表,看图

在这里插入图片描述

也就是三个过程,经历了两次编码,所以就需要进行两次解码。

1、浏览器将"小明"使用UTF-8码表进行编码,编码后得到的为 1234 ,将其通过http协议传输。

2、在http协议传输,只能用ISO-8859-1码表中所代表的符号,所以会将我们原先的1234再次进行一次编码,这次使用的是ISO-8859-1,得到的为 ???,然后传输到服务器

3、服务器获取到该数据是经过了两次编码后得到的数据,想要得到“小明”的UTF-8编码,就需要逆向进行解码。

  1. 先ISO-8859-1解码
    byte[] bt = name.getBytes("ISO8859-1");//第一次解码

  2. UTF-8解码
    name = new String(bt,"UTF-8");//第二次解码

    解决代码
    在这里插入图片描述

  • Post请求

    post请求方式的参数是在请求体中,相对于get请求简单很多,没有经过http协议这一步的编码过程,所以只需要在服务器端,设置服务器解码的码表跟浏览器编码的码表是一样的就行了,在这里浏览器使用的是UTF-8码表编码,那么服务器端就设置解码所用码表也为UTF-8就OK了

    设置服务器端使用UTF-8码表解码

request.setCharacterEncoding("UTF-8");//命令Tomcat使用UTF-8码表解码,而不用默认的ISO-8859-1了。

所以在很多时候,在doPost方法的第一句,就是这句代码,防止获取请求参数时乱码。

  • 总结请求参数乱码问题

get请求和post请求方式的中文乱码问题处理方式不同

get:请求参数在请求行中,涉及了http协议,手动解决乱码问题,知道出现乱码的根本原因,对症下药,其原理就是进行两次编码,两次解码的过程
new String(xxx.getBytes(“ISO-8859-1”),“UTF-8”);

post:请求参数在请求体中,使用servlet API解决乱码问题,其原理就是一次编码一次解码,命令tomcat使用特定的码表解码。

request.setCharaterEncoding(“UTF-8”);

二、response响应回浏览器出现的中文乱码。

首先介绍一下,response对象是如何向浏览器发送数据的。两种方法,一种getOutputStream,一种getWrite。

ServletOutputStream.getOutputStream();//获取输出字节流。

提供write() 和 print() 两个输出方法

PrintWriter getWrite()=response.getWriter();//获取输出字符流 

提供write() 和 print()两个输出方法

print()方法底层都是使用write()方法的,相当于print()方法就是将write()方法进行了封装,使开发者更方便快捷的使用,想输出什么,就直接选择合适的print()方法,而不用考虑如何转换字节。

1、ServeltOutputStream getOutputStream();

不能直接输出中文,直接输出中文会报异常,报异常的源代码

解决:

response.getoutputStream().write("哈哈哈,我要输出到浏览器".getBytes("UTF-8"));

将要输出的汉字先用UTF-8进行编码,而不用让tomcat来进行编码,这样如果浏览器用的是UTF-8码表进行解码的话,那么就会正确输出,如果浏览器用的不是UTF-8,那么还是会出现乱码,所以说这个关键要看浏览器用的什么码表,这个就不太好,这里还要注意一点,就是使用的是write(byte)方法,因为print()方法没有输出byte类型的方法。

2、PrintWriter getWrite();

直接输出中文,不会报异常,但是肯定会出现异常,因为用ISO-8859-1的码表不能标识中文,一开始就是错的,怎么解码编码读没用了

有三种方法来让其正确输出中文

1、使用Servlet API response.setCharacterEncoding()

response.setCharacterEncoding("UTF-8"); 

让tomcat将我们要响应到浏览器的中文用UTF-8进行编码,而不使用默认的ISO-8859-1了,这个还是要取决于浏览器是不是用的UTF-8的码表,跟上面的一样有缺陷

2、通知tomcat和浏览器都使用同一张码表

response.setHeader("content-type","text/html;charset=uft-8");

手动设置响应内容,通知tomcat和浏览器使用utf-8来进行编码和解码。

charset=uft-8就相当于response.setCharacterEncoding(“UTF-8”);//通知tomcat使用utf-8进行编码

response.setHeader(“content-type”,“text/html;charset=uft-8”);//合起来,就是既通知tomcat用utf-8编码,又通知浏览器用UTF-8进行解码。

response.setContentType(“text/html;charset=uft-8”);  //使用Servlet API 来通知tomcaat和强制浏览器使用UTF-8来进行编码解码,这个的底层代码就是上一行的代码,进行了简单的封装而已。

3、通知tomcat,在使用html通知浏览器 (html源码),注意:建议浏览器应该使用编码,不能强制要求进行两步,所以response在响应时,只要通知tomcat和浏览器使用同一张码表,一般使用第二种方法,那么就可以解决响应的乱码问题了

三、总结

在上面讲解的时候总是看起来很繁琐,其实知道了其中的原理,很简单,现在来总结一下,请求乱码

  • get请求:

经过了两次编码,所以就要两次解码

  1. 第一次解码:xxx.getBytes(“ISO-8859-1”);得到yyy

  2. 第二次解码:new String(yyy,“utf-8”);

也可放到一条语句中来写:new String(xxx.getBytes(“ISO-8859-1”),“UTF-8”);

  • post请求:
    只经过一次编码,所以也就只要一次解码,使用Servlet API
request.setCharacterEncoding("UTF-8"); 

不一定解决,取决于浏览器是用什么码表来编码,浏览器用UTF-8,那么这里就写UTF-8。

响应乱码
getOutputStream();用该字节输出流,==不能直接输出中文,会出异常,==要想输出中文,解决方法如下

getOutputStream().write(xxx.getBytes("UTF-8")); 

手动将中文用UTF-8码表编码,变成字节传输,变成字节后,就不会报异常,并且tomcat也不会在编码,因为已经编码过了,所以到浏览器后,如果浏览器使用的是UTF-8码表解码,那么就不会出现中文乱码,反之则出现中文乱码,所以这个方法,不能完全保证中文不乱码

getWrite();

使用字符输出流,能直接输出中文,不会出异常,但是会出现乱码。

解决:通知tomcat和浏览器使用同一张码表。

//第一种方法
//通知浏览器使用UTF-8解码 
response.setContentType("text/html;charset=utf-8");  

//第二种方法
//通知tomcat和浏览器使用UTF-8编码和解码。
response.setHeader("contentType","text/html;charset=utf-8");

 

这个方法的底层原理是这句话:

注意:getOutputStream()和getWrite() 这两个方法不能够同时使用,一次只能使用一个,否则报异

【DRAM存储器六十六】DDR5介绍--训练相关之CA/CS Training 详述DDR5 CA/CS training过程细节 阅读详情

相关推荐

用STM32L552驱动AD9102:一个硬件工程师的实战避坑指南(附完整代码)

本文详细介绍了如何使用STM32L552微控制器驱动AD9102任意波形发生器芯片,从硬件设计到波形生成的完整实战指南。内容包括电源架构、时钟电路设计、输出调理电路等关键硬件设计要点,以及软件驱动架构、波形存储优化和典型波形生成实例。通过实战经验分享,帮助硬件工程师避开常见设计陷阱,提升开发效率。

weixin_30889885的博客 334

HttpServletRequest请求乱码问题解决方案

一、HttpServletRequest介绍   HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。 二、Request常用方法 2.1、获得客户机信息   getRequestURL方法返回客户端发出请求时的完整URL。  getRequest...

sqsfjsjlpf的博客 1853

FinRL实战:5步搞定股票量化交易策略(附Python代码)

本文详细介绍了如何使用FinRL框架,通过5个步骤构建基于深度强化学习的股票量化交易策略。内容涵盖从环境搭建、数据获取与预处理,到交易环境构建、模型训练(如PPO算法),以及策略回测评估与优化的完整流程,并提供了可运行的Python代码示例,帮助读者快速入门AI驱动的量化交易。

weixin_29062865的博客 630

【Servlet】Request请求参数中文乱码问题与请求转发

文章目录Request请求参数中文乱码问题POST请求解决办法GET请求解决办法Request请求转发请求转发之间共享数据请求转发的特点 Request请求参数中文乱码问题 POST请求解决办法 分析出现中文乱码的原因: POST的请求参数是通过request的getReader()来获取流中的数据 TOMCAT在获取流的时候采用的编码是ISO-8859-1 ISO-8859-1编码是不支持中文的,所以会出现乱码 乱码问题一般都是编码与解码所使用的字符集不一样造成的 解决方案: 页面设置的

十八岁讨厌编程的博客 2861

B-Tree数据存储

SQLITE数据存储1. B-Tree的优势  在SQLite中数据库、表、索引都是通过B-Tree和B+Tree的形式进行存储的。如果采用传统的二叉树查找树、红黑树的查找深度一般为log2(N) \log{_2}(N)(其中N表示的是整个树的关键字的数目),在数据库中如果存储的资源过多,就会导致查找一个数据过程中出现较多的磁盘I/O操作,而过多的磁盘操作就会导致整个查找的效率较低,而基于二叉树的一

Promiscuous_youth的博客 1142

FPGA实战:从零构建eMMC控制器(Verilog篇)

本文详细介绍了如何使用Verilog从零构建FPGA上的eMMC控制器,涵盖eMMC接口基础、命令系统解析、关键模块设计及性能优化技巧。通过实战案例,帮助开发者掌握高速数据存储解决方案,提升嵌入式系统开发能力。

weixin_26802933的博客 298

spring开发篇二:@RequestParam和@RequestBody与前端Get和Post请求传参详解附中文乱码解决方法

1.先入为主: 1.在spring的controller中,写法必须是同一个请求中只能有一个@RequestBody;同一个请求中,可以有多个@RequestParam;同一个请求可以同时存在@RequestBody和@RequestParam; 2.请求中@RequestParam()指定的参数可以是普通元素、数组、集合等等;当@RequestBody 与@RequestParam()同时使...

MarshalEagle的博客 6069

STM32F429网络通信避坑指南:用CubeMX搞定LAN8720+LWIP+FreeRTOS(附完整代码)

本文详细介绍了STM32F429通过CubeMX配置LAN8720+LWIP+FreeRTOS实现网络通信的避坑指南,涵盖硬件连接、CubeMX配置、LWIP优化及调试技巧,提供完整代码和实战经验,帮助开发者高效解决以太网通信中的常见问题。

weixin_26873711的博客 145

Spring中@RequestBody接收请求乱码解决

Java如何从HttpServletRequest中读取HTTP请求的body 当发起http调用时,用spring的@RequestBody去接收请求body,导致请求body中的中文乱码,是英文请求过来是用的是UTF-8格式,而@RequestBody默认是用gbk格式去转换的,导致乱码。 可以用去读取Request字节,再转换成UTF-8格式,就不会出现乱码了 @RequestMapping(value = "/testReq", method = RequestMethod.POST) pu

zgp11_2018的博客 6371

Python爬虫实战:爬取500+网易云热门歌单,我摸清了全网最火的音乐规律

曲风:流行是主流,“情绪价值”比单纯曲风更重要;歌名:感性、场景化的歌名,更受用户偏爱。这次实战让我明白,Python不是冰冷的代码,而是能帮我们看清生活中隐藏规律的工具。从每天刷的歌单里,用爬虫和数据分析挖出用户的真实偏好,不仅满足了好奇心,还实实在在练会了技能。新手朋友可以从这个项目入手,既练习了爬虫基础,又学会了数据分析的核心逻辑,还能结合自己的音乐兴趣理解数据的意义。现在打开PyCharm,跟着代码跑一遍,你也能从网易云的热门歌单里,挖出属于自己的“音乐规律”!

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1891

【OpenClaw从入门到精通】第17篇:OpenClaw巨头布局实战:阿里CoPaw/腾讯云/百度/火山引擎深度拆解(2026实操版)

2026年OpenClaw以22.8万星标登顶GitHub,引发阿里、腾讯、百度、字节等互联网巨头入局角逐。本文基于公开技术文档与实测经验,深度解析四大巨头的OpenClaw布局战略:阿里云CoPaw的全栈托管、腾讯云的流量入口绑定、百度智能云的搜索生态内嵌、火山引擎的极致智力供给。从核心原理、算法构建、实操流程三个维度,提供可直接落地的接入方案,包含完整代码示例与执行结果验证。通过流程图可视化核心架构,搭配避坑指南与选型矩阵,帮助新手快速上手、进阶读者实现多厂商协同部署。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1685

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

前面一篇文章我们探讨了 Servlet 中的 Request 对象,Request 请求对象中封装了请求数据,使用相应的 API 就可以获取请求参数。也许有小伙伴已经发现了前面的方式获取请求参数时,会出现中文乱码的情况,本文就是为了解决获取请求参数中文乱码的问题,本文以 POST 请求方式和 GET 请求方式为例,其他的请求方式类似,这里不再赘述。

zhangxia_的博客 5197

炼金术士的试炼:2026年企业信用信息公示系统极验五维反爬下的Python数据博弈与破局之道

企业信用信息公示系统(以下简称“公示系统”)作为国家市场监督管理总局权威发布平台,承载着全国亿万市场主体的登记、许可、处罚等核心信用数据。对于金融风控、市场分析、商业尽职调查等领域,这些数据具有不可替代的黄金价值。然而,公示系统在2025年至2026年间进行了数次史诗级的安全加固,构建了包含动态令牌、极致混淆的JavaScript混淆、无感行为指纹、智能语义验证码以及WebAssembly防护在内的“五维反爬长城”。

2201_76125261的博客 353

Servlet的Request与Response的用法与区别

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.youkuaiyun.com/qq_33642117/article/details/51849315 简介:Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。request和resp...

Buns.的博客 1504

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Servlet 中文乱码问题及解决方案剖析

看到一个很不错的文章,就转载了。本文转自:http://blog.youkuaiyun.com/xiazdong/article/details/7217022   一、常识了解 1.GBK包含GB2312,即如果通过GB2312编码后可以通过GBK解码,反之可能不成立; 2.java.nio.charset.Charset.defaultCharset() 获得平台默认字符编码; 3.getByt

caihaijiang的专栏 1453

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java Web(二) Servlet中response、request乱码问题解决

本文转载自:https://www.cnblogs.com/whgk/p/6412475.html 一、request请求参数出现的乱码问题       get请求:         get请求的参数是在url后面提交过来的,也就是在请求行中,                               MyServlet是一个普通的Servlet,浏览器访问它时,使用get请求方式提交了一个name=小明的参数值,在doGet中获取该参数值,并且打印到控制台,发现出现乱码        

menergy 888

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

注意语句顺序 防止Servlet Request Response乱码

servlet乱码一般分为Request发生乱码和Response发生乱码 对于Request发生乱码一般是由于tomcat容器的默认编码是ISO-8859-1 而Java中的编码是UTF-8的,因此可以对 String myparam=request.getParameter("myparam"); 得到的参数进行编码转化 myparam = new...

ahch8077的博客 85

request和response对象如何解决中文乱码问题?

出现中文乱码的问题,一般的原因编码和和解码不一致造成的。 1 /* 2 乱码:编码和解码不一致导致的 3 GET:你好 4 POST:?????? 5 tomcat版本:8.5及以上版本 6 GET请求方式,request对象使用的字符集...

weixin_30894583的博客 155

web开发(二) Servlet中response、request乱码问题解决

在网上看见一篇不错的文章,写的详细。 以下内容引用那篇博文。转载于《http://www.cnblogs.com/whgk/p/6412475.html》,在此仅供学习参考之用。 一、request请求参数出现的乱码问题       get请求:         get请求的参数是在url后面提交过来的,也就是在请求行中,                       ...

diaojinxun8373的博客 94

Servlet 中文乱码问题及解决方案剖析-转载

转自 : https://blog.youkuaiyun.com/xiazdong/article/details/7217022   一、常识了解   1.GBK包含GB2312,即如果通过GB2312编码后可以通过GBK解码,反之可能不成立; 2.java.nio.charset.Charset.defaultCharset() 获得平台默认字符编码; 3.getBytes...

wb15374515921的博客 172

【Servlet】Request对象

request对象和response原理:*request和response对象由服务器创建*request对象获取请求消息,response对象设置响应消息request对象继承结构:request对象功能:获取请求行数据:string getMethod(): 获取请求方式...

weixin_40596999的博客 106

Servlet中response、request乱码问题解决

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/qq_34173549/article/details/80097763 一、request请求参数出现的乱码问题       get请求:...

weixin_34337265的博客 96

get/post时中文乱码问题的解决办法

常有的方法,get请求用在tomcat的编码改为utf-8 即可 post 过滤器就可以 一、常识了解 1.GBK包含GB2312,即如果通过GB2312编码后可以通过GBK解码,反之可能不成立; 2.java.nio.charset.Charset.defaultCharset()获得平台默认字符编码; 3.getBytes() 是通过平台默认字符集进行编码; 二、中文...

weixin_30823833的博客 124

Servlet的response输出到页面时乱码的解决方法

1 package com.mhb; 2 import java.io.IOException; 3 import java.io.PrintWriter; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.http.HttpServlet; 7 import javax.s...

dieman0446的博客 172

response和request的区别以及常见问题解决

  request是请求,即客服端发来的请求   response是响应,是服务器做出的响应 --------------------------------------------------------------   request 是请求的载体,它附带着,请求的参数,ip,cookie,表单,字符编码,或者上传文件。你可以通过request去获得你所需要的信息。   re...

bangduji5725的博客 275
上一篇: Servlet 生命周期
下一篇: mybatis入门
M2L
M2L
博客等级 码龄10年 12粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值