Tomcat处理HTTP请求中文乱码
一个HTTP请求分为三部分,例如http://host:port/musiclist/query.do?musicname=歌曲名
浏览器发送这个请求时(POST,GET)会对请求中的非ASCII?字符用某种字符集(一般为UTF-8)进行编码.
此时Tomcat在接受请求时(未传递给具体应用)会对请求进行解码,默认会使用ISO-8859-1对pathInfo部分(示例中query.do)进行解码.可以通过设置URIEncoding参数指定解码使用的字符集.
例如:?<Connector URIEncoding=”UTF-8” ?..../>
对于QueryString部分(musicname=歌曲名)是在应用第一次调用request.getParameter被解码的.默认使用ISO-8859-1进行解码.浏览器在发送请求时会发送一个ContentType的HEAD,其中包含charset这个参数,这是实际的QueryString的编码字符集.应用中要使用这个参数对GET方式的HTTP请求进行解码,才不会乱码.对于Tomcat要进行如下设置??<Connector URIEncoding=”UTF-8” useBodyEncodingForURI=”true”/>.做此设置后,对于GET方式的HTTP请求一般就不会有乱码问题了.
对于POST方式的HTTP请求,QueryString是在HTTP body中传递给服务器的.只需使用request.setCharacterEncoding(charset) 设置解码字符集即可.
?
总结
由于不同的浏览器对PathInfo部分的编码方式可能不同,所以这部分一定不要使用非ASCII字符.
对于QueryString部分,可以通过<Connector URIEncoding=”UTF-8” useBodyEncodingForURI=”true”/>设置,和request.setCharacterEncoding(charset)方法解决编码问题.