在我们初入java编程之路的时候,面试往往会有一个面试题:get和post的区别是什么?那么你真的知道他们的区别吗?接下来抽丝剥茧,让我们看看get和post到底什么东西,首先从本质的角度看get和post并没有区别,因为get和post都是http协议做传递数据的方式,那么http又什么由什么编写的呢?是tcp/ip协议,那么我们是不是就可以理解为get和post也是这个东西,答案是是的,get和post就是tcp链接,区别只是传输方式的区别:

首先最直观的区别get的参数放在url里面而post的参数放在request body里面,但是单纯从技术的角度看,get也可以把参数放在request body里面,post也不是不可以把参数放在url里面,只是这样没有必要,有点傻;但是不同的服务器对于带有request body的方式处理也不一样,有的服务器会主动获取这些数据但是有的服务器不会主动获取这些数据的,所以使用get 加上request body 传输数据不一定会被接收到;

第二点就是一个安全问题,显而易见的一个问题,在登录的时候,我们肯定不会使用get方式传递你的用户名和密码,因为会被别有用心的人直接在url里面直接获取你的信息,但是post 把数据放在request body中,所以安全性对比是不言而喻的;

第三点是速度问题,我来简单介绍一下使用get发送请求的过程,在其中只会生成一次tcp包,把请求头和数据都发送给服务器,成功返回200ok,但是使用post便会生成两次tcp包,先把请求头发送给服务器,生成一次跟后台做交互,返回100 continue,然后再生成一次,把数据发给服务器,做交互成功之后返回200ok,也就是说get请求是无害的,但是post是有害的,因为他会再次请求,在这个过程中对比get会比post快一点,所以在项目中有些人就会为了用户需求把所有的可以用get的方法都使用get,但是在项目经验中,如果在网络连接良好的情况下,get和post所用的时间差是可以忽略不计的,但是有一点post方式在检验tcp包完整性的能力是get方式无论如何也赶不上的,并且并不是所有的浏览器在使用post的时候会生成两次tcp包,在我了解中在使用火狐浏览器的时候post就只会生成一次tcp包,还有一点就是不管get还是post

第四点就是传输参数的限制,很明显url传输数据,参数只能是传输文本,并且大小是有限制的,但是在request body传输就不一样了,你可以传输任意的参数,就算是一个文件也是可以的,get的参数大小限制在现阶段,并没有一个统一个标准,不同的浏览器有不同的标准,但是在2kb以内是安全的,大多数浏览器最大也只会处理64kb的参数,超出部分概不处理,但是反观post在理论上讲是不限制大小的,但是做过项目的人会知道,以web为例,在tomcat里面也会设置他的大小,所以不要天正的以为你可以随便搞

第五点,get请求的参数会被完整的保留在浏览器历史记录里面,但是post是不会保留的

好了,就整理以上五点吧,只想起这么多了,如果哪里不对的,欢迎大家留言指正。

post 和 get 的区别,直指本质的更多相关文章

  1. hive和hbase本质区别——hbase本质是OLTP的nosql DB,而hive是OLAP 底层是hdfs,需从已有数据库同步数据到hdfs;hive可以用hbase中的数据,通过hive表映射到hbase表

    对于hbase当前noSql数据库的一种,最常见的应用场景就是采集的网页数据的存储,由于是key-value型数据库,可以再扩展到各种key-value应用场景,如日志信息的存储,对于内容信息不需要完 ...

  2. Atitit.事件机制 与 消息机制的联系与区别

    Atitit.事件机制 与 消息机制的联系与区别 1. 消息/事件机制是几乎所有开发语言都有的机制,在某些语言称之为消息(Event),有些地方称之为(Message).1 2. 发布/订阅模式1 3 ...

  3. 浅谈C/C++引用和指针的联系和区别

    为什么C/C++语言使用指针? 答案:①一方面,每一种编程语言都使用指针.不止C/C++使用指针. 每一种编程语言都使用指针.C++将指针暴露给了用户(程序员),而Java和C#等语言则将指针隐藏起来 ...

  4. JavaScript对象原型写法区别

        体现对象原型分步式写法 //原型分步式写法 //构造函数 function Person(){} //对象原型 Person.prototype.name = 'Avensatr'; Pers ...

  5. volatile和synchronized的区别

    volatile和synchronized特点 首先需要理解线程安全的两个方面:执行控制和内存可见. 执行控制的目的是控制代码执行(顺序)及是否可以并发执行. 内存可见控制的是线程执行结果在内存中对其 ...

  6. HTTP协议中GET和POST方法的区别

    转载 通常的理解 w3schools关于这个问题的解答:HTTP 方法:GET 对比 POST 列出了一般的理解: 方法 GET POST 后退按钮/刷新 无害 数据会被重新提交(浏览器应该告知用户数 ...

  7. sizeof, strlen区别

    strlen与sizeof的区别 .sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型. 该类型保证能容纳实现所建立的最大对象的字节大小. .size ...

  8. git stash与git commit的区别

    问题的出现    写这篇文章的缘由是在工作中初次使用Git的时候遇到了一个奇怪的现象,即每次提交代码的时候,如果没有及时拉取代码就会导致本地库的代码不是最新的,这样自己修改代码之后想要push到远程仓 ...

  9. Socket网络通信——IO、NIO、AIO介绍以及区别

    一 基本概念 Socket又称"套接字",应用程序通常通过"套接字"向网路发出请求或者应答网络请求. Socket和ServerSocket类位于java.ne ...

随机推荐

  1. 从"按层次输出二叉树"到"求解二叉树深度"的总结

    本文是在学习中的总结,欢迎转载但请注明出处:http://write.blog.csdn.net/postedit/41964669 最近在刷LeetCode上的算法题,发现好多题目的解题思路大体是一 ...

  2. JQuery实战总结二 横向纵向菜单下拉效果图

    记得以前在浏览了大多数网站的上面发现很多下拉的导航栏,觉得特别好玩,毕竟咱们是学习编程的嘛,对这下拉的效果还是挺感兴趣的,这种淡入淡出,随着鼠标移动的位置不同.有无等而出现不同的效果,给用户以神美感. ...

  3. 调用bios喇叭发声

    话不多说,上代码: #include <windows.h> #include <iostream> #include <map> using namespace ...

  4. MTK Android software Tools工具的说明

    MTK发布的Android software Tools工具包,里面包含了很多的MTK工具,如下是简要说明及学习文档 MTK Android software Tools工具的说明如下: 工具 说明 ...

  5. 操作系统 - 死锁(Deadlock)的概述、条件、对策

    资源 可抢占资源(preemptable resource)可以从拥有它的进程中抢占而不会产生任何副作用,存储器就是一类可抢占的资源.可抢占资源有时有潜在的死锁危险,通常可以通过在进程之间重新分配资源 ...

  6. 让App中加入LruCache缓存,轻松解决图片过多造成的OOM

    上次有过电话面试中问到Android中的缓存策略,当时模糊不清的回答,现在好好理一下吧. Android中一般情况下采取的缓存策略是使用二级缓存,即内存缓存+硬盘缓存->LruCache+Dis ...

  7. RedHat系列软件管理(第二版) --二进制软件包管理

    RedHat系列软件管理 --二进制软件包管理 Linux学习思想-Linux相对与Windows来非常透明,因此,无论是系统,还是软件,都会有本身自带,或者是Man给提供的非常详细的说明/帮助文档, ...

  8. Libevent库学习笔记

    Libevent是一个事件触发的网络库,适用于windows.linux.bsd等多种平台,Libevent在底层select.pool.kqueue和epoll等机制基础上,封装出一致的事件接口.可 ...

  9. PHP基本的语法结构

    学过C语言的话,上手PHP语言就非常快了,如果你有bash shell的基础,那恭喜你,上手PHP会更快,我们先来了解一下一些比较简单的东西,界定符和注释在PHP中的写法: 一 php文档的语法结构 ...

  10. svn中出现各种感叹号说明

    黄色感叹号(有冲突): --这是有冲突了,冲突就是说你对某个文件进行了修改,别人也对这个文件进行了修改,别人抢在你提交之前先提交了,这时你再提交就会被提示发生冲突,而不允许你提交,防止你的提交覆盖了别 ...