1.get
客户端:
get将请求参数作为url的一部分。浏览器会对url进行编码后发给服务器。浏览器具体用什么编码,依赖于浏览器的具体实现(而且有些浏览器对查询串和URI会分别采取不同的编码)。所以url中不要出现非ASCII字符。非ASCII字符可以在用js在客户端进行统一的编码。
服务器端:
通过request.getParameter获取参数时,参数已经被服务器解码,具体解码方式依赖于服务器的实现。这里要注意用request.setCharacterEncoding是无法指定get请求参数的编码的(有例外下面会提到),request.setCharacterEncoding是用来解码post参数的。
比如tomcat默认用iso-8859-1,可以用java代码来转码new String(request.getParameter("name").getBytes("iso-8859-1"),"客户端指定的URL编码方式")。当然可以通过server.xml配置文件中的Connector节点的URIEncoding来指定编码,这样就不用再转了。
URIEncoding应用到tomcat的所有webapp,如果不同的webapp用不同的URL编码就会有问题。所以推荐使用useBodyEncodingForURI="true",这样将采用和处理post请求的同样的方式。于是可以将get与post进行统一处理,比如可以设置过滤器。
2.post
客户端:
post将请求参数放在请求体中。请求参数也要由浏览器编码。一般都是采用浏览器解码页面所用的编码,这个是由浏览器收到服务器响应中的Content-Type所指定的(比如Content-Type text/html;charset=utf-8),响应的Content-Type可以用jsp中的<%@ page contentType='text/html;charset=utf-8'%>,或者通过response.setContentType来指定。如果响应的Content-Type中没有charset则采用html的meta中的Content-Type编码(比如<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>),如果都没指定,则由浏览器自己决定。
服务器端:
如果请求头中Content-Type包含了编码,这时服务器端的将用此来解码参数,getCharacterEncoding方法返回的就是这个编码。我们经常getCharacterEncoding返回的是null,这是因为有些浏览器不发送请求的Content-Type,这时我们需要在服务器端用request.setCharacterEncoding来指定编码对post请求进行解码。
所以一般<%@ page contentType=%>,request.setCharacterEncoding,useBodyEncodingForURI="true"就可以解决大部分乱码问题了。
推荐一篇文章[url]http://blog.csdn.net/yzhz/archive/2007/07/03/1676796.aspx[/url]
客户端:
get将请求参数作为url的一部分。浏览器会对url进行编码后发给服务器。浏览器具体用什么编码,依赖于浏览器的具体实现(而且有些浏览器对查询串和URI会分别采取不同的编码)。所以url中不要出现非ASCII字符。非ASCII字符可以在用js在客户端进行统一的编码。
服务器端:
通过request.getParameter获取参数时,参数已经被服务器解码,具体解码方式依赖于服务器的实现。这里要注意用request.setCharacterEncoding是无法指定get请求参数的编码的(有例外下面会提到),request.setCharacterEncoding是用来解码post参数的。
比如tomcat默认用iso-8859-1,可以用java代码来转码new String(request.getParameter("name").getBytes("iso-8859-1"),"客户端指定的URL编码方式")。当然可以通过server.xml配置文件中的Connector节点的URIEncoding来指定编码,这样就不用再转了。
URIEncoding应用到tomcat的所有webapp,如果不同的webapp用不同的URL编码就会有问题。所以推荐使用useBodyEncodingForURI="true",这样将采用和处理post请求的同样的方式。于是可以将get与post进行统一处理,比如可以设置过滤器。
2.post
客户端:
post将请求参数放在请求体中。请求参数也要由浏览器编码。一般都是采用浏览器解码页面所用的编码,这个是由浏览器收到服务器响应中的Content-Type所指定的(比如Content-Type text/html;charset=utf-8),响应的Content-Type可以用jsp中的<%@ page contentType='text/html;charset=utf-8'%>,或者通过response.setContentType来指定。如果响应的Content-Type中没有charset则采用html的meta中的Content-Type编码(比如<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>),如果都没指定,则由浏览器自己决定。
服务器端:
如果请求头中Content-Type包含了编码,这时服务器端的将用此来解码参数,getCharacterEncoding方法返回的就是这个编码。我们经常getCharacterEncoding返回的是null,这是因为有些浏览器不发送请求的Content-Type,这时我们需要在服务器端用request.setCharacterEncoding来指定编码对post请求进行解码。
所以一般<%@ page contentType=%>,request.setCharacterEncoding,useBodyEncodingForURI="true"就可以解决大部分乱码问题了。
推荐一篇文章[url]http://blog.csdn.net/yzhz/archive/2007/07/03/1676796.aspx[/url]