Http无状态
Http是无状态协议,是指协议对于交互性场景没有记忆能力。
举个例:
无状态:
魔都的老王开了一个会所,一个开会的地方,有大会议室、小会议室、Cosplay情景会议室。
顾客听说这个会所有特色,于是纷纷前来消费,小明就是其中的一员。小明上次会议室体验很棒,尽管有点贵,本周又前来消费。
结账时,小明以为老王认识自己,和老王套近乎弄个优惠价:“王老板,我上周刚来过,打个折扣呗”!
老王很茫然地瞅着小明:“上周你来过?我好像一点印象也没有了嘛,很抱歉,无法优惠”!
小明很不爽地付完钱走人…
有状态:
老王有一个助手叫小王,看到这一幕于是和老板有一番对话:
小王:老板,下次客人来消费,咱们给客人发一张小卡片,来一次打卡一次,凡是打过卡的,都有优惠。来的次数越多,折扣力度越大,这样就能有更多的回头客,您看如何?
老王连说这是好主意,以后就这么干!
小明第一次来领了一张考勤卡,打了卡夹在钱包里。
第二次来消费埋单时,小明从自己的钱包掏出考勤卡,老王一看原来是回头客,好说好说,88折优惠,小明和老王都笑的合不拢嘴…
HTTP本身是一个无状态的[连接协议],为了支持客户端与服务器之间的交互,我们就需要通过不同的技术为交互存储状态,而这些不同的技术就是会话技术(Cookie,Session)了。
由于HTTP是一种无状态的协议,服务器单纯从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。
Cookie
客户姓名 | 小明 |
---|---|
消费次数 | 50 |
会议室类型 | *** |
服务员类型 | *** |
后来老王觉得考勤卡上,还应该多记录一些内容,才能更好地服务客户,考勤卡上慢慢增加了更多内容:
会员卡片样例:
小明再次来消费时,不仅可以优惠,还可以根据小明的消费习惯,做出最合理的安排。随着服务的精细化,小卡片上描述客户的信息越来越多,卡片越做越大,由于小卡片受4K字节的限制,,每次客户前来消费都要携带大大的卡片,这很夸张!
Session Cookie
小王寻思着,小卡片一直都是客户携带,为何不在公司的电脑上弄个数据库,记录客户的消费习惯,每个客户有一个数据库明细:
客户代号 | 08029snne3e0kekll0jeis007 |
---|---|
客户姓名 | 小明 |
消费次数 | 50 |
会议室类型 | *** |
服务员类型 | 肤白貌美 |
更多内容 | … |
给小明的小卡片上只要有一个客户代号“08029snne3e0kekll0jeis007”就可以了,查询电脑就可以知道是小明,消费完还可以从账户余额内扣除。
这个客户代号就是SessionID,通常保存在客户端浏览器的Cookie里,故称之为 Session Cookie。
上文故事中的**“Stateless”、“Stateful”、“Cookie”、“Session ID”以及“Session Cookie”**与http协议中这些关键词具有相类似的意思。
http最初的设计是无状态的(stateless),但是无状态的http无法满足互联网日益发展的需求,于是业界扩展了http协议,增加了有状态(stateful)协议头,使之变成一个有状态协议。
这个有状态的协议头,就是依靠Cookie来实现的,Cookie是维系客户端与服务器之间状态同步的纽带。
所谓状态同步,通俗地说就是“记忆同步”!
会话技术(Cookie,Session)
会话技术:
会话:浏览器访问服务器端,发送多次请求,接受多次响应。直到有一方断开连接。会话结束。
功能:可以使用会话技术,在一次会话的多次请求之间共享数据。
分类:
- 客户端会话技术 Cookie
- 服务器端会话技术 Session
Cookie:
1. 概念:客户端会话技术,将数据保存到客户端
2. 快速入门:
```java
//1. 创建Cookie对象,绑定数据
* new Cookie(String name, String value)
//2. 发送Cookie对象
* response.addCookie(Cookie cookie)
//3. 获取Cookie,拿到数据
* Cookie[] request.getCookies()
```
3. 实现原理
* 基于响应头set-cookie和请求头cookie实现
-
cookie的细节
-
一次可以发送多个cookie
-
默认情况下,当浏览器关闭后,Cookie数据被销毁
-
持久化存储:
* setMaxAge(int seconds) 1. 正数:将Cookie数据写到硬盘的文件中。持久化存储。并指定cookie存活时间,时间到后,cookie文件自动失效 2. 负数:默认值 3. 零:删除cookie信息
- cookie共享问题
setPath(String path):设置cookie的获取范围。默认情况下,设置当前的虚拟目录 * 如果要共享,则可以将path设置为"/" setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享 setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie可以共享
-
-
Cookie的特点和作用
cookie存储数据在客户端浏览器
浏览器对于单个cookie的大小有限制(4kb)以及 对用一个域名下的总cookie数量也有限制(20个)
Session:
- 概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。
- 快速入门:
//1. 获取HttpSession对象:
HttpSession session = request.getSession();
//2. 使用HttpSession对象:
Object getAttribute(String name)
void setAttribute(String name, Object value)
void removeAttribute(String name)
-
原理
- Session的实现是依赖于Cookie的
-
细节
-
session在服务器关闭是被销毁
-
session默认失效时间是30分钟
-
选择性配置修改
<session-config>
<session-timeout>30</session-timeout>
</session-config>
- 特点
- session用于存储一次会话的多次请求的数据,存在服务器端
- session可以存储任意类型,任意大小的数据
session与Cookie的区别:
- session存储数据在服务器端,Cookie在客户端
- session没有数据大小限制,Cookie有
- session数据安全,Cookie相对于不安全