开发者社区> geekori> 正文

Tomcat在处理GET和POST请求时产生的乱码问题

简介: 本文为原创,如需转载,请注明作者和出处,谢谢     有个朋友写JSP程序时,在Servlet中取请求参数时出现了乱码,当然,这种乱码问题再简单不过了。
+关注继续查看

本文为原创,如需转载,请注明作者和出处,谢谢

    有个朋友写JSP程序时,在Servlet中取请求参数时出现了乱码,当然,这种乱码问题再简单不过了。由于在JSP中使用了GBK作用页面的编码,那么提交的中文信息自然也会被按着GBK进行编码,为%xx格式的GBK编码。
    要解决这个问题可以说是方法多多。最简单的就是使用request.setCharacterEncoding方法设置编码格式,如下面的代码所示:

request.setCharacterEncoding("GBK");

    在设置完编码格式之后,就可以直接通过request.getParameter方法来获得请求参数中的中文信息了。当然,为了方便,还可以在过滤器中加入上面的语句,这样所有的Servlet都可以直接使用
request.getParameter方法来获得请求参数中的中文信息了。 除了这两种方法,还可以不使用request.setCharacterEncoding("GBK"),而使用下面的语言来转换编码:

String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");

    但为了更快解决这个问题,我就直接告诉这位朋友使用了setCharacterEncoding方法来设置编码。但是说来奇怪,还是出现乱码,没有任何解决问题的迹象。 最郁闷的事就是使用了自己认为100%能解决问题的方法,而这种方法却一点都没起作用。
    最后又让朋友试了最后一种方法,说来奇怪,竟然好使了。当然,这也没什么可奇怪的,本来就应该好使,但奇就奇在setCharacterEncoding方法并没有去掉,也就是说,同时使用了下面两条语句,竟然得到了正常的中文请求参数值:

request.setCharacterEncoding("GBK");
String name 
= new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");
System.out.println(name);  
//  正常输出中文请求参数

    按着常理来说,这是不可能的,既然使用了setCharacterEncoding方法设置成了GBK,再使用
new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK")来转换,得到的应该是?????,不可能是正常的中文,只有将setCharacterEncoding方法去了,以ISO-8859-1格 式保存的字符串才可以用ISO-8859-1格式还原,再用GBK重新保存成Java字符串(这一步实际上就是GBK转Unicode)。

    但经过仔细思考后,决定看下JSP代码是如何写的。不看不知道,一看吓一跳,原来<form>在提交时使用的是GET,而未用POST,这当 然没什么了不起的,用什么都可以,但对编码就有问题了。自从Tomcat5.x开始,GET和POST方法提交的信息,Tomcat采用了不同的方式来处 理编码,对于POST请求,Tomcat会仍然使用request.setCharacterEncoding方法所设置的编码来处理,如果未设置,则使 用默认的iso-8859-1编码。而GET请求则不同,Tomcat对于GET请求并不会考虑使用
request.setCharacterEncoding方法设置的编码,而会永远使用iso-8859-1编码,而这位朋友使用的正好是GET请求,因此,tomcat将会使用iso-8859-1将提交的字节转换成字符串。

解决的方法有两个:
1.  将GET请求改成POST请求,然后就可以使用
request.setCharacterEncoding方法设置编码,并使用request.getParameter方法直接获得中文请求参数了。
2.  不用改GET请求,在Servlet中使用如下的代码来得到中文请求参数。

String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");

    综上所述,如果使用了GET请求,则setCharacterEncoding方法不起作用,只能使用上面的代码来解决,而使用POST请求,尽管
setCharacterEncoding 方法起作用,但使用上面的代码仍然好使(在这时不能使用setCharacterEncoding方法将编码格式设置成非iso-8859-1格式)。因 此,如果想让Servlet可以同时处理GET和POST请求中的中文信息,除了判断这两种方法外,还可以使用上面的代码来同时处理这两种请求的中文信 息。

    笔者建议使用如下的代码来获得中文请求参数:

String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "GBK");

    因为上面的代码是利用了Java的编码能力,对于所有的Web服务器都会有效,而setCharacterEncoding方法是通过Web服务器支持的,并不是所有的Web服务器都会对该方法有很好的支持。





国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

《银河系列原创教程》发布

《Java Web开发速学宝典》出版,欢迎定购

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Tomcat控制台乱码问题修复
控制台产生乱码的原因是在Tomcat 在输出日志中使用的是 UTF-8 编码,而我们中文的Windows 操作系统使用的是 GBK 编码。由于编码格式不统一,所以出现了乱码。
14 0
tomcat乱码问题解决
tomcat乱码问题解决
13 0
IEAD启动Tomcat控制台乱码问题
IEAD启动Tomcat控制台乱码问题
51 0
在IDEA配置Tomcat你GET到了吗
作为一个新手,如何把自己的搭建的javaweb网站在本地运行起来呢,这是测试所写程序的必备技能,看完这篇文章看你是否get到方法呢? 查找该问题的童鞋我相信IntelliJ IDEA,Tomcat的下载,JDK等其他的配置都应该完成了,且正准备使用IntelliJ IDEA开发Web项目,那我们直接进入正题了。
103 0
Tomcat的安装和解决乱码问题
解决Tomcat的安装和解决乱码问题
44 0
IntelliJ IDEA 2021 解决Tomcat 8启动乱码问题
IntelliJ IDEA 2021 解决Tomcat 8启动乱码问题
91 0
2、IDEA中Tomcat Server运行时,控制台output乱码问题的解决
IDEA中Tomcat Server运行时,控制台output乱码问题的解决 问题描述:在IDEA中运行Tomcat Server时,控制台中output栏中运行的描述的信息中的中文出现乱码问题。 解决: 在tomcat/conf/logging.properties文件中,将下图中UTF-8字段该
179 0
启动 Tomcat 日志乱码问题
大家在Windows 启动 Tomcat 应该都会遇到中文乱码,其实也不影响使用,但是笔者看着这个乱码难受,于是提供两种较简单的解决方案。
507 0
Tomcat的访问日志-localhost_access_log和记录Post请求参数
Tomcat的访问日志-localhost_access_log和记录Post请求参数
1196 0
Java程序员注意:Tomcat Get请求的巨坑!
Tomcat8.5,当Get请求中包含了未经编码的中文字符时,会报以下错误,请求未到应用程序在Tomcat层就被拦截了。 Tomcat报错: java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
191 0
+关注
geekori
欧瑞科技创始人&amp;CEO,东北大学计算机专业硕士,拥有超过20年软件开分经验。欧瑞学院金牌讲师、51CTO学院金牌讲师、CSDN学院特约讲师、畅销书作者,企业内训讲师。曾出版过超过30本IT畅销书,涉猎移动开发、跨平台开发、机器学习、区块链、大数据、编译器等领域。
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载