【JavaWeb开发】Servlet彻底解决开发中请求(get/post)、应答以及控制台中文乱码问题

我们在javaWeb项目时,使用doget和dopost总是会出现各种原因的中文乱码问题,楼主在查阅大量资料后,将为什么有这样的问题,和如何解决这种问题做个总结。

思维导图:

1. 应答乱码处理(response输出页面时乱码)

1.1 问题:

输出到页面时中文会乱码

后端代码:

PrintWriter out = response.getWriter();
out.println("你好");

前端显示:

1.2 原因

没有设置HttpServletResponse使用哪种编码,默认编码跟浏览器解码不匹配。

1.3 解决方案:

方案1:

在PrintWriter out = response.getWriter();

之前添加这两句:

response.setHeader("Content-type", "text/html;charset=UTF-8");  
response.setCharacterEncoding("UTF-8");  

//设置HttpServletResponse使用UTF-8编码
response.setCharacterEncoding("UTF-8");  
//通知浏览器使用UTF-8解码
response.setHeader("Content-type", "text/html;charset=UTF-8");  
PrintWriter out = response.getWriter();

方案2:

或者在之前添加这一句:

response.setContentType("text/html;charset=utf-8");

//包含方案1的两种功能
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();

以上两种方案添加其中之一后前端显示:

2. 请求乱码处理(request.getParameter("xxx")得到参数时乱码)

2.1 问题:

在java程序内部拿到的中文参数会是乱码

前端代码:

<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <title>test</title>
</head>
<body>
<form action="RequestParamsServlet" method="post">
    用户名:<input name="username" type="text">
    密码:<input name="password" type="text">
    爱好:
    <input type="checkbox" name="hobby" value="运动">运动
    <input type="checkbox" name="hobby" value="游泳">游泳
    <input type="checkbox" name="hobby" value="打乒乓球">打乒乓球
    <input type="submit">
</form>
</body>
</html>

前端显示:

后端测试:

String username=request.getParameter("username");//传来的是中文参数
System.out.println(username);//控制台输出的中文乱码

控制台结果:

2.2 原因

2.2.1 doGet和doPost的不同

doPost:post提交是通过HTTP post机制,将表单内各个字段与其内容放置在HTML header内一起传送到action属性所指的URL地址。用户看不到这个过程。简单来说post提交是跟随request请求体的

doGet:get提交是把参数数据队列加到提交表单的action属性所指的URL中,值和表单内各个字段对应,在URL中可以看到。简单来说get提交是不跟随requset请求体的

2.2.2 浏览器和java程序内部的编码解码方式不同

浏览器设置的编码方式是UTF-8,而java程序内部设置的默认解码方式是ISO-8859-1,两者不同则会造成乱码;

而由于post提交和get提交的不同,两者解决中文乱码的方式也不同。

2.3 doPost获取参数解决方案

post提交经过请求体,对请求体设置解码方式即可解决乱码

在方法体开头添加:

//设置request对象的解码方式
request.setCharacterEncoding("utf-8");

2.4 doGet获取参数解决方案(难点,分tomcat版本)

get提交不经过请求体而是通过URL传参,设置requset解码方式无效,且tomcat版本不同解决方法不同,8.0版本是分界线

2.4.1 tomcat8.0版本之前:

tomcat8.0之前对URL的默认解码方式是ISO-8859-1,而浏览器的编码方式是UTF-8,造成乱码。

方案1:

通过new String()方式转码:用getBytes(“ISO-8859-1“)拿到原编码的byte数组,再通过new一个String转成utf-8编码

String username=new String(request.getParameter("username").getBytes("ISO-8859-1"), "UTF-8");

方案2:

设置tomcat默认编码为UTF-8:修改tomcat目录下/conf/server.xml文件,增加 URIEncoding="UTF-8",此后不需要转码操作,参数不会乱码,但此方法操作的是服务器端,会造成适配影响,不推荐使用。

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8" />

方案3:

使用过滤器方法,原理跟方案1一样,只不过不用每一个参数都写一次转码

过滤器解决servlet中文乱码

方案4:

提供一个思路,get提交几乎每一点都比不上post提交,那么就使用post提交方式就好了。

2.4.2 tomcat8.0版本之后:

tomcat8.0之后对URL的默认解码方式是UTF-8,而浏览器的编码方式是UTF-8,不会造成乱码

不需要再转码(切记,杠掉):String username=new String(request.getParameter("username").getBytes("ISO-8859-1"), "UTF-8");

此时我们就不要傻乎乎的用getBytes(“ISO-8859-1“)解码了,反而会出现解码错误,造成乱码,直接使用参数即可。

3. 控制台乱码

3.1 控制台显示tomcat服务乱码

3.1.1 问题:

启动tomcat还有运行时tomcat会产生乱码,原因是IntelliJ IDEA和tomcat的编码解码不一致造成。

现象如下:

3.1.2 原因?

IntelliJ IDEA控制台默认解码是GBK,而tomcat对控制台的默认编码是UTF-8,把一方改成一致即可解决,推荐修改tomcat对控制台的默认编码为GBK,因为windows的cmd控制台的默认解码也是GBK。

3.1.3 解决方案

修改tomcat目录下/conf/logging.properties,原先encoding=UTF-8,建议全部改成GBK,全无乱码

修改后

 

3.2 控制台打印乱码 (system.out.println打印的乱码)

3.2.1问题:

tomcat启动和运行时乱码在上方解决后,system.out.println打印server控制台乱码怎么办?

例如:tomcat7环境下

两个转码成UTF-8的字符串张三正常,而本身输出的字符串出现乱码

3.2.2 原因

File Encodings编码设置不一致。

3.2.3 解决方案:

打开settings

点击convert

再次启动:

4.具体实例

请参考本人另一篇博客:tomcat7和tomcat9解除中文乱码具体实例

 

亲测完全正确哦,有错误的同学注意查看tomcat的server.xml是不是加了多余的配置,或者idea编辑器的字符编码配置有错。

相信认真读到这里,关于中文乱码的问题已经了解

如果对你有所帮助,点赞支持一下作者~

 

 

  • 12
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值