post 和 get 的区别,直指本质
在我们初入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 的区别,直指本质的更多相关文章
- hive和hbase本质区别——hbase本质是OLTP的nosql DB,而hive是OLAP 底层是hdfs,需从已有数据库同步数据到hdfs;hive可以用hbase中的数据,通过hive表映射到hbase表
对于hbase当前noSql数据库的一种,最常见的应用场景就是采集的网页数据的存储,由于是key-value型数据库,可以再扩展到各种key-value应用场景,如日志信息的存储,对于内容信息不需要完 ...
- Atitit.事件机制 与 消息机制的联系与区别
Atitit.事件机制 与 消息机制的联系与区别 1. 消息/事件机制是几乎所有开发语言都有的机制,在某些语言称之为消息(Event),有些地方称之为(Message).1 2. 发布/订阅模式1 3 ...
- 浅谈C/C++引用和指针的联系和区别
为什么C/C++语言使用指针? 答案:①一方面,每一种编程语言都使用指针.不止C/C++使用指针. 每一种编程语言都使用指针.C++将指针暴露给了用户(程序员),而Java和C#等语言则将指针隐藏起来 ...
- JavaScript对象原型写法区别
体现对象原型分步式写法 //原型分步式写法 //构造函数 function Person(){} //对象原型 Person.prototype.name = 'Avensatr'; Pers ...
- volatile和synchronized的区别
volatile和synchronized特点 首先需要理解线程安全的两个方面:执行控制和内存可见. 执行控制的目的是控制代码执行(顺序)及是否可以并发执行. 内存可见控制的是线程执行结果在内存中对其 ...
- HTTP协议中GET和POST方法的区别
转载 通常的理解 w3schools关于这个问题的解答:HTTP 方法:GET 对比 POST 列出了一般的理解: 方法 GET POST 后退按钮/刷新 无害 数据会被重新提交(浏览器应该告知用户数 ...
- sizeof, strlen区别
strlen与sizeof的区别 .sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型. 该类型保证能容纳实现所建立的最大对象的字节大小. .size ...
- git stash与git commit的区别
问题的出现 写这篇文章的缘由是在工作中初次使用Git的时候遇到了一个奇怪的现象,即每次提交代码的时候,如果没有及时拉取代码就会导致本地库的代码不是最新的,这样自己修改代码之后想要push到远程仓 ...
- Socket网络通信——IO、NIO、AIO介绍以及区别
一 基本概念 Socket又称"套接字",应用程序通常通过"套接字"向网路发出请求或者应答网络请求. Socket和ServerSocket类位于java.ne ...
随机推荐
- Ubuntu 14 安装MySQL指南
ubuntu 14 安装MySQL指南安装MySQLsudo apt-get install mysql-server这个应该很简单了,而且我觉得大家在安装方面也没什么太大问题,所以也就不多说了,下面 ...
- 程序员的视角:java GC
GC(Garbage Collection 垃圾回收)的概念随着 java 的流行而被人们所熟知. 实际 GC 最早起源于20世纪60年代的 LISP 语言,是一种自动的内存管理机制. GC 要解决的 ...
- 学习OpenCV,GPU模块
如何使用opencv的gpu库呢?我这两天一直在搞这个事情,环境的配置见上文(转载),这里我先举个简单的例子,实现这样的功能:host读入一幅图像,加载到GPU上,在GPU上复制一份然后下传到host ...
- ffdshow 源代码分析 6: 对解码器的dll的封装(libavcodec)
===================================================== ffdshow源代码分析系列文章列表: ffdshow 源代码分析 1: 整体结构 ffds ...
- linux - 目录、文件默认属性: umask使用
一 权限掩码umask umask是chmod配套的,总共为4位(gid/uid,属主,组权,其它用户的权限),不过通常用到的是后3个,例如你用chmod 755 file(此时这文件的权限是属主读( ...
- Git与远程reposiory的相关命令
问题1:Git如何同步远程repository的分支(branch) 某天,小C同学问我,为啥VV.git仓库里面本来已经删除了branchA这个分支,但是我的mirror中还是有这个分支呢? 分析: ...
- Android高级控件(三)—— 使用Google ZXing实现二维码的扫描和生成相关功能体系
Android高级控件(三)-- 使用Google ZXing实现二维码的扫描和生成相关功能体系 摘要 现在的二维码可谓是烂大街了,到处都是二维码,什么都是二维码,扫一扫似乎已经流行到习以为常了,今天 ...
- 如何修改linux开机运行配置脚本
开机运行级别的配置角本 /etc/inittab 开机运行级别 init 是切换运行级别的指令 0.关机 //init0 1.单用户模式(自动获取超级用户权限,无网络,无服 ...
- 复位windows网络参数的方法
使用电脑的时候,经常会遇到网络相关的问题,以前读大学的时候就知道怎么解决,就是下面这个方案. 开始-全部程序-附件-命令提示符-右键-以管理员身份运行出来一个黑底白字的窗口,在里面输入: netsh ...
- LeetCode(46)-Remove Nth Node From End of List
题目: Given a linked list, remove the nth node from the end of list and return its head. For example, ...