zoukankan      html  css  js  c++  java
  • GET请求中的乱码原理解析和解决方案

    2. 乱码问题解决

    基础知识

    1)浏览器会在中文的UTF-8后加上上%得到URL编码   例如: %e8%b4%b9%e7%94%a8%e6%8a%a5%e9%94%80

    2)以get的请求发送到tomcat服务器后又会以默认的(ISO8859-1)解码!!(tomcat7及以前版本是ISO8859-1)

    3)所以在action 中要先以ISO8859-1解码,在一UTF-8编码得到中文字符

    表单采用Post方式提交,解决乱码的方法为:

    request.setCharacterEncoding( myEncoding );

    表单采用Get方式提交,解决乱码的方法为:

    方式一:

    key = new String(key.getBytes("iso8859-1"), "utf-8");

    方式二:

    修改server.xml: URIEncoding="utf-8"

    默认情况下,tomcat使用的的编码方式:iso8859-1

    修改tomcat下的conf/server.xml文件

    找到如下代码:    
    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
    这段代码规定了Tomcat监听HTTP请求的端口号等信息。

    可以在这里添加一个属性:URIEncoding,将该属性值设置为UTF-8,即可让Tomcat(默认ISO-8859-1编码)以UTF-8的编码处理get请求。

    修改完成后:

    <Connector port="8080"  protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />

    http://localhost:8080/ItcastOA20160614/processDefinition_delete.action?key=%25E8%25B4%25B9%25E7%2594%25A8%25E6%258A%25A5%25E9%2594%2580%25E6%25B5%2581%25E7%25A8%258B

    方式三(不依赖Tomcat的配置,推荐):

    浏览器中两次URL编码。

    服务器中自己再做一次URL解码。

    原理:

    如果只进行一次encodeURI,得到的是UTF-8形式的URL,服务器端通过request.getParameter()解码查询参数(通常是iso-8859-1)就会得到乱码。

    如果进行两次encodeURI,第一次编码得到的是UTF-8形式的URL,第二次编码得到的依然是UTF-8形式的URL,但是在效果上相当于首先进行了一次UTF-8编码(此时已经全部转换为ASCII字符),再进行了一次iso-8859-1编码,因为对英文字符(ASCII字符)来说UTF-8编码和ISO-8859-1编码的效果相同。在服务器端,首先通过request.getParameter()自动进行第一次解码(可能是gb2312,gbk,utf-8,iso-8859-1等字符集,对结果无影响)得到ascii字符,然后再使用UTF-8进行第二次解码,通常使用java.net.URLDecoder("","UTF-8")方法。

    两次编码两次解码的过程为:

    UTF-8编码->UTF-8(iso-8859-1)编码->iso-8859-1解码->UTF-8解码,编码和解码的过程是对称的,所以不会出现乱码。

     

    自己

    <s:a action="processDefinitionAction_delete" onclick="return delConfirm()">

    <s:param name="key" value="%{@java.net.URLEncoder@encode(key, 'utf-8')}"></s:param>

    删除

    </s:a>

    %{@java.net.URLEncoder@encode(key, 'utf-8')}

    <s:a action="processDefinitionAction_delete" onclick="return delConfirm()">

    <s:param name="key" value="%{@java.net.URLEncoder@encode(key, 'utf-8')}">

    </s:param>

    删除

    </s:a>

    此处自己先编码一次,发出请求时,浏览器又会编码一次,所以是两次编码

    <script type="text/javascript">

        function showProcessImage( pdId ){

        // alert("原文:" + pdId);

        

        pdId = encodeURI(pdId);

        // alert("第一次URL编码:" + pdId);

        pdId = encodeURI(pdId);

        // alert("第二次URL编码:" + pdId);

        

                var url = "processDefinitionAction_downloadProcessImage.action?id=" + pdId + "&t=" + new Date();

                window.showModalDialog(url, null, "dialogHeight:500px;dialogWidth:600px;resizable:yes");

            }

    </script>

    此处需要自己编码两次

    总结:在页面encodeURI("url")后浏览器就不会给中文utf-8之后又加%,中间过程任何其他编码都是兼容英文(ASCII字符),所以在action代码里URLDecoder.decode("key","UTF-8")就可以了。

  • 相关阅读:
    Linux Virtual Server技术
    log4j+slf4j迁移到log4j2+slf4j (Servlet3.0)
    Android控件ToggleButton的使用方法
    Redis学习手冊(事务)
    游戏server之server优化思路
    Codeforces 474D Flowers (线性dp 找规律)
    【C语言】编写函数实现库函数atof
    unity3D游戏开发实战原创视频讲座系列7之消消乐游戏开发
    [WebGL入门]二十一,从平行光源发出的光
    TwoSum leetcode
  • 原文地址:https://www.cnblogs.com/keyi/p/7634446.html
Copyright © 2011-2022 走看看