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")就可以了。

  • 相关阅读:
    ThinkPHP 3.2.2 实现持久登录 ( 记住我 )
    Java实现 LeetCode 20 有效的括号
    Java实现 LeetCode 20 有效的括号
    Java实现 LeetCode 19删除链表的倒数第N个节点
    Java实现 LeetCode 19删除链表的倒数第N个节点
    Java实现 LeetCode 19删除链表的倒数第N个节点
    Java实现 LeetCode 18 四数之和
    Java实现 LeetCode 18 四数之和
    Java实现 LeetCode 18 四数之和
    Java实现 LeetCode 17 电话号码的字母组合
  • 原文地址:https://www.cnblogs.com/keyi/p/7634446.html
Copyright © 2011-2022 走看看