`
zhang_yingjie
  • 浏览: 112033 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

参数传递中的编码问题(get和post方式)

    博客分类:
  • java
阅读更多
转载自http://www.iteye.com/topic/14980
做java的web开发有段日子了,有个问题老是困扰着我,就是乱码问题,基本上是网上查找解决方案(网上资料真的很多),都是一大堆的介绍如何解决此类的乱码问题,但是没几个把问题的来龙去脉说清楚的,有时候看了些文章后,以为自己懂了,但是在开发中乱码问题又像鬼魂一样出来吓人,真是头大了!这篇文章是我长时间和乱码做斗争的一些理解的积累,还希望有更多的朋友给出指点和补充。
  form有2中方法把数据提交给服务器,get和post,分别说下吧。
(一)get提交
  1.首先说下客户端(浏览器)的form表单用get方法是如何将数据编码后提交给服务器端的吧。
 
    对于get方法来说,都是把数据串联在请求的url后面作为参数,如:http://localhost:8080/servlet?msg=abc
(很常见的一个乱码问题就要出现了,如果url中出现中文或其它特殊字符的话,如:http://localhost:8080 /servlet?msg=杭州,服务器端容易得到乱码),url拼接完成后,浏览器会对url进行URL encode,然后发送给服务器,URL encode的过程就是把部分url做为字符,按照某种编码方式(如:utf-8,gbk等)编码成二进制的字节码,然后每个字节用一个包含3个字符的字符串 "%xy" 表示,其中xy为该字节的两位十六进制表示形式。我这里说的可能不清楚,具体介绍可以看下java.net.URLEncoder类的介绍在这里。了解了URL encode的过程,我们能看到2个很重要的问题,第一:需要URL encode的字符一般都是非ASCII的字符(笼统的讲),再通俗的讲就是除了英文字母以外的文字(如:中文,日文等)都要进行URL encode,所以对于我们来说,都是英文字母的url不会出现服务器得到乱码问题,出现乱码都是url里面带了中文或特殊字符造成的;第二:URL encode到底按照那种编码方式对字符编码?这里就是浏览器的事情了,而且不同的浏览器有不同的做法,中文版的浏览器一般会默认的使用GBK,通过设置浏览器也可以使用UTF-8,可能不同的用户就有不同的浏览器设置,也就造成不同的编码方式,所以很多网站的做法都是先把url里面的中文或特殊字符用 javascript做URL encode,然后再拼接url提交数据,也就是替浏览器做了URL encode,好处就是网站可以统一get方法提交数据的编码方式。 完成了URL encode,那么现在的url就成了ASCII范围内的字符了,然后以iso-8859-1的编码方式转换成二进制随着请求头一起发送出去。这里想多说几句的是,对于get方法来说,没有请求实体,含有数据的url都在请求头里面,之所以用URL encode,我个人觉的原因是:对于请求头来说最终都是要用iso-8859-1编码方式编码成二进制的101010.....的纯数据在互联网上传送,如果直接将含有中文等特殊字符做iso-8859-1编码会丢失信息,所以先做URL encode是有必要的。
   2。服务器端(tomcat)是如何将数据获取到进行解码的。
   第一步是先把数据用iso-8859-1进行解码,对于get方法来说,tomcat获取数据的是ASCII范围内的请求头字符,其中的请求url里面带有参数数据,如果参数中有中文等特殊字符,那么目前还是URL encode后的%XY状态,先停下,我们先说下开发人员一般获取数据的过程。通常大家都是request.getParameter("name")获取参数数据,我们在request对象或得的数据都是经过解码过的,而解码过程中程序里是无法指定,这里要说下,有很多新手说用 request.setCharacterEncoding("字符集")可以指定解码方式,其实是不可以的,看servlet的官方API说明有对此方法的解释:Overrides the name of the character encoding used in the body of this request. This method must be called prior to reading request parameters or reading input using getReader().可以看出对于get方法他是无能为力的。那么到底用什么编码方式解码数据的呢,这是tomcat的事情了,默认缺省用的是 iso-8859-1,这样我们就能找到为什么get请求带中文参数为什么在服务器端得到乱码了,原因是在客户端一般都是用UTF-8或GBK对数据 URL encode,这里用iso-8859-1方式URL decoder显然不行,在程序里我们可以直接
Java代码

   1. new String(request.getParameter("name").getBytes("iso-8859-1"),"客户端指定的URL encode编码方式") 


还原回字节码,然后用正确的方式解码数据,网上的文章通常是在tomcat里面做个配置
Xml代码

   1. <Connector port="8080" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000" redirectPort="8443" URIEncoding="GBK"/> 




这样是让tomcat在获取数据后用指定的方式URL decoder,URL decoder的介绍在这里


(一)post提交
1.客户端(浏览器)的form表单用post方法是如何将数据编码后提交给服务器端的。
  在post方法里所要传送的数据也要URL encode,那么他是用什么编码方式的呢?
   在form所在的html文件里如果有段<meta http-equiv="Content-Type" content="text/html; charset=字符集(GBK,utf-8等)"/>,那么post就会用此处指定的编码方式编码。一般大家都认为这段代码是为了让浏览器知道用什么字符集来对网页解释,所以网站都会把它放在html代码的最前端,尽量不出现乱码,其实它还有个作用就是指定form表单的post方法提交数据的 URL encode编码方式。从这里可以看出对于get方法来数,浏览器对数据的URL encode的编码方式是有浏览器设置来决定,(可以用js做统一指定),而post方法,开发人员可以指定。
2。服务器端(tomcat)是如何将数据获取到进行解码的。
如果用tomcat默认缺省设置,也没做过滤器等编码设置,那么他也是用iso-8859-1解码的,但是request.setCharacterEncoding("字符集")可以派上用场。

我发现上面说的tomcat所做的事情前提都是在请求头里没有指定编码方式,如果请求头里指定了编码方式将按照这种方式编码。
   有2篇文章推荐下,地址分别是
深入浅出URL编码:http://www.cnblogs.com/yencain/articles/1321386.html
表单用post方法提交数据时乱码问题:http://wanghuan8086.iteye.com/blog/173869

用post很重要的在form所在的html文件里如果有段<meta http-equiv="Content-Type" content="text/html; charset=字符集(GBK,utf-8等)"/>
强烈建议使用post提交
分享到:
评论

相关推荐

    JAVA POST与GET数据传递时中文乱码问题解决方法

    最近乱忙活弄了一个企业家宣传网站遇到了中文字符集乱码问题,在此分享一下即简单又实用的解决方法,感兴趣的朋友可以参考下哈

    有关Ajax中get和post的使用问题

    使用get遇到的问题: 1.问题一. 缓存:当每次访问的url相同,客户端直接读取本地缓存里面的内容,即使后台数据变化前台也不会有变化; 解决方法:在?后面链接一个num=【随机数Math.random()】或者num=【时间戳new ...

    在Ajax中使用get和post所遇到的问题及解决办法

    使用get遇到的问题: 1.问题一. 缓存:当每次访问的url相同,客户端直接读取本地缓存里面的内容,即使后台数据变化前台也不会有变化; 解决方法:在?后面链接一个num=【随机数Math.random()】或者num=【时间戳new...

    JQuery的Ajax中Post方法传递中文出现乱码的解决方法

    今天在做项目时,需要用到Ajax,之前我在用GET方式传递中文参数时,只需要在后台程序中设置页面编码为GB2312即中文能正常显示,可是这次由于表单项目较多,不适合用GET方式传递,只能用POST方式,但发现后台程序中...

    完美解决js传递参数中加号和&号自动改变的方法

    在action中用get方法获得参数,如果参数里有”+”,要做处理,否则到后台会变成空格。 解决方案: 1 、改用post方法; 2 、在 js 里用 url = encodeURI(encodeURI(XXX)) ,后台再解码一次; 3 、传递参数的时候直接...

    HttpHelper:对HttpClient进行封装,简化getpost操作

    例如,如果你想以Post方式,name=xxx为参数访问domain.com,则只需构建出helper对象,将参数放到map中,只需String result=helper.post("domaon.com",map);就可以方便的获得响应内容。 还有一个提取Cookie的方法,我...

    XDocAPI.pdf

    XDOC 以 HTTP 协议对外提供服务...参数名和值必需用 UTF-8 进行编码,内容比较多时需要用 POST 方式调用, 支持文件上传。内置参数以“_”开头,XDOC 服务器根据_func 参数的值做不同处理,_func 参数的默认值为 run。

    富头像上传编辑器演示

    如果之前的版本中有传递额外的参数到上传接口的,更新此版本后请自行修改接口文件中获取参数的方式。如:php的$_GET["x"]换成$_POST["x"]。 修复了将头像颜色调整工具隐藏(avatar_tools_visible=false)时,部分...

    CGI脚本入门学习--HTML格式

    目 录 CGI脚本是什么? CGI脚本 怎样工作的? 一个简单的例子 ... GET 和 POST URL 编码 问题 CGI 变量 解码程序 uncgi cgi-lib.pl 解码文件上传的输入 自己做 非解剖的头部脚本 总结

    JSP 表单处理

    浏览器中使用 GET 和 POST 方法向服务器提交数据。 GET 方法 GET方法将请求的编码信息添加在网址后面,网址与编码信息通过”?”号分隔。如下所示: http://www.mscto.com/hello?key1=value1&key2=value2 GET方法是...

    解决flask接口返回的内容中文乱码的问题

    写一个简单的例子程序: ...@app.route("/api", methods=["GET", "POST"]) def api(): if request.method == 'GET': return jsonify({"login status": "成功1"}) elif request.method == "POST": data = reques

    网页封包拦截器

    包含: POST 以及 GET 以及 Flash内的传输,而且可以自动分析数据类型以及数据结构,并且能够直接获取到Cookies,可以直接模拟POST或GET以及支持代理访问,能够自动转换网页数据内的编码。 网页封包拦截器内置浏览器...

    语言跟读小程序

    使用uploadFile-formData传递参数的时候,formData是个三项的JSON,PHP通过$_REQUEST尽然只能接到最后一个参数 PS:怀疑是微信的坑,后来使用的是将其以GET方式提交,才正常接到 在使用for循环的时候,用的是立即执行...

    黎活明android教程的全程PPT

    通过Post方式提交参数给Web应用 C.使用HttpClient开源项目提交参数给服务器 4&gt; 网络--通过HTTP协议实现文件上传 第五天 1&gt; 网络--通过HTTP协议发送XML数据,并调用webservice实现手机号归属地查询 2&gt; 网络--通过...

    jquery+ajax无刷新评论源码

    那就不必了,设置正确的页面编码和服务端脚本编码就不会出问题。由于jquery默认使用utf8传输数据,而且不提供设置编码, 这里只有自己做转换,如果你用form插件的时候就会发现,编码问题是不能回绝的。 完全开源,...

    project-pir-node:Node.js API Web服务器,用于向设备传递内容和数据

    项目节点Node.js API Web服务器,用于向设备传递内容和数据当前的API 浏览模型/查看每个模型中的内容,并找出所需的内容和不需要的内容家长资源GET /父母GET / parents?ids []或/ parents?ids-ID必须是一个数组GET...

    站长万能助手 v1.8.zip

    模拟get、post方式提交 自定义ID段进行提交数据信息进行宣传、破坏 可用于95%以上的wap网站进行发表文章、评论、发帖、发内线、回帖…… 可对一些如在线会员、发帖、文章进行提取,自动回复、宣传、采集 只需...

    Servlet 表单数据

    Servlet 表单数据 ...浏览器使用两种方法可将这些信息传递到 Web 服务器,分别为 GET 方法和 POST 方法。 GET 方法 GET 方法向页面请求发送已编码的用户信息。页面和已编码的信息中间用 ? 字符分隔,如下所示: ...

    知乎大神萧井陌web前端课程

    第2章 作业讲解、服务器框架、html和getpost传递参数 第3章 基本框架、框架解释、model解释 第4章 cookie讲解、session讲解、作业讲解和调试技巧 第5章 todo程序、todo的更新和删除、带用户功能的todo程序 第6章 ...

Global site tag (gtag.js) - Google Analytics