`
syq891015
  • 浏览: 11735 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

get和post请求编码方式

    博客分类:
  • http
阅读更多

 

     引用地址

做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篇文章推荐下,地址分别是 
http://www.cnblogs.com/yencain/articles/1321386.html; 
http://wanghuan8086.iteye.com/blog/173869

分享到:
评论

相关推荐

    后台模拟发送GET和POST请求

    本文将深入探讨如何利用Java的HttpClient库在后台模拟发送GET和POST请求,以及如何处理中文乱码问题。 首先,我们来理解GET和POST两种请求方法。GET请求通常用于获取服务器上的资源,它将参数附加到URL中,具有可...

    解决了中文乱码的http的get和post请求demo

    本篇将详细讲解如何处理中文乱码问题,特别是在HTTP的GET和POST请求中。参考文档来源于CSDN博主的文章,我们将围绕这个主题进行深入探讨。 首先,我们需要理解中文乱码问题产生的原因。当HTTP请求发送含有中文字符...

    tomcat GET请求与POST请求

    3. **跨域请求**:CORS(跨源资源共享)规则可能对GET和POST请求有不同的处理方式,需要正确配置Tomcat以允许跨域请求。 4. **错误处理**:无论哪种请求,都需要适当的错误处理机制,以提供清晰的错误消息并防止信息...

    get、post请求中文乱码处理方式一

    本文将详细阐述GET和POST请求中文乱码的处理方式,以帮助开发者解决这类问题。 首先,我们需要了解为什么会出现中文乱码。在HTTP请求中,数据通常是按照ASCII编码进行传输的,而中文字符通常使用UTF-8或其他多字节...

    AFN做GET和POST请求

    本教程将详细讲解如何使用AFN进行GET和POST请求,以及如何处理返回的数据。 首先,我们需要导入AFNetworking库。如果你使用CocoaPods管理依赖,可以在Podfile中添加`pod 'AFNetworking'`,然后执行`pod install`。...

    java HttpClient 发送GET请求和带有表单参数的POST请求教程例子

    ### Java HttpClient 发送GET请求和带有表单参数的POST请求详解 ...通过上述示例和解释,你应该能够理解和掌握如何使用Java HttpClient库来发送GET和POST请求,这对于开发Web应用程序或与API接口交互至关重要。

    android 后台 get和post请求数据

    总结,Android后台发送GET和POST请求主要涉及HTTP协议的使用、数据编码、网络请求库的选择以及异步处理。理解这些知识点对于开发能与服务器进行有效通信的Android应用至关重要。在处理过程中,要注意数据的安全性和...

    http get post 请求接口工具类

    本主题主要关注的是通过GET和POST方式与服务器进行交互的工具类,以及相关的安全措施,如参数加密、RSA签名和字符集转换。 1. **HTTP请求方式**: - GET:GET请求是最常见的HTTP方法,用于从服务器获取资源。它将...

    C#实现http协议GET、POST请求

    首先创建了一个 `WebClient` 对象,并设置了其编码方式为系统默认编码。然后调用 `DownloadString` 方法发送 GET 请求并接收返回的数据,最后将结果打印出来。 #### POST 请求 与 GET 不同的是,POST 请求通常用于...

    Express获取get和post传过来的参数

    总结,Express通过`req.query`和`req.body`提供了一种直观的方式来获取GET和POST请求的参数。在实际项目中,我们还需要根据Content-Type正确配置中间件,如`body-parser`和`multer`,以便正确解析不同类型的POST请求...

    HttpClient实现POST GET和文件下载

    接下来,我们将分别讲解HttpClient如何实现GET和POST请求: 1. GET请求: 使用HttpGet类创建GET请求,指定目标URL。例如: ```java HttpGet httpGet = new HttpGet("http://example.com"); CloseableHttpClient...

    VC++演示GETPOST发送请求的HTTP客户端

    在这个"VC++演示GET/POST发送请求的HTTP客户端"项目中,我们将探讨如何利用C++实现HTTP协议的GET和POST方法,这两个方法是Web应用中最常用的数据传输方式。 GET方法通常用于请求服务器上的资源,它的参数以查询字符...

    VBS的函数集-读写二进制文件,UTF8文件,HTTP GET和POST

    * HTTP GET和POST请求的区别和应用场景 * Base64编码的原理和应用 * ADODB.Stream对象的使用和优点 * 二进制文件和文本文件的读写操作 五、实践应用 * 使用VBS语言和ADODB.Stream对象来实现文件读写操作 * 使用Get...

    android 网络请求框架,包涵get,post请求,图片上传,图片上传包涵表单上传,及基于okhttp封装的请求方法

    总的来说,这个Android网络请求框架结合了GET和POST的灵活性,以及OkHttp的高效性,为开发者提供了便捷的图片上传功能。通过合理的封装和设计,它简化了网络请求的复杂性,使开发者能够专注于业务逻辑,提高开发效率...

    ajax POST 与GET提交的区别

    在探讨AJAX中GET和POST的区别之前,我们先来了解一下这两种请求方式的基本概念。 **GET**请求通常用于获取资源信息,它将参数拼接到URL后面,并通过URL传输数据。这种方式适合于那些不会更改服务器状态的操作,例如...

    安卓网络通信之通过GET和POST方式提交参数给web应用

    对于GET和POST请求,可以创建`StringRequest`或`JsonObjectRequest`,并在请求体中设置参数。 对于POST请求,`Volley`的`JsonObjectRequest`允许直接传入一个`JSONObject`,而`StringRequest`则需要重写`getParams...

    Tomcat中Get和Post出现乱码的解决办法

    "Tomcat中Get和Post出现乱码的解决办法" 在 Tomcat 中,Get 和 Post 方法都可能出现乱码问题,这主要是由于编码问题引起的。在本文中,我们将详细介绍 Tomcat 中 Get 和 Post 方法出现乱码的解决办法。 一、乱码...

    服务器端测试GET、POST

    在实际的Web项目(如压缩包中的"WebProject")中,开发者通常会创建一个接口,该接口能够接收GET和POST请求,并处理接收到的数据。服务器端的测试通常包括验证这些接口是否能正确接收和处理各种类型的请求,以及在...

    iOS移动应用开发 GET和POST两种基本请求方法的区别.pdf

    在iOS开发中,使用像NSURLSession或Alamofire这样的网络库时,可以方便地设置GET和POST请求,以及自定义请求头、超时时间等。在使用GET时,需要注意URL编码问题,而POST则可以支持多种编码方式,如JSON或表单编码。...

    GET方式和POST方式.pdf

    【GET方式与POST方式的区别】 ... 1. **数据传输方向** ...总之,GET和POST各有优缺点,选择哪种方式取决于应用场景和数据的安全性需求。正确处理字符编码问题,是防止乱码出现的关键,也是Web开发中必不可少的技能。

Global site tag (gtag.js) - Google Analytics