引用地址
做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显然不行,在程序里我们可以直接
- new String(request.getParameter("name").getBytes("iso-8859-1"),"客户端指定的URL encode编码方式")
还原回字节码,然后用正确的方式解码数据,网上的文章通常是在tomcat里面做个配置
- <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篇文章推荐下,地址分别是
http://www.cnblogs.com/yencain/articles/1321386.html;
http://wanghuan8086.iteye.com/blog/173869
相关推荐
本文将深入探讨如何利用Java的HttpClient库在后台模拟发送GET和POST请求,以及如何处理中文乱码问题。 首先,我们来理解GET和POST两种请求方法。GET请求通常用于获取服务器上的资源,它将参数附加到URL中,具有可...
3. **跨域请求**:CORS(跨源资源共享)规则可能对GET和POST请求有不同的处理方式,需要正确配置Tomcat以允许跨域请求。 4. **错误处理**:无论哪种请求,都需要适当的错误处理机制,以提供清晰的错误消息并防止信息...
无论是GET还是POST请求,都需要确保客户端和服务器之间对字符编码的一致理解。通过阅读提供的文档和示例代码,你可以更好地理解和掌握这一技巧。在实际开发中,这将有助于避免因乱码问题引发的诸多困扰。
### Java HttpClient 发送GET请求和带有表单参数的POST请求详解 #### 一、概述 在Java编程中,处理HTTP请求是一项常见的需求,特别是在与Web服务进行交互时。Apache HttpClient库提供了一种强大的方法来执行HTTP...
你可以通过阅读和分析这两个文件,了解在实际项目中如何具体实现MFC的HttpClient GET和POST请求。 总结来说,MFC的HttpClient使得开发者能够方便地与HTTP服务器交互,执行GET和POST请求。通过理解HTTP协议的基本...
本教程将详细讲解如何使用AFN进行GET和POST请求,以及如何处理返回的数据。 首先,我们需要导入AFNetworking库。如果你使用CocoaPods管理依赖,可以在Podfile中添加`pod 'AFNetworking'`,然后执行`pod install`。...
本文将详细阐述GET和POST请求中文乱码的处理方式,以帮助开发者解决这类问题。 首先,我们需要了解为什么会出现中文乱码。在HTTP请求中,数据通常是按照ASCII编码进行传输的,而中文字符通常使用UTF-8或其他多字节...
总结,Android后台发送GET和POST请求主要涉及HTTP协议的使用、数据编码、网络请求库的选择以及异步处理。理解这些知识点对于开发能与服务器进行有效通信的Android应用至关重要。在处理过程中,要注意数据的安全性和...
首先创建了一个 `WebClient` 对象,并设置了其编码方式为系统默认编码。然后调用 `DownloadString` 方法发送 GET 请求并接收返回的数据,最后将结果打印出来。 #### POST 请求 与 GET 不同的是,POST 请求通常用于...
- Base64是一种编码方式,将二进制数据转化为ASCII字符串,便于在网络上传输。在HTTP请求中,Base64常用于对图片、证书等二进制数据进行编码,使其能够作为文本内容发送。 综上所述,"http get post 请求接口工具...
总结,Express通过`req.query`和`req.body`提供了一种直观的方式来获取GET和POST请求的参数。在实际项目中,我们还需要根据Content-Type正确配置中间件,如`body-parser`和`multer`,以便正确解析不同类型的POST请求...
接下来,我们将分别讲解HttpClient如何实现GET和POST请求: 1. GET请求: 使用HttpGet类创建GET请求,指定目标URL。例如: ```java HttpGet httpGet = new HttpGet("http://example.com"); CloseableHttpClient...
总的来说,理解和实现GET/POST请求对于任何希望构建与Web服务交互的C++应用程序的开发者来说都是基础技能。这个VC++示例项目提供了一个很好的起点,让你能够深入理解HTTP客户端的工作原理,并将其应用于实际的项目...
在探讨AJAX中GET和POST的区别之前,我们先来了解一下这两种请求方式的基本概念。 **GET**请求通常用于获取资源信息,它将参数拼接到URL后面,并通过URL传输数据。这种方式适合于那些不会更改服务器状态的操作,例如...
本文将深入探讨一个专为Android设计的网络请求框架,它支持GET、POST请求,具备图片上传功能,并且是基于OkHttp库进行封装的。 首先,GET和POST是HTTP协议中最常见的两种请求方法。GET主要用于获取资源,其参数通过...
* HTTP GET和POST请求的区别和应用场景 * Base64编码的原理和应用 * ADODB.Stream对象的使用和优点 * 二进制文件和文本文件的读写操作 五、实践应用 * 使用VBS语言和ADODB.Stream对象来实现文件读写操作 * 使用Get...
总结来说,理解GET和POST请求的工作原理,以及如何处理中文乱码问题,对于开发和测试服务器端功能至关重要。这涉及到HTTP协议、字符编码、客户端与服务器之间的交互,以及测试策略等多个方面,都是IT专业人士必备的...
对于GET和POST请求,可以创建`StringRequest`或`JsonObjectRequest`,并在请求体中设置参数。 对于POST请求,`Volley`的`JsonObjectRequest`允许直接传入一个`JSONObject`,而`StringRequest`则需要重写`getParams...
Tomcat 中 Get 和 Post 方法出现的乱码问题可以通过设置编码方式或使用特殊的方法来解决。理解 Tomcat 对于 GET 和 POST 方法的编码处理方式是解决这个问题的关键。 六、相关知识点 * Tomcat 中 Get 和 Post 方法...
发送HTTPS POST请求是实现客户端与服务器间安全交互的一种常见方式。 #### 二、HTTPS与POST请求 1. **HTTPS**:一种基于TCP/IP的应用层协议,用于安全传输Web页面。它使用SSL/TLS加密技术,在客户端和服务器之间...