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 ...
随机推荐
- Leetcode_168_Excel Sheet Column Title
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42554641 Given a positive integ ...
- 使用GDAL工具对FY3系列卫星数据进行校正
本文档主要对如何使用GDAL提供的工具对FY3系列卫星数据进行校正处理.FY3系列卫星提供的数据一般是以HDF5格式下发,一个典型的FY3A和FY3B的数据文件名如下: FY3A_MERSI_GBAL ...
- 寻找春天 九宫格日记-2014.04.26
写九宫格日记 总会在听到某一首歌的时候泪流满面:总会在看到某个似曾相识的背影的时候惆怅莫名,总会在嗅到某种香味的时候默默发呆,总会在经过某个地方的时候频频回首.生命有限,不要把它浪费在重复别人的生活上 ...
- Kotlin For Android 示例代码实战
下面就为大家介绍怎么使用Kotlin来开发Android 上面这篇中我们在下载Kotlin插件的时候也下了一个功能扩张插件,其实这个插件大有用处,它可以使得我们在不使用注解和第三方库的情况下不使用fi ...
- 点击table中的某一个td,获得这个tr的所有数据
功能: 点击table中的某一个td,获得这个tr的所有数据 效果图 <html> <head> <script> function getData2(elemen ...
- 4.windows环境下如何安装memcached教程(转载+自己整理)
Memcached 是一个开源免费高性能的分布式内存对象缓存系统,能够加快网站访问速度和减轻数据库压力,本文向大家介绍下windows环境下如何安装memcached.百度经验:jingyan. ...
- Linux - grep的一些进阶选项
[root@www ~]# grep [-A] [-B] [--color=auto] '搜寻字串' filename 选项与参数: -A :后面可加数字,为 after 的意思,除了列出该行外,后续 ...
- 安卓笔记-- ListView点击和长按监听
其中点击监听为setOnItemClickListener() 具体实现代码如下 listView.setOnItemClickListener(new AdapterView.OnItemClick ...
- Android逆向分析(2) APK的打包与安装背后的故事
前言 上一次我们反编译了手Q,并遇到了Apktool反编译直接crash的问题,虽然笔者很想在这次解决这个问题,但在解决途中,发现该保护依赖于很多知识,所以本次先插入一下,正所谓知其然知其所以然,授之 ...
- Linux的关机详解
Linux如果是关机不想Windows,特别是命令界面.如果使用的是虚拟机,我们经常通过虚拟机来关闭.有点笨重啊.着特意找到关于Linux关机命令分享给大家. 在linux下一些常用的关机/重启命令有 ...