tomcat 9.0.x 版本 + Servlet 请求和控制台 中文乱码问题解决(不使用 filter 的情况)
ps:这老破问题,卡我好长时间啊,非得欠欠儿的用最新版的tomcat,用7.0.47版本它不香嘛!以下不加特殊声明所说的 tomcat 均为 9.0.x 版本 而且 编码格式均以 UTF-8 为目标
1. 和 请求/响应无关 的中文乱码问题
这里要记录一下,使用 tomcat 在 servlet 中随便打印一行中文数据都出现乱码啊啊啊啊啊啊!
sout,serr这种情况,居然都有乱码?这明明和 请求/响应 无关啊!
面向百度编程------>
得到的结果是:这个问题要么修改 tomcat 的配置文件,要么在IDEA中tomcat的配置中
有个 VM Options,给他填充一个数据: -Dfile.encoding=utf-8
(就是给这个项目的 tomcat 命名的那个设置面板里,能找到一行 VM Options)
配置文件我没有改,懒得去找path了,直接改 VM Options 它不方便嘛!
控制我们自己打印的数据信息 中文乱码问题 完美解决
2. tomcat 启动时,还有日常的日志打印 中文乱码问题
这个不得已,必须得去改配置文件了
在 tomcat 的安装路径下,找到conf文件夹,里面有个 logging.properties 配置文件,我们用记事本打开它,然后在
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter
这两行的下面添加一行配置:
java.util.logging.ConsoleHandler.encoding = UTF-8
完美解决日志信息的中文乱码问题
3. servlet 中 请求/响应 中文乱码问题解决
这里请求的话就只分为 get/post 这两种最常用的方式 去解决中文乱码
1. get请求
咱们捋一下逻辑啊
1.1
get请求没有请求报文,只能在url上传输参数,那么出现乱码的第一个地方:在我们填写完url后,浏览器传给tomcat,tomcat解析的时候就不老实地按照utf-8解析,导致我们拿到数据就是乱码的
然后 resp.getWrite().write(param) 打在页面上,自然而然就是乱码。
如何解决tomcat解析URI时出现的乱码问题呢?
改配置文件!
还是 tomcat 的安装目录下的 cong 文件夹,找到server.xml,然后在 <Connector> 标签中,拼接参数: URIEncoding="UTF-8"
(注意:这里是URI不是URL)
这个做法,仅适用于 tomcat 8 以前的版本!tomcat 8 以后的版本,自动设置了这个参数,如果我们强行添加,反而在 tomcat 解析 URI的时候 出现乱码
1.2
tomcat 以utf-8正常解析参数后,我们使用 resp.getWrite().write() 给页面打印中文时候还出现乱码!
这种情况就要说我们没有给定响应的解析格式(暂时这么理解吧),我们也不知道它是按照哪儿种编码格式解析响应中的数据,我们就一劳永逸的直接设置响应的解析格式:
在doGet方法中加上这两行代码:
resp.setContentType("text/html;charset=utf-8");// 这个是告诉浏览器,服务器返回的响应是什么格式的文件
resp.setCharacterEncoding("utf-8");// 这个是告诉浏览器,服务器返回的响应你要以什么编码格式解析
2. post请求
2.1
这个post请求就方便很多了
post请求是含有请求报文的,我们在doPost方法直接加上三行代码,:
req.setCharacterEncoding("utf-8);// 这个是告诉服务器,请求报文以什么编码格式解析,这里是utf-8
resp.setContentType("text/html;charset=utf-8");// 这个是告诉浏览器,服务器返回的响应是什么格式的文件,这里是text/html
resp.setCharacterEncoding("utf-8");// 这个是告诉浏览器,服务器返回的响应你要以什么编码格式解析,这里是utf-8
综上,tomcat常见的中文乱码导致原因
1. 浏览器向服务器发送请求时,服务器解析请求出现乱码;
2. 服务器向浏览器返回响应时,出现乱码
3. 在 tomcat 的环境下,jvm出现中文乱码(-Dfile.encoding=utf-8)