在我们初入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. python 去掉 pyc

    python 去掉 .pyc 在开发的机器上(Ubuntu),python自动生成的pyc文件太影响心情,把下面的语句添加到 /etc/profile中: # do not produce .pyc ...

  2. URLClassLoader

    package com.reflect.load; import java.net.URL; import java.net.URLClassLoader; import java.sql.Conne ...

  3. Android SDK工具(谷歌提供的16个工具)简介

    Android SDK包含了许多可以帮助你开发Android平台应用的工具.这些工具分为两类:一是SDK工具:而是平台工具.SDK工具独立于平台,任何开发Android应用的平台都需要配置.平台工具是 ...

  4. 《java入门第一季》之面向对象(构造方法)

    /* 构造方法: 给对象的数据进行初始化 格式: A:方法名与类名相同 B:没有返回值类型,连void都没有 C:没有具体的返回值 */ class Student { private String ...

  5. linux下播放组播流出现setsockopt:No such device错误

    在linux下播放组播流出现setsockopt:No such device错误是因为多播IP没有add路由表里面 可以采用如下命令完成: root@android:/ # busybox rout ...

  6. node.js 的url模块

    var URL = require('url');  var testUrl = "http://www.baidu.com:8080/index.php?content=abc" ...

  7. Android 常用的ORM框架详解

    1. OrmLite OrmLite 不是 Android 平台专用的ORM框架,它是Java ORM.支持JDBC连接,Spring以及Android平台.语法中广泛使用了注解(Annotation ...

  8. 增量会话对象——DeltaSession

    在集群环境中为了使集群中各个节点的会话状态都同步,同步操作是集群重点解决的问题,一般来说有两种同步策略,其一是每次同步都把整个会话对象传给集群中其他节点,其他节点更新整个会话对象:其二是对会话中增量修 ...

  9. ActiveMQ系列之五:ActiveMQ的Transport

    连接到ActiveMQ Connector:ActiveMQ提供的,用来实现连接通讯的功能.包括:client-to-broker.broker-to-broker. ActiveMQ允许客户端使用多 ...

  10. gdb中的define命令

    可以使用define命令达到类似于display的效果:比如每ni后显示当前5条指令: define s5 ni x/5i $pc end 甚至可以手动传入要显示指令的条数: define s ni ...