当前位置 : IT培训网 > Java开发 > Java培训 > 详述Tomcat处理GET和POST请求时产生乱码怎么办

详述Tomcat处理GET和POST请求时产生乱码怎么办

时间:2017-10-17 16:57:44  来源:Java培训网  作者:IT培训网  已有:名学员访问该课程
标签(Tag):   Tomcat处理GET和(1)
Java程序员在遇到Tomcat处理GET和POST请求产生乱码时,经常会手忙脚乱,不知所措。其实,在编程中遇到这种乱码问题也算正常现象,但是处理往往会有些方法不当而造成失误。

Java程序员在遇到Tomcat处理GET和POST请求产生乱码时,经常会手忙脚乱,不知所措。其实,在编程中遇到这种乱码问题也算正常现象,但是处理往往会有些方法不当而造成失误。

详述Tomcat处理GET和POST请求时产生乱码怎么办_www.itpxw.cn

要解决这个问题可以说是方法多多。其中最为简单的就是使用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方法来设置编码。但是说来奇怪,还是出现乱码,没有任何解决问题的迹象。郁闷的事就是使用了自己认为能解决问题的方法,而这种方法却一点都没起作用。

后又让朋友试了后一种方法,说来奇怪,竟然好使了。当然,这也没什么可奇怪的,本来就应该好使,但奇就奇在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代码是如何写的。不看不知道,一看吓一跳,原来在提交时使用的是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服务器都会对该方法有很好的支持。

经过上述分析,再遇到Tomcat处理GET和POST请求时产生乱码时要保持头脑冷静,以正常的心态去处理一些问题,上面也汇总了一些好用的方法,大家可以在实际应用中活学活用。

顶一下
(0)
0%
踩一下
(0)
0%

IT培训0元试听 每期开班座位有限.0元试听抢座开始! IT培训0元试听

  • 姓名 : *
  • 电话 : *
  • QQ : *
  • 留言 :
  • 验证码 : 看不清?点击更换请输入正确的验证码

在线咨询在线咨询

温馨提示 : 请保持手机畅通,咨询老师为您
提供专属一对一报名服务。

------分隔线----------------------------
------分隔线----------------------------

推荐内容

相关热点