POST请求发送参数,参数一定要用urlencoder编码()进行转换吗。还是只要中文进行转换。

有个朋友写JSP程序时,在Servlet中取请求参数时出现了乱码,当然,这种乱码问题再简单不过了。由于在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将提交的字节转换成字符串。
解决的方法有三个:
将GET请求改成POST请求,然后就可以使用request.setCharacterEncoding方法设置编码,并使用request.getParameter方法直接获得中文请求参数了。
不用改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属性。
好的经验,谢谢分享
后台servlet使用前台传递的参数需要使用encodeURI()转码另外,项目从数据库到页面显示最好使用同一的编码
这个是由于IE发送的时候没有进行编码转换问题.使用js.进行字符转换encodeURI('中文');后台使用URLDecoder进行编码转换.
很好的分析,学习了,感谢楼主
已解决问题
未解决问题当前访客身份:游客 [
:请问客户端怎么实时读取异步处理的结果?
:&constant name="struts.i18n.encoding" value="...
今日访问:0
昨日访问:5
本周访问:12
本月访问:37
所有访问:3403
Ajax发送请求时的编码问题
发表于2年前( 11:24)&&
阅读(1735)&|&评论()
0人收藏此文章,
对于我们大多数做web开发的人来说,在不同编码影响下,往往会出现乱码的问题,以致于最终达不到开发需求。如果发送的请求里不包含非西欧字符,将不会有任何问题;但是一旦包含了非西欧字符的请求参数,问题也就出现了,但也不一定。
现在有这样一个小demo:
show.jsp:
&% @ page contentType=&text/charset=GBK& language=&java& %&
&%&&&&&& // 服务器从页面获取用户的name请求参数,在控制台输出
&&&&System.out.println(request.getParameter(&name&));
first.html:
&input type=&text& id=&test& name=&name&&&br /&
&input type=&button& value=&GET发送& onclick='getSend(document.getElementById(&test&).value)' /&
&input type=&button& value=&POST发送& onclick='postSend(document.getElementById(&test&).value)' /&
&script type=javascript&
&& // 获取xmlHttpRequest
& var xmlH
& function getXMLHttpRequest()
&& if(window.XMLHttpRequest)
&&&& xmlHttp = new XMLHttpRequest();
&}else if(window.ActiveXObject)
&&&&&& xmlHttp = new ActiveXObject(&Msxml2.XMLHTTP&);
&&&&& }catch(e){
&&&&&& try{
&&&&&&&&&&& xmlHttp = new ActiveXObject(&Microsoft.XMLHTTP&);
&&&&&&&&&& }catch(e){ }
& function postSend(name)
&&& xmlHttp = getXmlHttpR
&& // 服务器请求url
&& var uri = &show.jsp&;
&// 使用POST方式打开与服务器的连接
& xmlHttp.open(&POST&,uri,true);&&&&// true----指定使用异步处理
& xmlHttp.setRequestHeader(&Content-Type&,&application/x-www-form-urlencoded&);
&// 发送请求
& xmlHttp.send(&name=&+name);
fucntion getSend(name)
& xmlHttp = getXmlHttpR
& var uri = &show.jsp?name=&+
& xmlHttp.open(&GET&,uri,true);
& xmlHttp.send(null);
当我们访问页面提交请求参数后,会在控制台看到,使用GET请求则出现了中文乱码。Ajax请求中,对于POST请求较好处理,异步POST请求参数默认采用UTF-8字符集来编码请求参数,因此只需要调用HttpServletRequest的setCharacterEncoding(&utf-8&);就可以解决。一般情况下,服务器页面默认采用UTF-8字符集来解码请求参数,所以有时候会看到,即使你没有设置编码字符集,也会看到正确的输出。
但是GET就有所不同,我们知道,GET将请求参数和对应的值附加在请求的URL之后。对于中文请求参数值,不会以中文的方式传递参数值,而是转码成URL的格式。所以,应当在服务器页面中作出以下修改:
& if(request.getMethod().equalsIgnoreCase(&POST&))
&&&& request.setCharacterEncoding(&utf-8&);
&&& System.out.println(request.getParameter(&name&));&
&// 处理GET请求
& if(request.getMethod().equalsIgnoreCase(&GET&))
&&&&&String temp = reqeust.getParameter(&name&);
// 将参数按ISO-8859-1字符集编码成字节数组,然后按UTF-8字符集将该字节数组解码成字符串
&&& String&new_string = new String(temp.getBytes(&ISO-8859-1&),&UTF-8&);
&& System.out.println(new_string);&
这样,或许可以看到正确的GET发送参数的输出,但是当我们换用IE浏览器发出请求时,将再次出现乱码。GET请求参数所用的字符集与客户端浏览器有关,不同的浏览器在发送GET请求时使用了不同的字符集。
所以,我们只能使用java.net.URLEncoder.encode()方法进行处理:
java.net.URLEncoder.encode(请求参数,&GBK&);
然后在服务器端进行相应的转换处理:
new String(请求参数.getBytes(&ISO-8859-1&),&GBK&);
这样GET发送请求参数乱码问题就解决了。但是,会有相当烦琐的一系列操作,不推荐。
最好是使用POST发送请求参数,理由如下:
1 当请求参数包含的数据太多时,GET请求可能 丢失请求参数
2 当两次GET请求参数相同时,Internet Explorer将直接使用服务器上次的缓存,不会重新发送请求,这对于自动刷新页面相当不好。
更多开发者职位上
1)">1)">1" ng-class="{current:{{currentPage==page}}}" ng-repeat="page in pages"><li class='page' ng-if="(endIndex<li class='page next' ng-if="(currentPage
相关文章阅读项目中写了中文转换后 为什么还是乱码?_百度知道
项目中写了中文转换后 为什么还是乱码?
提问者采纳
2、get/post方式的区别: 1)哪一些是get方式:
a,在浏览器地址栏直接输入一个地址
b,表单默认提交方式
c,点击链接 2)哪一些是post方式:
表单添加method=&post& 3)get方式的特点
a,请求参数添加到请求资源路径之后,添加的参数大小有限制
b,将参数显示在浏览器地址栏,不安全。get方式适合向服务器请求资源。 4)post方式的特点
a,请求参数添加到实体内容之内,添加的参数大小理论上没有限制。
b,在浏览器地址栏不显示参数,相对安全(并不是绝对安全,因为浏览器并没有对参数进行加密。
post方式适合向服务器提交数据。----------------------------------------一、servlet乱码问题:---------1、get方式: a、直接在浏览器地址栏写上参数传递过去(有汉字),浏览器自动使用当前操作系统默认字符集(gbk/gb2312/gb18030)编码后传到服务器。 b、点击页面连接(链接附带着汉字),浏览器自动根据这个页面使用的字符集(charset=&&)编码后传到服务器,request.getParameter()
方法获取到的字符串是服务器使用默认的解码方式(ISO-8859-1)解码的,需要转换回去才不会是乱码(使用ISO-8859-1编码一次,再
使用浏览器页面的编码方式解码一次,打印出来就不是乱码了),
我们的servlet如何得到中文编码呢?我们一步一步的编码解码即可:
URLEncoder.encode(str, &iso8859-1&);//把tomcat给我们解码的字符串给再编码回去;
URLDecoder.decode(str, &utf-8&);//再以需要的方式解码出来。
(还可以在Tomcat的配置文件service.xml中更改服务器的默认编码ISO-8859-1为你需要的编码方式即可)2、post方式: b、但也可以在getParameter()方法之前,通过request.setCharacterEncoding()设置以浏览器所显示的页面的编码方式来解码获取参数,
这样之后获取到的参数也不会是乱码。3、response response.setCharacterEncoding()设置以什么方式写出去。
提问者评价
谢谢你的详细解释。受益匪浅
其他类似问题
1人觉得有用
为您推荐:
其他1条回答
你最好写个过滤器Filter,再检查页面的编码是否一致,最后检查传输是否使用了post
post和get 传输
他们的设置有什么区别呀?
您可能关注的推广回答者:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 urlencoder解码 的文章

 

随机推荐