zoukankan      html  css  js  c++  java
  • GET&&POST请求编码过程

    编码、解码

      我们在开发过程中不可避免的一个话题就是编码和解码,那么什么是编码什么是解码呢?为什么要进行编码和解码呢?下面我们一一分析!

    编码和解码的概念

      编码是信息从一种形式或格式转换为另一种形式的过程也称为计算机编程语言的代码简称编码。用预先规定的方法将文字、数字或其它对象编成数码,或将信息、数据转换成规定的电脉冲信号。编码在电子计算机电视、遥控和通讯等方面广泛使用。编码是信息从一种形式或格式转换为另一种形式的过程。解码,是编码的逆过程。例如:“我是中国人!”按照UTF-8编码后为我是中国人!

    为什么要进行编码和解码

      我们每逢谈到编码的时候都避不开中文的编解码问题,但是为什么中文要进行编解码呢,可不可以不进行编解码呢?要回答这个问题,必须要回答计算机是如何表示我们人类所能够理解的符号的,这些符号也就是我们人类所使用的语言。由于人类的语言太多,表示这些语言的符号太多,无法用计算机中的一个基本存储单元-----字节(byte)来表示,因而必须要经过拆分或一些翻译工作,才能让计算机理解我们的语言。我们可以把计算机能够理解的语言假定为英语,其他语言要能够在计算机中使用,必须得经过一次翻译,把它翻译成英语。这个翻译的过程就称之为编码。所以可以想象,只要不是说英语的国家,要使用计算机就必须经过编码。这看起来有些霸道,但这就是现状。这也和我国现在大力推广汉语一样,希望其他国家都会说汉语,以后其他语言都会被翻译成汉语,我们可以把在计算机中存储信息的最小单位改成汉字,这样就不存在编码问题了。

      所以总起来说,编码的原因可以总结为一下几条:

    1. 在计算机中存储信息的最小单位是一个字节,即8bit,所以能表示的字符范围是0-255个。【即可以做个比方:比如0000 0007 用来代表一个字符‘我’,那么1byte就只能最多用来表示255个字符】
    2. 人类要表示的字符太多,无法用一个字节来完全表示【汉字远远超出255个】

    要解决这个矛盾必须要有一个新的数据结构char,而从char到byte必须经过编码。

     GET和POST请求的编码过程

      我们在处理用户请求的时候处理最多的请求方式就是GET和POST请求,相对来说处理编码问题也多在这两种请求上,下面我们就来看一下这两种请求的编码过程,不过在了解编码过程之前我们先来看一下两种请求方式的比较;【多一嘴:Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。到这里,大家应该有个大概的了解了,GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。】

    1、Get是用来从服务器上获得数据(没有请求体,用于请求查询,参数在URL中),而Post是用来向服务器上传递数据(包含请求体)。 

    2、Get将表单中数据的按照variable=value的形式,添加到action(服务)所指向的URL后面,并且两者使用“?”连接,而各个变量之间使用“&”连接;Post是将表单中的数据放在form的数据体中,按照变量和值相对应的方式,传递到action所指向URL。 

    3、Get是不安全的,因为在传输过程,数据被放在请求的URL中,而如今现有的很多服务器、代理服务器或者用户代理都会将请求URL记录到日志文件中,然后放在某个地方,这样就可能会有一些隐私的信息被第三方看到。另外,用户也可以在浏览器上直接看到提交的数据,一些系统内部消息将会一同显示在用户面前。Post的所有操作对用户来说都是不可见的。 

    4、Get传输的数据量小,因为受URL长度限制GET方式提交的数据最多只能是1024字节;Post可以传输大量的数据(理论上数据大小没有限制),所以在上传文件只能使用Post(当然还有一个原因,将在后面的提到)。 

    5、Get限制Form表单的数据集的值必须为ASCII字符;而Post支持整个ISO10646字符集。默认是用ISO-8859-1编码 

    6、Get是Form的默认方法。

    form有2种方法把数据提交给服务器,get和post,分别说: 

    Get

    1.客户端(浏览器)编码 

      对于get方法来说,都是把数据串联在请求的url后面作为参数,如:http://localhost:8080/servlet?msg=abc。如果url中出现中文或其它特殊字符的话,如:http://localhost:8080 /servlet?msg=杭州,浏览器会对url进行URL encode,然后发送给服务器。URL encode的过程就是把部分url做为字符,按照某种编码方式(如:utf-8,gbk等)编码成二进制的字节码,然后每个字节用一个包含3个字符的字符串 "%xy" 表示,其中xy为该字节的两位十六进制表示形式,具体介绍可以看下Java.NET.URLEncoder类,我们能看到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.服务器端解码

       第一步是先把数据用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里面做个配置Xml代码 : 

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

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

    post

    1.客户端(浏览器)编码

    在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默认缺省设置,也没做过滤器等编码设置,那么他也是用iso-8859-1解码的,但是request.setCharacterEncoding("字符集")可以派上用场。 我发现上面说的tomcat所做的事情前提都是在请求头里没有指定编码方式,如果请求头里指定了编码方式将按照指定的方式编码。

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

    参考文章:http://www.cnblogs.com/yencain/articles/1321386.html

    注:以上文章部分摘抄自网络,忘记注明出处,多望海涵,若有侵权请告知,加以改之!

  • 相关阅读:
    .net中使用JQuery Ajax判断用户名是否存在的方法
    简单的SqlHelper
    C#中邮件的发送基本操作
    身份证号码组成 含代码
    C#和asp.net中链接数据库中 参数的几种传递方法
    【转】iptables 命令介绍
    sed的替换命令
    【转】sed 的参数
    【转】sed正则表达式
    【转】shell中如何判断一个变量是否为空
  • 原文地址:https://www.cnblogs.com/lin-jing/p/7192612.html
Copyright © 2011-2022 走看看