Session与Cookie

-  什么是session?

session就是会话,会话就是session。

打开浏览器,然后进行一系列的操作,最后关闭浏览器。这整个过程就是一次会话。

-  为什么要有session?session有什么用?

session是用来保存会话状态的。用户在网页是否已经登陆?这个状态就需要用session来保存。

这也是为什么要有session。因为HTTP是一种无状态协议。所以想要获取会话状态,就必须要有“人”来负责保存会话状态,而这个“人”就是session。

HTTP之所以是无状态的,是因为当浏览器发送一次请求后,服务器会给出响应,响应结束后,浏览器与服务器之间连接的通道就会关闭。当初人家设计网站的时候也好、规定HTTP协议的时候也好,就是这个设计、这么规定的。这样做的好处就是减轻服务器的压力。不然可以试想一下:每次请求之后响应都结束了,通讯通道还打开着,是不是非常浪费资源呢?然后当用户多了之后,每次请求都是一个开着的通道,而每个用户都有很多次请求,那是不是会给到服务器很大的压力呢?[eg]举例来说,假设张三去商场买蛋糕,拿了一个桂花芋泥可颂和13块9毛钱给店员,店员在收银台记录完成后给张三说:“谢谢惠顾,欢迎下次光临!”。这样一次请求就结束了对吧。在例子中,张三是浏览器,店员是服务器。张三拿可颂🥐和钱💰给店员的行为是请求(request),店员给张三说话是响应(response),这样一次请求就完成了。接下来正常来讲,服务器就与浏览器之间的连接断开了,直到浏览器下一次发送请求,连接通道才会再次打开。现实里也是这样,帮张三收银完成后,店员便会去做其他的事情了,比方说给下一个顾客收银,又或者是打理打理前台。假设不是这样的,我就想让通道一直不关闭,那会怎么样呢?那我想应该就是店员帮张三收银完成之后,就一直盯着张三看,因此好处就是店员(服务器)能知道张三(浏览器)的一举一动,每时每刻的状态也能获悉,但是缺点就是压力太大,因为张三买单了,店员要看张三,李四来了又要同时看李四,等整个店人很多了,店员也就看不过来了,这时候店员(服务器)就垮了。所以,HTTP协议做成无状态的,就是为了减轻服务器端的压力。

- 什么是状态?状态有什么用?

从刚才的例子里,有一个疑问:假设店员与张三之间是有状态的,我们说那即使是张三付完了钱,店员依然要把注意力放在张三身上,那什么时候这个连接才会断开呢?张三都到家了,店员总不能还盯着张三吧?---对,答案其实比较好想了,就是当张三离开蛋糕店之后,店员就不用再管张三了。因此啊,张三是否在店里,就是状态。就好比我们在网站上登陆一样,登陆了,就是登陆状态,张三就在蛋糕店里面,张三可以查看蛋糕种类、价格,然后下单。这就是对应用户在登录之后可以享受网站的一些服务;张三不在店里,就是用户没有登录,张三就不能购买蛋糕,用户就不能获得网站的服务。

所以状态简单理解就是指用户是否登陆,状态不同,能获取的服务器服务就不同,例如不登陆就无法清空购物车。

由此我们解决了两个问题:1 会话状态是什么?简单来说就是登陆了是一种状态,没登陆是另一种状态。2 为什么HTTP协议是无状态的?为了减轻服务器压力。


所以说到这,应该就能明白session是用来干什么的了吧。---session就是那个用来保存会话状态的对象。

- 回归最初的问题,什么是session?session有什么用?

session是用来保存会话状态的对象,一个会话对应一个session,一个会话包含多次请求

session存在于服务器中。

之所以用session来保存会话状态,是因为HTTP是无状态的,即一次请求响应结束后,用户关闭浏览器这个动作服务器是不知道的,所以为了知道用户的状态,用session来保存。

- session的使用

session的获取

HttpSession session = request.getSession();从服务器获取当前session对象,如没有,则新建

HttpSession session = request.getSession(false);从服务器获取当前session对象,如没有,则返回null

session的销毁

session.invalidate();session的手动销毁方法

- session的实现原理

服务器中有一个session列表,(可以理解为Map集合),key部分是sessionid,value部分是session对象。

当用户第一次发送请求的时候,服务器会新建一个session对象,并赋一个sessionid给该对象,然后这个sessionid和session对象就成对的被存储在session列表中,然后服务器把sessionid返还给浏览器,浏览器则将这个id保存在浏览器的缓存中。

第二次再发送请求的时候,浏览器会将id一并发给服务器,然后服务器就会根据id找到session对象,接下来就可以从session对象中获取状态信息了。

[eg]这就好比体育课里拿排球🏐️,我很喜欢某个排球🏐️,于是我偷偷在上面做个标记,下次上课我专门找标记的排球🏐️拿,就能再次拿到。

- 为什么浏览器关闭,会话结束?

浏览器关闭,缓存清除,浏览器端保存的sessionid消失了。下次再打开浏览器的时候,没有sessionid一并发给服务器,自然就找不到session对象了,所以可以看做会话结束。

就好比在上一段的例子中,我虽然在排球🏐️上做了标记,但是我脑袋里不记得这个标记了,那下次是不是还是找不到我喜欢的那个排球🏐️了呢?

注意:此时,虽然找不到session了,但是这个session对象可能并没有销毁。

- session对象什么时候销毁?

两种情况:1 超时机制。2 手动销毁。

1 超时机制是设置session超时时间,超过这个时间还没有访问,则session自动销毁

2 手动销毁,即是上文提及的session.invalidate();方法,该方法一般用于网银等高安全要求的网站内的“安全退出”按钮。


刚才提到了session会有个sessionid用来“标记”session对象,其实这个sessionid就存储在Cookie中。

- Cookie

Cookie与Session的关联

前文说sessionid会随着请求一并传到服务器,具体的形式就是JSESSIONID=XXXXX...(32位)。

这个键值对就是cookie对象。cookie是被保存在浏览器的“运行内存”中的。

只要浏览器不关闭,用户每次发送请求,会自动将运行内存中的cookie发送给服务器的,接下来便是服务器根据cookie中的sessionid来获取session对象了。

Cookie保存在什么地方?

cookie最终是保存在浏览器客户端上的。底层来说,可以是保存在运行内存中(但是浏览器关闭cookie就消失了);也可以保存在硬盘文件里(永久保存)

Cookie有啥用?

和session一样,都是用于保存会话状态。小区别就是 session是保存在服务器端的,而cookie是保存在浏览器端的。

Cookie的应用案例

壹 在苏宁易购网站购物时,我将几件商品加入购物车之后,我关闭了浏览器之后,重新打开该网站发现我的商品仍在购物车中。

这是因为在我加入购物车的时候,商品id等信息保存在cookie中,我再次打开该网址的时候,会从cookie中读取商品id等相关信息,然后就可以动态展示购物车中商品信息了。

当然,cookie一删,就看不见购物车信息了。

贰 126邮箱的“十天内免登录”。这个是将账号密码等信息保存在cookie中,下次打开网址的时候自动从cookie中获取账号密码然后自动登录,从而实现“免登录”功能。

让Cookie失效的方法(那上一段中126邮箱为例)

超时机制(十天一过自动失效)、改密码(原cookie中的密码不对,自然是不能登陆)、删除设备中的cookie

Cookie的常用方法

Cookie cookie = new Cookie(key , value);创建cookie

cookie.setMaxAge(s); 设置cookie的有效时间,单位为秒

这个方法中若s>0,则cookie写在硬盘文件中。若s=0,则删除cookie(主要应用于删除同名cookie)。若s<0,则表示cookie不会被储存,和不设置cookie一样

cookie.setPath("/servlet13"); 这个表示只要是访问servlet13或其子路径的时候,都会自动将cookie提交给服务器。

Cookie[ ] cookies = request.getCookies(); 这个方法是用来获取cookie。如果没有cookie可以获取,则返回null,而不是长度为0的数组。这点细节要注意

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,273评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,349评论 3 398
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,709评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,520评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,515评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,158评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,755评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,660评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,203评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,287评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,427评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,122评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,801评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,272评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,393评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,808评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,440评论 2 359