tomcat默认的在url传输时是用iso8859-1编码。html
在使用get传输参数时,将参数中的中文转换成url格式,也就是使用urlEncode和urlDecode来传输,使用这种方式就是把中文转换成以%开头的编码在url中传输。web
使用这种方法时,要注意两点。浏览器
1.前台使用urlencode,在后台相应的使用urldecode。tomcat
2.使用urlencode的内容是参数内空。千万要注意,他是会把等于号等符号也给转换了。因此,最好是先把参数传换后再进行拼接。而不是把url拼接好再去转换。服务器
配置tomcat,使用其在url传输过程当中使用相应的支持中文的编码。通常国内的喜欢用gbk或gb2312。我我的建议使用utf-8框架
在tomcat的/conf/server.xml文件中,找到如下这一行。编码
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />url
这行的意思也就是使用8080端口来接收html的请求。在这里能够加几个参数来配置不一样的效果。spa
URIEncoding="UTF-8" 设置url传输时对url内容的编码格式rest
compression="on" 打开压缩功能
compressionMinSize="2048" 启用压缩的输出内容大小,这里面默认为2KB
noCompressionUserAgents="gozilla, traviata" 对于如下的浏览器,不启用压缩
compressableMimeType="text/html,text/xml" 压缩类型
对于要解决乱码来讲,改为如下就行
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
转:
通过分析,使我对TOMCAT的处理机制和HttpServletRequest有了更加深刻的认识。
1.filter过滤器中获取参数值出现乱码
下面是服务器端中的过滤器获取参数的代码:
当我在浏览器输入“http//:localhost:8080/rest/test?foo=中国”时,浏览器会自动对"中国"进行URI转码,因为使 用的中文语言环境,浏览器会将“中国”转码为"%D6%D0%B9%FA"."D6D0","B9FA"分别"中","国"的GBK编码。等价于在 JAVA语言中做了以下操做
传递到服务器后的URL实际为“http//:localhost:8080/rest/test?foo=%D6%D0%B9%FA”。
因为TOMCAT默认会对URL进行解码,而且使用的是ISO-8859-1字符集,以下所示
由于编码和解码使用的是不一样的字符集,因此解码出来的字符串确定是不对的,故而使用以下方式获取参数值时出现乱码。
2.resteasy的service方法中获取参数出现乱码
resteasy中获取到request参数foo的机制与前面的filter略有不一样。foo参数的是值由resteasy框架进行相似以下处理后得到的。
经过getQueryString()方式得到的参数并无被TOMCAT解码过,但被resteasy框架进行了解码,当传入参数不是以UTF-8编码的话获取到的参数就多是乱码
3.总结
使用request.getParameter方式得到的参数是已经通过web服务器解码的
使用request.getQueryString能够得到未解码的原始参数
对于tomcat解码形成的乱码问题能够经过2种途径解决
修改tomcat配置文件设置解码方式
服务器端对于获取到的参数进行new String(param.getBytes("ISO-8859-1"),"页面指定编码")转换