欢迎访问北大青鸟鲁广校区~

  1. 加入收藏
  2. 设为主页
  3. 学校简介
北大青鸟鲁广校区

17740513250

三分钟了解北大青鸟

×
  • 数据加载中...

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

责任编辑:宏鹏来源:武汉北大青鸟鲁广校区发布时间:2014-05-03 11:12:15
导读:有个朋友写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方法来设置编码。但是说来奇怪,还是出现乱码,没有任何解决问题的迹象。 郁闷的事就是使用了自己认为能解决问题的方法,而这种方法却一点都没起作用。

后又让朋友试了后一种方法,说来奇怪,竟然好使了。当然,这也没什么可奇怪的,本来就应该好使,但奇就奇在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服务器都会对该方法有很好的支持。

武汉北大青鸟鲁广校区,专业老师会帮你找到适合自己学习的课程和就业方向,详细了解JAVA教程中的小问题,现在就与专业老师在线老师沟通或拨打电话:17740513250,或QQ咨询:17740513250.

本文标题:#JAVA教程:Tomcat在处理GET和POST请求时产生的乱码问题#,宏鹏发布于北大青鸟鲁广校区。有个朋友写JSP程序时,在Servlet中取请求参数时出现了乱码,当然,这种乱码问题再简单不过了。那么究竟这个乱码是怎么产生的?怎么自查呢?怎么解决呢?北大青鸟鲁广校区专业老师为你详细解析!

专业老师指导

专业老师指导

赵老师

从事IT教育培训十年有余,致力于帮助广大学子找到适合自己的专业。

培训咨询客服

培训咨询客服

陈老师

IT培训专业客服,用自己的真诚解决了无数学子的困惑。

本文地址:https://www.027hpedu.com/wenda/java/3228.html

大家都在看的大家都在看的Java开发

热门课程

更多>>
  • 数据加载中...
7天免费试学

7天课程免费试学

实战学习干货限时领取

行业解读+大咖授课+项目实操
10年以上业内强师集结,手把手带你蜕变精英!

点我咨询
×
在线咨询更多问题

如您有任何疑问
在线咨询随时为您解答或拨打咨询热线:13125006136

×
  • 姓 名*
  • 手 机*
  • QQ号/微信号
  • 所报学科 *
  • 其他备注
  • 验证码 获取验证码 *
  • 温馨提示:请保持手机畅通,咨询老师将为您提供专属的一对一报名服务。