get/post请求中文乱码问题及最佳解决方案

出现的问题:

通过get请求向服务器发送请求时,如果请求参数为中文时,服务器端接受到的参数为乱码。

乱码原因分析及解决办法:

1.关于解码和编码

编码:'中'→1110001

解码:1110001→'中'

乱码:编码和解码过程中使用了不同的字符集

2.Web应用中字符编码解码的问题

    (1)请求过程:

        <1>GET请求

            浏览器端是以UTF-8进行编码,所以在服务器端也应该以UTF-8进行解码

            由于GET请求参数附着在URL地址后面,所以要统一的URL地址的解码字符集。

        解决办法:

            在tomcat配置文件server.xml中找到第一个connector加入如下属性 URIEncoding=UTF-8

        <2>POST请求

            在获取请求参数前执行:request.setCharacterEncoding("UTF-8");

    (2)响应过程

        (1)指定响应数据的编码字符集

        (2)告诉浏览器响应数据应该使用什么字符集进行解码

            <1>Tomcat服务器会自动根据“解码字符集”设置“编码字符集”

            <2>设置编码字符集:告诉浏览器当前响应数据的内容类型:response.setContentType("text/html;charset=UTF-8");需要注意的是,需要在response.getWriter();之前设置,否则无效。

建议:

所有的过滤器都只对POST请求起作用,在jsp页面中设置字符编码方式,都只是对表单提交时的POST请求起作用,对GET请求不能起到设置其字符编码的作用,

在GET请求中使用的是默认的编码方式,所以对GET请求,需要在server.xml文件中设置URIEncoding="UTF-8"然后重启TOMCAT便可以实现解决中文乱码问题,

但是不建议在href超链接请求中传达中文参数,也不建议在GET请求中传递中文参数

另外对传递的部分中文实现传递和接收时的统一的编码方法在传达参数时使用"reply.jsp?title="+java.net.URLEncoder.encode(keywords)

然后在接收参数页面使用keywords=new String(request.getParameter("keywords").getBytes("8859_1"));这种方式虽然暂时解决了中文乱码问题,

但是在后期的维护和部署到其他的服务器时可以仍会会出现中文乱码了问题,所以不建议使用。

 

对于Post请求,只需在Servlet或者jsp中写入如下代码就可以把解决从表单中传入的中文乱码问题

 request.setCharacterEncoding("utf-8");

了解:

而对于Get请求,因为请求参数会被附加到地址栏的URL之后,所以不能用上面的处理方法。应该这样:

   String str=request.getQueryString();

   //使用URLDecoder解码字符串

   String str1=java.net.URLDecoder.decode(str,"utf-8");

   String[] paraStrings=str1.split("&");

    //paraStrings[0]就是第一个参数,依次类推...

   for(String paraString : paraStrings)

   {

         String[] nameValue=paraString.split("=");

         //nameValue[0]就是表单的name,nameValue[1]就是表单name对应的值

   }

还有一种方法就是获取请求参数之后对请求参数值重新编码,也就是先将其转换成字节数组,再将字节数组重新解码成字符串。

  String str=request.getParameter("name");

  byte[] bytes=str.getBytes("ISO-8859-1");

  String name=new String(bytes,"utf-8");

结论:传递中文参数时,最好使用POST请求来提交。不同服务器设置编码方式可能不同,不同操作系统设置编码方式也可能不同。

 

转载于:https://my.oschina.net/javaGeeker/blog/674528

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值