您的位置:首页 > 运维架构 > Tomcat

tomcat解决get请求乱码的方法(第三个似乎不好用)

2016-04-02 23:30 671 查看
由于在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方法并没有去掉,也就是说,同时使用了下面两条语句,竟然得到了正常的中文请求参数值:

按着常理来说,这是不可能的,既然使用了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");

3.为了保证get数据采用UTF8编码,在server.xml中进行了如下设置

<connector port="8080" maxthreads="150" minsparethreads="25" <br="">maxSpareThreads="75" enableLookups="false" redirectPort="8443"

acceptCount="100" debug="99" connectionTimeout="20000"

disableUploadTimeout="true" URIEncoding="UTF-8"/>

这里指定了get时候的数据编码。但是,当使用IIS作为webserver转发servlet/jsp请求给Tomcat时候,这个设置却失效了。其实原因很简单:IIS是通过AJP协议,把请求转发到Tomcat监听的8009端口上的,所以这里针对8080的设置自然就无效了。正确的方法是进行下面的设置:

<connector port="8009" enablelookups="false" redirectport="8443" <br="">debug="0" protocol="AJP/1.3" URIEncoding="UTF-8"/>

-

综上所述:通常在处理中文乱码问题时我们要编写自己的过滤器,不管是get请求还是post请求一律都经过此过滤器,此过滤器的作用是设置request.setCharacterEncoding()同时设置server.xml的URIEncoding属性。
http://blog.163.com/ng_0125@126/blog/static/170162360201201033611521/
总结,第三种方法不好用,可以参考如下网址来改善,验证可行
http://m.oschina.net/blog/424710
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: