转载自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等)"/>
分享到:
相关推荐
在JSP页面中处理中文参数传递时,无论是GET还是POST请求,关键在于保持字符编码的一致性和正确性。对于GET请求,推荐使用URL编码来规避编码问题;对于POST请求,重点在于接收端正确设置字符编码。此外,开发者还应...
在谷歌翻译API的GET调用中,翻译内容会编码后附加到API请求的URL上。尽管URL有长度限制(一般浏览器限制在2048个字符左右),但谷歌翻译API对使用GET方法时翻译内容的长度并无特定限制。这意味着你可以传递相对较长...
这两种方法的安全性和可缓存性也有所不同,GET请求的参数显示在URL上,易于被记录,而POST请求的数据则包含在请求体中,相对更安全。 在C#中,我们可以使用`System.Net.Http`命名空间下的HttpClient类来发送HTTP...
JSP 页面中文参数的传递(get 和 post 方法分析) JSP 页面中文参数的传递是非常有用的,在实际的编程中,我们常常遇到需要在 JSP 页面切换中传递中文字符。有两种方式可以实现中文参数的传递,即 URL 方式和 FORM ...
本篇将详细介绍如何在Express中获取这两种请求方式传递的参数。 **GET请求参数** GET请求通常用于获取资源,其参数通常包含在URL的查询字符串中。在Express中,我们可以使用`req.query`对象来获取GET请求的参数。...
然而,在处理中文参数时,尤其是通过GET和POST方法传递时,经常会出现乱码问题。这通常是由于字符编码不一致或者处理不当导致的。以下是对这一问题的详细解析: 首先,我们需要理解字符编码的基本概念。在Web中,...
在这个VB.NET的示例中,我们主要关注的是如何使用GET和POST方法通过DLL(动态链接库)与Web服务进行交互。VB.NET是一种流行的编程语言,尤其在开发Windows应用程序时,而Web服务则提供了一种跨平台、跨语言的数据...
### jsp中post和get传输方式的区别 在Web开发领域,特别是使用Java Server Pages (JSP) 进行网页开发时,GET与POST是两种最常见的HTTP请求方法。这两种方法各有其适用场景及特点,理解它们之间的区别对于提高网站的...
在IT行业中,网络通信是不可或缺的一部分,而URL编码、GET和POST提交以及乱码问题则是开发者经常遇到的技术挑战。本文将深入探讨这些知识点,并提供相应的解决方案。 首先,URL编码是因URL(统一资源定位符)中不能...
在JSP中,参数通常通过GET和POST方法在页面之间传递,但是直接在URL中包含中文字符会导致问题,因为HTTP协议本身是基于ASCII字符集设计的。因此,在涉及中文参数传递时,必须采取相应措施来确保字符能够正确传输和...
总结,"超强过滤器"是解决JSP-Servlet之间中文参数GET-POST传递问题的有效手段,通过统一设定请求的字符编码,确保在整个Web应用中中文数据能够正确无误地传输和处理。对于大型项目,这样的全局解决方案可以大大提升...
- 在处理响应时,注意编码问题,例如上述代码中的“UTF-8”。 - 如果在生产环境中使用,建议使用`CloseableHttpClient`代替`DefaultHttpClient`,以利用其更好的资源管理机制。 通过上述示例和解释,你应该能够理解...
GET请求的数据通过URL查询字符串传递,因此长度有限,并且在浏览器历史记录和缓存中可见。 2. POST方法:POST方法常用于向服务器发送数据,创建新资源或更新现有资源。与GET不同,POST请求的数据放在请求体中,可以...
在探讨AJAX中GET和POST的区别之前,我们先来了解一下这两种请求方式的基本概念。 **GET**请求通常用于获取资源信息,它将参数拼接到URL后面,并通过URL传输数据。这种方式适合于那些不会更改服务器状态的操作,例如...
### GET与POST的数据编码问题 在处理中文或其他非ASCII字符时,GET和POST的处理方式有所不同: - **GET**:数据会进行URL编码,将非ASCII字符转换为"%xx"的形式,其中"xx"是该字符的十六进制表示。这通常会导致中文...
2. 请求参数编码问题:GET和POST请求在传递参数时,如果没有正确设置字符编码,中文字符可能会被错误地编码为字节流,导致接收端解码失败。 3. 页面编码设置错误:网页的编码设置如果不正确,展示的中文字符也可能...
由于参数直接在URL中显示,所以GET请求不适合传递敏感信息。此外,GET请求会被浏览器缓存,可能导致安全问题。 POST方法则更为复杂,常用于提交表单数据或上传文件。POST请求的数据被封装在请求体中,不会显示在URL...
- Tomcat同样默认使用ISO-8859-1编码解码POST请求中的参数。 - 可以通过`request.setCharacterEncoding("UTF-8")`设置编码,但这必须在调用任何获取参数的方法之前完成。 - 如果使用了`Content-Type`指定字符集,...
- 安全性:POST比GET更安全,因为GET将数据直接暴露在URL中,而POST将数据隐藏在请求体中。 - 可见性:GET请求的数据对所有人可见,POST请求的数据对用户不可见。 - 数据量:GET有长度限制,POST无明确限制,理论上...
在这个例子中,我们创建了一个`GetMethod`对象,并在URL中直接传递了GET参数。然后,同样执行请求并处理响应。 总的来说,Apache HttpClient库为Java开发者提供了强大且灵活的工具,能够轻松处理HTTP请求和响应。...