Session和Cookie

session

什么是会话?

我们可以简单的认为,用户打开浏览器,进行一系列操作,然后最终将浏览器关闭,这个整个过程叫做:一次会话。

会话在服务器端也有一个对应的java对象,这个java对象叫做:session

什么是一次请求?

用户在浏览器上点击了一下,然后到页面停下来,可以粗略认为是一次请求。请求对应的服务器端的java对象是:request

一个会话当中包含多次请求(一次会话对应N次请求)

Session从何而来

  1. 在java的servlet规范当中,session对应的类名:HttpSession(jarkata.servlet.http.HttpSession)
  2. session机制属于B/S结构的一部分。如果使用php语言开发WEB项目,同样也是有session这种机制的。session机制实际上是一个规范。然后不同的语言对这种会话机制都有实现。
  3. session对象最主要的作用是:保存会话状态。(用户登录成功了,这是一种登录成功的状态,你怎么把登录成功的状态一直保存下来呢?使用session对象可以保留会话状态。)

为什么需要session对象来保存会话状态呢?

因为HTTP协议是一种无状态协议

什么是无状态:

  • 请求的时候,B和S是连接的,但是请求结束之后,连接就断了。

为什么要这么做?HTTP协议为什么要设计成这样?

  • 因为这样的无状态协议,可以降低服务器的压力。请求的瞬间是连接的,请求结束之后,连接断开,这样服务器压力小。

只要B和S断开了,那么关闭浏览器这个动作,服务器知道吗?

  • 不知道。服务器是不知道浏览器关闭的。

我们举个例子来理解一下:

张三打开一个浏览器A,李四打开一个浏览器B,访问服务器之后,在服务器端会生成:

  • 张三专属的session对象
  • 李四专属的session对象

为什么不使用request对象,ServletContext对象保存会话状态?

  • request.setAttribute()存
  • request.getAttribute()取,ServletContext也有这个方法。
  • request是请求域。ServletContext是应用域。

原因

  1. request是一次请求一个对象。
  2. ServletContext对象是服务器启动的时候创建,服务器关闭的时候销毁,这个ServletContext对象只有一个。
  3. ServletContext对象的域太大。
  • request请求域(HttpServletRequest)、session会话域(HttpSession)、application域(ServletContext)

  • request < session < application

session对象的实现原理

先看下面这行代码

HttpSession session = request.getSession();

这行代码很神奇。张三访问的时候获取的session对象就是张三的。李四访问的时候获取的session对象就是李四的。

实现原理:

  • JSESSIONID=xxxxxx 这个是以Cookie的形式保存在浏览器的内存中的。浏览器只要关闭。这个cookie就没有了。
  • session列表是一个Map,map的key是sessionid,map的value是session对象。
  • 用户第一次请求,服务器生成session对象,同时生成id,将id发送给浏览器。
  • 用户第二次请求,自动将浏览器内存中的id发送给服务器,服务器根据id查找session对象。
  • 关闭浏览器,内存消失,cookie消失,sessionid消失,会话等同于结束

Sessino对象存储到哪?

img2023031401.png

Cookie禁用

cookie禁用是什么意思?

服务器正常发送cookie给浏览器,但是浏览器不要了,拒收了。并不是服务器不发了。

如果SessionId在服务器上匹配不到。每一次请求都会获取到新的session对象。

cookie禁用了,session机制还能实现吗?

所以大部分的网站都是这样设计的:你要是禁用cookie,你就不能使用他们的网站。


Cookie

session的实现原理中,每一个session对象都会关联一个sessionid,例如:

  • JSESSIONID=41C481F0224664BDB28E95081D23D5B8
  • 以上的这个键值对数据其实就是cookie对象。
  • 对于session关联的cookie来说,这个cookie是被保存在浏览器的“运行内存”当中。
  • 只要浏览器不关闭,用户再次发送请求的时候,会自动将运行内存中的cookie发送给服务器。
  • 例如,这个Cookie: JSESSIONID=41C481F0224664BDB28E95081D23D5B8就会再次发送给服务器。

服务器就是根据41C481F0224664BDB28E95081D23D5B8这个值来找到对应的session对象的。

Cookie存储

cookie可以保存在运行内存中。(浏览器只要关闭cookie就消失了。)

cookie也可以保存在硬盘文件中。(永久保存。)

cookie作用

  • cookie和session机制其实都是为了保存会话的状态。
  • cookie是将会话的状态保存在浏览器客户端上。(cookie数据存储在浏览器客户端上的。)
  • session是将会话的状态保存在服务器端上。(session对象是存储在服务器上。)

为什么要有cookie和session机制呢?

因为HTTP协议是无状态,无连接协议

cookie的经典案例

在远古时期的京东商城,在未登录的情况下,向购物车中放几件商品。然后关闭商城,再次打开浏览器,访问京东商城的时候,购物车中的商品还在,这是怎么做的?我没有登录,为什么购物车中还有商品呢?

  • 将购物车中的商品编号放到cookie当中,cookie保存在硬盘文件当中。这样即使关闭浏览器。硬盘上的cookie还在。下一次再打开京东商城的时候,查看购物车的时候,会自动读取本地硬盘中存储的cookie,拿到商品编号,动态展示购物车中的商品。
  • 京东存储购物车中商品的cookie可能是这样的:productIds=xxxxx,yyyy,zzz,kkkk
  • 注意:cookie如果清除掉,购物车中的商品就消失了。

126邮箱中有一个功能:十天内免登录

这个功能也是需要cookie来实现的。

用户输入正确的用户名和密码,并且同时选择十天内免登录。登录成功后。浏览器客户端会保存一个cookie,这个cookie中保存了用户名和密码等信息,这个cookie是保存在硬盘文件当中的,十天有效。在十天内用户再次访问126的时候,浏览器自动提交126的关联的cookie给服务器,服务器接收到cookie之后,获取用户名和密码,验证,通过之后,自动登录成功。

怎么让cookie失效?

  1. 设置时间到期自动失效
  2. 改密码
  3. 黑客攻击
  4. 在客户端浏览器上清除cookie、

cookie机制必要性

cookie机制和session机制其实都不属于java中的机制,实际上cookie机制和session机制都是HTTP协议的一部分。php开发中也有cookie和session机制,只要是你是做web开发,不管是什么编程语言,cookie和session机制都是需要的。

HTTP协议中规定:任何一个cookie都是由name和value组成的。name和value都是字符串类型的。

在java的servlet中,对cookie提供了哪些支持呢?

  • 提供了一个Cookie类来专门表示cookie数据。jakarta.servlet.http.Cookie
  • java程序怎么把cookie数据发送给浏览器呢?response.addCookie(cookie)

在HTTP协议中是这样规定的:当浏览器发送请求的时候,会自动携带该path下的cookie数据给服务器。(URL)

关于cookie的有效时间

设置cookie在一小时之后失效

cookie.setMaxAge(60 * 60);
  1. 没有设置有效时间:默认保存在浏览器的运行内存中,浏览器关闭则cookie消失。

  2. 只要设置cookie的有效时间 > 0,这个cookie一定会存储到硬盘文件当中。

  • 设置cookie的有效时间 = 0

    • cookie被删除,同名cookie被删除。
  • 设置cookie的有效时间 < 0

    • cookie将会保存在运行内存中,和不设置cookie有效时间一样

关于cookie的path关联的路径

假设现在发送的请求路径是“http://localhost:8080/servlet13/cookie/generate”生成的cookie,如果cookie没有设置path,默认的path是什么?

手动设置cookie的path

cookie.setPath(“/servlet13”); 

表示只要是这个servlet13项目的请求路径,都会提交这个cookie给服务器。

服务器的java程序如何接收cookie

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

推荐阅读更多精彩内容

  • 这篇文章的出发点是为了整理Session与Cookie相关知识点,以免在相关概念混淆或分不清的时候到处查阅资料,这...
    maxwellyue阅读 501评论 0 6
  • 前言 在 Web 应用程序中(通俗点,可以理解成一个网站),Session 和 Cookie 是两个非常重要的概念...
    努力挣钱_ee3d阅读 71评论 0 0
  • JavaWeb会话技术 HTTP通信协议的特点: 1.应答式的协议,只能是客户端先发送请求然后服务器作出响应。 2...
    艾特小师叔阅读 261评论 0 0
  • 会话 什么是会话 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整...
    海洋_5ad4阅读 558评论 0 0
  • - 什么是session? session就是会话,会话就是session。 打开浏览器,然后进行一系列的操作,最...
    YuZhiqi阅读 108评论 0 0