JavaWeb中GET请求url传参中文乱码问题
方式一:
修改tomcat配置文件 ==> conf/server.xml ==> 添加“URIEncoding="utf-8"”
<Connector port="8082" protocol="HTTP/1.1" URIEncoding="utf-8" >
方式二:
前台: url = encodeURI(url)
后台: String str = new String(request.getParameter("param").getBytes("iso8859-1"),"UTF-8");
方式三:
前台处理:
url = "http://localhost:8080/servletName?name=胡刚"
=>url = "http://localhost:8080/servletName?name="+ encodeURI(encodeURI("胡刚"))
后台处理:
String name = request.getParamter("name"); 第一次解码(服务器解码 即与方法一配置有关)
name = java.net.URLDecoder.decode(name,"UTF-8"); 第二次解码
注:后台进行重定向时需要再次进行编码:
name = java.net.URLEncoder.encode(name,"charset");
两次编码两次解码的过程为:
过程
|
结果(中)
|
描述
|
① UTF-8 | [%E4,%B8,%AD] | 按照utf-8方式获取字节数组变成[-28,-72-83],对字节码数组进行遍历,把每个字节转化成对应的16进制数,这样就变成了[E4,B8,AD],最后变成 [%E4,%B8,%AD] 此时已经没有了多字节字符,全部是单字节字符。 |
② UTF-8(ISO-8859-1) | [%25E4,%25B8,%25AD] | 会把%看成一个转义字符,并不编码%以后字符,会把%编码成%25.把数组最后变成[%25E4,%25B8,%25AD],然后就把处理后的数据[%25E4,%25B8,%25AD]发往服务器端, |
③ ISO -8859-1
|
[%E4,%B8,%AD] | 当应用服务器调用getParameter方法,getParameter方法会去向应用服务器请求参数应用服务器最初获得的就是发送来的[%25E4,%25B8,%25AD],应用服务器会对这个数据进行URLdecode操作,应用服务器进行解码的这一次,不管是按照UTF-8,还是GBK,还是ISO-8859,,都能得到[%E4,%B8,%AD],因为都会把%25解析成%.并把这个值返回给getParameter方法 |
④ UTF-8 | 中 | 再用UTF-8解码一次,就得到"中"了。 |
注 | UTF-8->UTF-8(iso-8859-1)->iso-8859-1->UTF-8,编码和解码的过程是对称的,所以不会出现乱码。 想想看,如果不编码两次,当服务器自动解码的时候,假如是按照ISO-8859去解码UTF-8编码的东西,就是会出现乱码。 |
POST方式不会出现乱码的原因:
request.setCharacterEncoding(encoding);只对post请求有效;
spring的CharacterEncodingFilter也只是做了request(和response).setCharacterEncoding(encoding);的操作。所以spring的filter配置不作用于get参数接收。