zoukankan      html  css  js  c++  java
  • HTTP请求的GET与POST方式的区别

    GET方法
    使用GET方法时,查询字符串(键值对)被附加在URL地址后面一起发送到服务器:

    /test/demo_form.jsp?name1=value1&name2=value2

    特点:

    ➤ GET请求能够被缓存

    ➤ GET请求会保存在浏览器的浏览记录中

    ➤ 以GET请求的URL能够保存为浏览器书签

    ➤ GET请求有长度限制

    ➤ GET请求主要用以获取数据

    POST方法
    使用POST方法时,查询字符串在POST信息中单独存在,和HTTP请求一起发送到服务器:

    POST/test/demo_form.jsp HTTP/1.1

    Host:w3schools.com

    name1=value1&name2=value2

    特点:

    ➤ POST请求不能被缓存下来

    ➤ POST请求不会保存在浏览器浏览记录中

    ➤ 以POST请求的URL无法保存为浏览器书签

    ➤ POST请求没有长度限制

    GET和POST的区别
    ✈ GET在浏览器回退时是无害的,而POST会再次提交请求。

    ✈ GET产生的URL地址可以被Bookmark(添加书签),而POST不可以。

    ✈ GET请求会被浏览器主动cache,而POST不会,除非手动设置。

    ✈ GET请求只能进行url编码,而POST支持多种编码方式。

    ✈ GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。

    ✈ GET请求在URL中传送的参数是有长度限制的,而POST没有。

    ✈ 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。

    ✈ GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。

    ✈ GET参数通过URL传递,POST放在Request body中。

    (本标准答案参考自w3schools)

    参考链接:

    https://blog.csdn.net/why15732625998/article/details/79451544

    Servlet 处理表单数据,这些数据会根据不同的情况使用不同的方法自动解析:

    • getParameter():您可以调用 request.getParameter() 方法来获取表单参数的值。
    • getParameterValues():如果参数出现一次以上,则调用该方法,并返回多个值,例如复选框。
    • getParameterNames():如果您想要得到当前请求中的所有参数的完整列表,则调用该方法。

     首先:Post传输数据时,不需要在URL中显示出来,而Get方法要在URL中显示。 
        其次:Post传输的数据量大,可以达到2M,而Get方法由于受到URL长度限制,只能传递大约1024字节. 
        再次:Post就是为了将数据传送到服务器段,Get就是为了从服务器段取得数据.而Get之所以也能传送数据,只是用来设计告诉服务器,你到底需要什么样的数据.Post的信息作为http请求的内容,而Get是在Http头部传输的。

    GET和POST的本质区别是什么?
            使用GET,form中的数据将编码到url中,而使用POST的form中的数据则在http协议的header中传输。在使用上,当且仅当请求幂等(字面意思是请求任意次返回同样的结果,本质是请求本身不会改变服务器数据和状态)时使用GET,当请求会改变服务器数据或状态时(更新数据,上传文件),应该使用POST。
    区别使用GET,POST意义何在?
    重复访问使用GET方法请求的页面,浏览器会使用缓存处理后续请求。使用POST方法的form提交时,浏览器基于POST将产生永久改变的假设,将让用户进行提交确认。当编成人员正确的使用GET,POST后,浏览器会给出很好的缓存配合,时响应速度更快。
    在form提交阶段的差别
    form提交的第一步是创建数据集,并根据ENCTYPE对数据集进行编码。ENCTYPE有两个值:multipart/form-data,application/x-www-form-urlencoded(默认值),前者可同时用于GET,POST,后者只用于POST。然后进行数据传输--对于GET方法,数据集使用content type application/x-www-form-urlencoded编码并附在url后面,在这种模式下,数据严格限制为ASCII码;对于POST,使用content type编码字符集并将其构造成消息发送。
    在服务器处理部分的差别
    原则上,除理GET和POST请求是没有分别的。但由于数据通过不同的方法编码,需要有不同的解码机制。所以,方法变化将导致处理请求的代码变化。比如对于cgi,处理GET时通过环境变量获得参数,处理POST请求时则通过标准输入(stdin) 获得数据。

    从使用经验,我们有如下总结:
    1、get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
    2、对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。两种方式的参数都可以用Request来获得。
    3、get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
    4、get安全性非常低,post安全性较高。
    5、<form method="get" action="a.asp?b=b">跟<form method="get" action="a.asp">是一样的,也就是说,action页面后边带的参数列表会被忽视;而<form method="post" action="a.asp?b=b">跟<form method="post" action="a.asp">是不一样的。

    参考链接:

    https://blog.csdn.net/Evankaka/article/details/45155047?utm_medium=distribute.pc_relevant.none-task-blog-searchFromBaidu-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-searchFromBaidu-2.control

    GET和POST区别详解

    1、Get是用来从服务器上获得数据,而Post是用来向服务器上传递数据。 
    2、Get将表单中数据的按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,而各个变量之间使用“&”连接;Post是将表单中的数据放在form的数据体中,按照变量和值相对应的方式,传递到action所指向URL。 
    3、Get是不安全的,因为在传输过程,数据被放在请求的URL中,而如今现有的很多服务器、代理服务器或者用户代理都会将请求URL记录到日志文件中,然后放在某个地方,这样就可能会有一些隐私的信息被第三方看到。另外,用户也可以在浏览器上直接看到提交的数据,一些系统内部消息将会一同显示在用户面前。Post的所有操作对用户来说都是不可见的。 
    4、Get传输的数据量小,这主要是因为受URL长度限制;而Post可以传输大量的数据,所以在上传文件只能使用Post(当然还有一个原因,将在后面的提到)。 
    5、Get限制Form表单的数据集的值必须为ASCII字符;而Post支持整个ISO10646字符集。默认是用ISO-8859-1编码 
    6、Get是Form的默认方法。

    以下的比较非常非常使用:

    转载自http://www.javaeye.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.javaeye.com/blog/173869 

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

    参考链接:

    https://blog.csdn.net/tangxiangpi/article/details/3995322?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

  • 相关阅读:
    教你开发jQuery插件(转)
    PHP7CMS 无条件前台GETSHELL
    如何利用GitHub搜索敏感信息
    YOU种你来丨i春秋校园行第一站北京电子科技学院
    超有料丨小白如何成功逆袭为年薪30万的Web安全工程师
    SQL基本注入演示
    从SQL注入到内网漫游
    与你有关丨微信可能隐藏着这样的安全隐患
    业务逻辑漏洞探索之敏感信息泄露
    Web安全之XSS Platform搭建及使用实践
  • 原文地址:https://www.cnblogs.com/rdchen/p/14048683.html
Copyright © 2011-2022 走看看