【Tomcat】get,put,post,delete含义与区别

GET操做是安全的。所谓安全是指无论进行多少次操做,资源的状态都不会改变。好比我用GET浏览文章,无论浏览多少次,那篇文章还在那,没有变化。固然,你可能说每浏览一次文章,文章的浏览数就加一,这不也改变了资源的状态么?这并不矛盾,由于这个改变不是GET操做引发的,而是用户本身设定的服务端逻辑形成的。
        PUT,DELETE操做是幂等的。所谓幂等是指无论进行多少次操做,结果都同样。好比我用PUT修改一篇文章,而后在作一样的操做,每次操做后的结果并无不一样,DELETE也是同样。顺便说一句,由于GET操做是安全的,因此它天然也是幂等的。
        POST操做既不是安全的,也不是幂等的,好比常见的POST重复加载问题:当咱们屡次发出一样的POST请求后,其结果是建立出了若干的资源。
        安全和幂等的意义在于:当操做没有达到预期的目标时,咱们能够不停的重试,而不会对资源产生反作用。从这个意义上说,POST操做每每是有害的,但不少时候咱们仍是不得不使用它。
        还有一点须要注意的就是,建立操做可使用POST,也可使用PUT,区别在于POST 是做用在一个集合资源之上的(/uri),而PUT操做是做用在一个具体资源之上的(/uri/xxx),再通俗点说,若是URL能够在客户端肯定,那么就使用PUT,若是是在服务端肯定,那么就使用POST,好比说不少资源使用数据库自增主键做为标识信息,而建立的资源的标识信息究竟是什么只能由服务端提供,这个时候就必须使用POST。
  
        关于GET POST 的混淆
        先说相同点,只有了解了相同点以后才能理解为何会发生混淆。
        二者都能向服务器发送数据,提交的“内容”[注1]的格式相同,都是javascript

Java代码 java

 收藏代码

  1. var_1=value_1&var_2=value_2&....  

        get 和 post 区别如字面,一个是get(获取),一个是post(发送)。程序员

        get用来告诉服务器须要获取哪些内容(uri+query),向静态页面(uri)请求则直接返回文件内容给浏览器,向一个动态页面请求时能够提供查询参数(query)以得到相应内容。数据库

        post用来向服务器提交内容,主要是为了提交,而不是为了请求内容,就是说post的初衷并不要求服务器返回内容[注2],只是提交内容让服务器处理(主要是存储或者处理以后再存储)。浏览器

        get和post出现混淆是由于对提交的数据处理方法的滥用形成的,数据是无辜的。安全

        混淆之一:
        将get提交的用来查询的字段看成是存储数据存入了服务器端文件或者数据库。而后就误觉得get是用来提交用于存储的数据的。服务器

        混淆之二:
        编写脚本在服务器端经过处理post提交的数据并返回内容。只要有数据,就能用来进行判断,脚本怎写是程序员的事,而不在意数据来源的形式(post、get,或者是本身预设值的常量)。这点功能上确实没问题,只是背离的其初始目的而已。网络

        因为都是要传送数据,且数据格式相同(即便数据格式不一样,只要能提取出相应数据)。使用的时候不免出现张冠李戴,将get数据用来存储、将post数据用来检索返回数据。可是两者仍是有区别的(主要是根据其用途而“人为”形成的),get的长度限制在2048字节(由浏览器和服务器限制的,这是目前IE的数据,曾经是1024字节),很大程度上限制了get用来传递“存储数据”的数据的能力,因此仍是老老实实用来作检索吧;post则无此限制(只是HTTP协议规范没有进行大小限制,但受限于服务器的处理能力),所以对于大的数据(通常来讲须要存储的数据可能会比较大,比2048字节大)的传递有自然的优点,谁让它是 nature born post 呢。app

        get提交的数据是放在url里,目的是灵活的向服务其提交检索请求,能够在地址栏随时修改数据以变动须要获取的内容,好比直接修改分页的编号就跳到另一个分页了(固然也多是 404)。post提交的数据放在http请求的正文里,目的在于提交数据并用于服务器端的存储,而不容许用户过多的更改相应数据(主要是相对于在url 修改要麻烦不少,url的修改只要点击地址栏输入字符就能够了),除非是专门跑来编辑数据的。框架

        PS:post和get的安全性在传输的层面上区别不大,可是采用url提交数据的get方式容易被人肉眼看到,或者出如今历史纪录里,仍是可能被肉眼看到,都是一些本地的问题。

        注1:我强调的是内容,至于http协议中的get和post的格式你们有兴趣就本身看看吧。
        注2:get方式主要是为了得到预期内容,即uri+query相同时所获得的内容应该是相同的。而post主要是提交内容,至因而否有必要返回页面可能只是出于用户体验,好比注册时返回你的注册id,可是若是只是返回一个“您已注册成功”的相同页面(即便你post的数据不同)也没什么好奇怪的。
        注3:关于这个“人为”,不是那么贴切,get和post仍是有技术层面的区别的。可是从表象上看暂且这么说吧,毕竟两者的混淆也是“人为”的。

 

        HTTP POST GET 本质区别 
        原理区别

        通常在浏览器中输入网址访问资源都是经过GET方式;在FORM提交中,能够经过Method指定提交方式为GET或者POST,默认为GET提交 Http定义了与服务器交互的不一样方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE URL 全称是资源描述符,咱们能够这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查 ,改 ,增 ,删 4个操做。到这里,你们应该有个大概的了解了,GET通常用于获取/查询 资源信息,而POST通常用于更新 资源信息(我的认为这是GET和POST的本质区别,也是协议设计者的本意,其它区别都是具体表现形式的差别 )。            根据HTTP规范,GET用于信息获取,并且应该是安全的和幂等的 。            1.所谓安全的意味着该操做用于获取信息而非修改信息。换句话说,GET请求通常不该产生反作用。就是说,它仅仅是获取资源信息,就像数据库查询同样,不会修改,增长数据,不会影响资源的状态。    * 注意:这里安全的含义仅仅是指是非修改信息。            2.幂等的意味着对同一URL的多个请求应该返回一样的结果。这里我再解释一下幂等 这个概念:    幂等 (idempotent、idempotence)是一个数学或计算机学概念,常见于抽象代数中。            幂等有如下几种定义:对于单目运算,若是一个运算对于在范围内的全部的一个数屡次进行该运算所得的结果和进行一次该运算所得的结果是同样的,那么咱们就称该运算是幂等的。好比绝对值运算就是一个例子,在实数集中,有abs(a) = abs(abs(a)) 。            对于双目运算,则要求当参与运算的两个值是等值的状况下,若是知足运算结果与参与运算的两个值相等,则称该运算幂等,如求两个数的最大值的函数,有在在实数集中幂等,即max(x,x) = x 。 看完上述解释后,应该能够理解GET幂等的含义了。            但在实际应用中,以上2条规定并无这么严格。引用别人文章的例子:好比,新闻站点的头版不断更新。虽然第二次请求会返回不一样的一批新闻,该操做仍然被认为是安全的和幂等的,由于它老是返回当前的新闻。从根本上说,若是目标是当用户打开一个连接时,他能够确信从自身的角度来看没有改变资源便可。          根据HTTP规范,POST表示可能修改变服务器上的资源的请求 。继续引用上面的例子:仍是新闻以网站为例,读者对新闻发表本身的评论应该经过POST实现,由于在评论提交后站点的资源已经不一样了,或者说资源被修改了。            上面大概说了一下HTTP规范中,GET和POST的一些原理性的问题。但在实际的作的时候,不少人却没有按照HTTP规范去作,致使这个问题的缘由有不少,好比说:                    1.不少人贪方便,更新资源时用了GET,由于用POST必需要到FORM(表单),这样会麻烦一点。           2.对资源的增,删,改,查操做,其实均可以经过GET/POST完成,不须要用到PUT和DELETE。            3.另一个是,早期的可是Web MVC框架设计者们并无有意识地将URL看成抽象的资源来看待和设计 。还有一个较为严重的问题是传统的Web MVC框架基本上都只支持GET和POST两种HTTP方法,而不支持PUT和DELETE方法。   

相关文章
相关标签/搜索