快速学习系列,图文并茂HTTP的GET和POSTCookie和Session
Posted 陆海潘江小C
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速学习系列,图文并茂HTTP的GET和POSTCookie和Session相关的知识,希望对你有一定的参考价值。
快速导航
前言
今天是一年一度“1024”程序员节,各位大佬节日快乐,继续码!!
本篇主要总结的就是HTTP的应用,HTTP是应用层的协议,本质是基于传输层的TCP协议实现的,在此基础上进行一个完整包装,就是用于网络传输的协议标准了。
在我们浏览网站、登录的操作中,就涉及到HTTP的数据传输,get和post就是最基本的动作。不过,get和post的特点有哪些、有什么区别,估计能回答一二,而更具体的内容,你还知道哪些呢?
另外,HTTP是无状态协议,如何记住用户的登录状态呢?**cookie和session,**就是其中的解决方案。
一、HTTP协议中GET和POST
1. get比post快
get耗时为post的2/3
,看一看它们的工作过程就明白了。
post请求过程
- 浏览器请求tcp连接(第一次握手)
- 服务器答应进行tcp连接(第二次握手)
- 浏览器确认,并发送post请求头(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)
- 服务器返回100 continue响应
- 浏览器开始发送数据
- 服务器返回200 ok响应
这里可见,post的工作过程是完成三次握手之后,才进行数据的传输,post请求的目的大多数是提交表单数据。第3和4步更好地验证数据的完整性。
再来看看get请求过程。
get请求过程
- 浏览器请求tcp连接(第一次握手)
- 服务器答应进行tcp连接(第二次握手)
- 浏览器确认,并发送get请求头和数据
- 服务器返回200 ok响应
get操作主要用来获取数据,然后呈现给用户。它确认服务器连接之后,第三步就开始传输数据了。
现在从get和post的请求过程看,post需要6步完成,get需要4步完成。
因此,get耗时大概为post的2/3
。
2.get是安全幂等性的
安全是指不会修改数据。这里的安全并不是指数据传输过程中的安全。
幂等性意味着对同一URL的多个请求应该返回同样的结果,用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。
比如,数学中的幂等函数:绝对值,abs(x) = abs(abs(x))
日常应用中的幂等:线上支付。
分布式中的幂等:kafka数据提交的幂等性。
3.get/post本质都是TCP连接
只是在HTTP的规定和各种浏览器/服务器的限制,才出现在应用中有所不同。
前面是HTTP的基本操作,在客户端/浏览器与服务器的通信中GET和POST的特点和区别。
HTTP是无状态协议,一次GET或者POST之后,两边就此结束刚刚的通信状态,请求和响应状态都不会保存下来。
当我们浏览商品网站,准备购买商品,会登录账号,选择一件商品,正要点击下单,但是说了HTTP是无状态的.
下单这个操作如何正确识别是哪个用户呢
如何记住用户的登录状态呢?cookie和session,就是其中的解决方案。
二、COOKIE和SESSION
1、cookie和session的关系
由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识别用户身份,这个机制就是session。
因此,服务端要为特定的用户创建特定的session,用于标识这个用户,并且跟踪用户行为。
在上面购买商品的例子中,服务端会创建该用户的session,保持会话状态。而在服务端的实现,则是将session保存在,缓存内存或数据库等。
说到这里,服务端到底是如何知道用户特点,来进行标识呢?——这就引申出cookie机制(HTTP状态管理机制
)
2、cookie机制
先来看看HTTP的首部字段信息,包含用户的信息。
首部名称 | 类型 | 描述 |
---|---|---|
From | 请求 | 用户email地址 |
User-Agent | 请求 | 用户的浏览器软件(名称+版本) |
Referer | 请求 | 从页面链接跳转过来的 |
Authorization | 请求 | 用户名和密码 |
Client-IP | 扩展(请求) | 客户端IP地址 |
X-Forwarded-For | 扩展 | 客户端IP地址 |
Cookie | 扩展 | 服务器产生的ID标签 |
由此看出,首部的这些字段信息,目的都是来标识一个用户,保证服务端可以识别身份信息。
以Client IP
(客户端IP)为例,早期可以作为一种标识使用,前提保证每个用户都有不同的IP地址。
现在,这种方法肯定不可行,识别用户存在许多缺点:
- IP地址是标识机器的,如果多个用户使用同一台机器,则无法区分。
- ISP动态分配IP地址,每次登录得到不同的地址。
- 为了提高安全性,并对稀缺的地址资源进行管理,都会通过NAT防火墙来隐藏实际IP地址,转换为一个共享的防火墙IP地址。
- 客户端通过会经过网关、代理服务器,Web服务器得到的不是客户端IP地址。
cookie,实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。
当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。
-
Set-Cookie:一个的cookie名和cookie值。
-
Expires:可选的。过期时间。
-
Domain:指定域。如baidu.com,至少包含二级域名,避免出现.com、.cn、.org
-
Path:URL后面指定路径,
例如'/'匹配域名下所有内容,/list匹配list下的内容
。 -
Secure:说明只有在HTTP使用SSL安全连接时才会发送cookie。
Java中把Cookie封装成了javax.servlet.http.Cookie
类。主要的属性和方法如下表格:
Cookie cookie = new Cookie("username","hello");// 新建Cookie
cookie.setMaxAge(Integer.MAX_VALUE);// 设置失效时间
cookie.setPath("/list/"); //设置路径
cookie.setSecure(true);//设置安全性
response.addCookie(cookie);// 添加发送到客户端
属 性 名 | 描 述 |
---|---|
String name | 该Cookie的名称。Cookie一旦创建,名称便不可更改 |
Object value | 该Cookie的值。如果值为Unicode字符,需要为字符编码。如果值为二进制数据,则需要使用BASE64编码 |
int maxAge | 该Cookie失效的时间,单位秒。如果为正数,则该Cookie在maxAge秒之后失效。如果为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie。默认为–1。 |
boolean secure | 该Cookie是否仅被使用安全协议传输。安全协议。安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false |
String path | 该Cookie的使用路径。如果设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为“/” |
String domain | 可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.” |
String comment | 该Cookie的用处说明。浏览器显示Cookie信息的时候显示该说明 |
int version | 该Cookie使用的版本号。0表示遵循Netscape的Cookie规范,1表示遵循W3C的RFC 2109规范 |
另外,cookie中设置了HttpOnly属性,js脚本将无法读取到cookie信息,这样能有效地防止XSS攻击,窃取cookie内容,这样就增加了cookie的安全性。
response.setHeader( "Set-Cookie" , "cookiename=httponlyTest;Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly");
3、session
Session是另一种记录客户状态的机制,保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上
。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
对比之下,cookie像是个人身份证,session像是档案表。
Java中的javax.servlet.http.HttpSession类
。
HttpSession session = request.getSession();// 获取Session对象
session.setAttribute("loginTime", new Date());// 设置Session中的属性
总结下来,cookie和session的特点是:
Cookie是客户端保存用户信息的一种机制
,用来记录用户的一些信息(账号密码、sessionID),也是实现Session的一种方式。
Session是在服务端保存的一个数据结构
,用来跟踪用户的状态,这个数据可以保存在缓存集群、数据库、文件中。
三、总结
这一篇总结的内容就是HTTP的基本操作GET和POST的详细特点,HTTP的无状态性,使得在get/post
之后,没有记录会话状态,因此,引申出cookie和session
的解决方案。
阅读之后,相信会有所收获,更好地梳理了这部分知识,面试时候如行云流水,offer++!
如果觉得不错欢迎“一键三连”
哦,点赞收藏关注,评论提问建议,欢迎交流学习!一起加油进步,我们下篇见!
本篇内容首发我的CSDN博客:https://csdn-czh.blog.csdn.net/article/details/120931996
以上是关于快速学习系列,图文并茂HTTP的GET和POSTCookie和Session的主要内容,如果未能解决你的问题,请参考以下文章
快速学习系列,图文并茂HTTP的GET和POSTCookie和Session
FineBI学习系列之FineBI与Spark数据连接(图文详解)
FineBI学习系列之FineBI与Amazon Redshift数据连接(图文详解)