apache 设置session超时时间_深入分析 Session 和 Cookie,看这篇就对了

点击上方 "程序员小乐"关注, 星标或置顶一起成长

第一时间与你相约

每日英文

Promise yourself to be so strong that nothing can disturb your peace of mind.

对自己承诺:我要强大到任何事情都无法破坏我内心的平和。

每日掏心话

每一发奋努力的背后,必是有加倍的赏赐。莫要去找借口失败,只找理由成功。也许现在你正面临一些困难,但是你别忘了,生活总是在向前,明天总是会更好。

来自:PatrickLee666 | 责编:乐乐

链接:juejin.im/post/5b7c1f4d6fb9a019f221ca14

a1fb4bfef8cfc43f4614c859f5cabdc5.png
程序员小乐(ID:study_tech)第 717 次推文 图片来自网络

往日回顾:你还在傻傻的从零搭建项目 ?看完这篇你就明白了!

正文

为什么需要cookie和session

在Web发展史中,我们知道浏览器与服务器间采用的是 http协议,而这种协议是无状态的,所以这就导致了服务器无法知道是谁在浏览网页,但很明显,一些网页需要知道用户的状态,例如登陆,购物车等。

所以为了解决这一问题,先后出现了四种技术,分别是隐藏表单域,URL重写,cookie,session,而用的最多也是比较重要的就是cookie和session了。

Cookie

是什么

cookie是浏览器保存在用户电脑上的一小段文本,通俗的来讲就是当一个用户通过 http访问到服务器时,服务器会将一些 Key/Value键值对返回给客户端浏览器,并给这些数据加上一些限制条件,在条件符合时这个用户下次访问这个服务器时,数据通过请求头又被完整地给带回服务器,服务器根据这些信息来判断不同的用户。

也就是说, cookie是服务器传给客户端并保存在客户端的一段信息,这个 Cookie是有大小,数量限制的!!

Cookie的创建

当前 Cookie有两个版本,分别对应两种设置响应头:“Set-Cookie”和 “Set-Cookie2”。在Servlet中并不支持Set-Cookie2,所以我们来看看Set-Cookie的属性项:

e2e67d4248daacdcd77856566d8d4713.png

这些属性项,其他的都说的很清楚了,我们来看看Domain有什么用:

现在,我们假设这里有两个域名:

域名A:a.b.f.com.cn 域名B:c.d.f.com.cn

显然,域名A和域名B都是 f.com.cn的子域名

  • 如果我们在域名A中的Cookie的domain设置为f.com.cn,那么f.com.cn及其子域名都可以获取这个Cookie,即域名A和域名B都可以获取这个Cookie

  • 如果域名A和域名B同时设置Cookie的doamin为f.com.cn,那么将出现覆盖的现象

  • 如果域名A没有显式设置Cookie的domain方法,那么domain就为a.b.f.com.cn,不一样的是,这时,域名A的子域名将无法获取这个Cookie

好的,现在了解完了Set-Cookie的属性项,开始创建Cookie

Web服务器通过发送一个称为Set-Cookie的http消息来创建一个Cookie:

Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]

这里我们思考一个问题,当我们在服务器创建多个Cookie时,这些Cookie最终是在一个Header项中还是以独立的Header存在的呢?

bfff909a6079d583874379b05890e2c1.png

我们可以看到,构建http返回字节流时是将Header中所有的项顺序写出,而没有进行任何修改。所以可以想象在浏览器在接收http返回的数据时是分别解析每一个Header项。

接着,在客户端进行保存,如何保存呢?这里又要对Cookie进行进一步的了解

Cookie的分类

  • 会话级别Cookie:所谓会话级别Cookie,就是在浏览器关闭之后Cookie就会失效。

  • 持久级别Cookie:保存在硬盘的Cookie,只要设置了过期时间就是硬盘级别Cookie。

好的,现在cookie保存在了客户端,当我们去请求一个URL时,浏览器会根据这个URL路径将符合条件的Cookie放在请求头中传给服务器。

Session

Cookie是有大小限制和数量限制的,并且越来越多的Cookie代表客户端和服务器的传输量增加,可不可以每次传的时候不传所有cookie值,而只传一个唯一ID,通过这个ID直接在服务器查找用户信息呢?答案是有的,这就是我们的session。

Session是基于Cookie来工作的,同一个客户端每次访问服务器时,只要当浏览器在第一次访问服务器时,服务器设置一个id并保存一些信息(例如登陆就保存用户信息,视具体情况),并把这个id通过Cookie存到客户端,客户端每次和服务器交互时只传这个id,就可以实现维持浏览器和服务器的状态,而这个ID通常是NAME为JSESSIONID的一个Cookie。

实际上,有四种方式让Session正常工作:

  • 通过URL传递SessionID

  • 通过Cookie传递SessionID

  • 通过SSL传递SessionID

  • 通过隐藏表单传递SessionID

第一种情况:

当浏览器不支持Cookie功能时,浏览器会将用户的SessionCookieName(默认为JSESSIONID)重写到用户请求的URL参数中。格式:/path/Servlet;name=value;name2=value2?Name3=value3

第三种情况:

会根据javax.servlet.request.ssl_session属性值设置SessionID。

注:如果客户端支持Cookie,又通过URL重写,Tomcat仍然会解析Cookie中的SessionID并覆盖URL中的SessionID

session工作原理

先看session工作的时序图

feaf6b3331dd6b36c1a5f549f3513e17.png

一、创建session

当客户端访问到服务器,服务器会为这个客户端通过request.getSession()方法创建一个Session,如果当前SessionID还没有对应的HttpSession对象,就创建一个新的,并添加到org.apache.catalina.Manager的sessions容器中保存,这就做到了对状态的保持。当然,这个SessionID是唯一的

二、session保存

由图可知,session对象已经保存在了Manager类中,StandardManager作为实现类,通过requestedSessionId从StandardManager的sessions集合中取出StandardSession对象。

我们来看看StandardManager时如何对所有StandardSession对象进行生命周期管理

当Servlet容器关闭:

StandardManager将持久化没过期的StandardSession对象(必须调用Servlet容器中的stop和start命令,不能直接kill)

当Servlet容器重启时:

StandardManager初始化会重读这个文件,解析出所有session对象。

三、session的销毁

这里有一个误区,也是我之前的错误理解,就是我将session的生命周期理解成一次会话,浏览器打开就创建,浏览器关闭就销毁,这样理解是错的!!

session的声明周期是从创建到超时过期

也就是说,当session创建后,浏览器关闭,会话级别的Cookie被销毁,如果没有超过设定时间,该SessionID对应的session是没有被销毁的,

检查session失效

检查每个Session是否失效是在Tomcat的一个后台线程完成的(backgroundProcess()方法中);除了后台进程检验session是否失效外,调用request.getSession()也会检查该session是否过期,当然,调用这种方法如果过期的话又会重新创建一个新的session。

小结

二者的异同

相同点(有关系的地方):

  • Session和Cookie都是为了让http协议又状态而存在

  • Session通过Cookie工作,Cookie传输的SessionID让Session知道这个客户端到底是谁

不同点:

  • Session将信息保存到服务器,Cookie将信息保存在客户端

工作流程

当浏览器第一次访问服务器时,服务器创建Session并将SessionID通过Cookie带给浏览器保存在客户端,同时服务器根据业务逻辑保存相应的客户端信息保存在session中;客户端再访问时上传Cookie,服务器得到Cookie后获取里面的SessionID,来维持状态。

欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,学习能力的提升上有新的认识,欢迎转发分享给更多人。

猜你还想看

阿里、腾讯、百度、华为、京东最新面试题汇集

Linux 系统 CPU 100% 异常排查实践与总结

动画演绎Java常用数据结构(建议收藏)

记录自己理解的一些设计模式

关注「程序员小乐」,收看更多精彩内容
嘿,你在看吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/528141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 运行时间 装饰器_python 装饰器统计某个函数的运行时间

import datetimedef count_time(func):def int_time(*args, **kwargs):start_time datetime.datetime.now() # 程序开始时间func()over_time datetime.datetime.now() # 程序结束时间total_time (over_time-start_time).total_seconds()print(程序共计%s秒 % total_time)ret…

《大学计算机基础》试题题库及答案

一、单选题练习 1.完整的计算机系统由( C )组成。A.运算器、控制器、存储器、输入设备和输出设备B.主机和外部设备C.硬件系统和软件系统D.主机箱、显示器、键盘、鼠标、打印机2.以…

docker添加新的环境变量_Docker环境变量

环境变量环境变量通常在与您正在使用的基本映像关联的Dockerfile中设置。也有Docker为每个新容器自动设置的环境变量。您可以指定其他变量,并使用-e或--env选项重新定义Docker设置的变量。在Docker运行配置中,您可以使用“环境变量(Environment variable…

c语言期末考试复习题

单项选择题 1.( A )是构成C语言程序的基本单位。 A、函数 B、过程 C、子程序 D、子例程 2.C语言程序从 C 开始执行。 A) 程序中第一条可执行语句 B) 程序中第一个函数 C) 程序中的main函数 …

js制定一个单选按钮_【下】每个月整理发票太头疼?手把手教你快速开发一个工具解决!...

"NightTeam",一个值得加星标的公众号。在上篇中,我们已经将我们的发票管理工具开发到了能一键导入发票、能看到效果、能仍然不太方便地管理的状态,接下来我们来继续将还没有加进去的那些方便的功能给加上,以将管理发票的…

exec go 重启_无停机优雅重启 Go 程序

什么是优雅重启在不停机的情况下,就地部署一个应用程序的新版本或者修改其配置的能力已经成为现代软件系统的标配。这篇文章讨论优雅重启一个应用的不同方法,并且提供一个功能独立的案例来深挖实现细节。如果你不熟悉 Teleport 话,Teleport 是…

ai怎么让图片任意变形_想一键提取图片文字,有什么好的文字识别软件/APP推荐吗?...

工作也有一段时间了,有时候需要把图片中的文字提取出来,转换成电子档式,一开始的时候可能是傻吧,也没想到借用工作减少工作量,就知道埋头拼命敲敲打打,文字比较少的时候还好,多了简直...得颈椎病…

MySql和Oracle数据库的区别?

查询当前所有的表 SQL> select * from tab; SQL> select * from cat where table_type’TABLE’;//可能会有view SQL>select * from user_tables; mysql> show tables; c:/mysql/bin>mysqlshow 库名 显示当前连接用户(库) SQL> sh…

隐藏功能_IOS 14.2 隐藏功能

FaceTime隐藏功能现身,只要设备运行 iOS 14.2 系统,iPhone 8 或更新的机型都可以以 1080p 分辨率进行视频通话,1080p什么概念,平时看视频应该最有感触。FaceTime 是什么?可能有些小伙伴压根儿就没听说过这个功能。Face…

SSH框架(Struts+Spring+Hibernate)

在SSH 的组合框架模式中,三者各自的作用? Struts 是一个很好的MVC框架,主要技术是Servlet和Jsp。Struts的MVC设计模式可以使我们的逻辑变得很清晰,让我们写的程序层次分明。基于Struts开发可以简化开发难度,提高开发效…

mapbox矢量切片标准_Cesium 加载矢量切片(MapBox Vector Tile)

矢量切片(vector tile)是当前 WebGIS 较热技术,国内的高德、百度等在线地图都使用了矢量切片技术。相较于传统栅格切片,矢量切片好处很多。简单几点就是:轻量、客户端渲染、还可加密(栅格切片容易被爬取)。矢量切片格式一般有 GeoJSON、TopoJ…

d630无电池升级bios_太重要,你想要的电脑BIOS全面解读与设置(下)

设置意外断电后恢复状态通常在电脑意外断电后,需要重新启动电脑,但在 BIOS 中可以对断电恢 复进行设置,一旦电源恢复,电脑将自动启动。下面就在 UEFIBIOS 中设置电 脑的自动断电后重启,具体操作步骤如下。 STEP 1 选择…

MySQL的乱码解决方案

1.如果第一次安装MySQL数据库: 在选择编码时,选择最后一项,并指定编码为utf8或者gbk(这两种编码支持中文,是我们比较常用的) 如果已经按照完成了MySQL数据库,那么可以进行重新配置修改: 在开始菜单中找到: 然后重复第…

pg数据库开启远程连接_疫情之下,开启在家办公模式,远程连接工具篇之向日葵...

1月30号本来就要返程去上班了,接到公司通知,根据当前疫情的形势,假期延长到3号,退车票,候补抢票一顿操作,将票改到了3号,3号又接到通知假期延长到10号。作为一个一线的销售人员,工作…

谈谈对MVC的理解(View+Model+Controller)

1) 什么是MVC? MVC是一种设计思想,根据职责不同将程序中的组件分成以下3个部分。 V(View视图):负责与用户交互。将数据展现,或者是接收数据 M(Model模型):负责业务处理。…

吃下去的东西老是往上翻上来_食管裂孔疝的这个诱因你知道吗?医生:不要再吃过烫的食物...

食管裂孔疝的忌吃辣门诊遇见一个爱吃热、辣食物的患者。她自述饭后老是反酸水呕吐,本来以为只是普通胃病,最近到我们医院一查,结果让她大吃一惊,本在腹腔的胃竟然有部分“跑”进了胸腔!两年多前,这个女士发…

物理搬砖问题_全职业通用,搬砖市场装备

更多原创文章可关注微信公众号:地下城勤帝 查看大家好,我是勤帝,我只写大家能看懂的文章搬砖市场的角色更新了一些,装备都有所不同,今天我给大家一个可以通用的装备,这套装备虽然成型不快,但是…

Oracle中表连接的方式有哪些

内连接(自然连接) 等值连接、自然连接和不等值连接 {内连接是join 关键字连接两个表,语法为 table1 join table2 on 条件。 根据使用的比较方式不同,内连接又分为等值连接、自然连接和不等值连接。 等值连接:所谓等值连接&…

快手通过标签添加的我_快手怎么上热门?快手短视频推荐指标有哪些?

“快手怎么才能上热门?快手上热门都有哪些技巧?”其实这些问题,除了通过提高短视频质量,还可以通过分析推荐指数的方式解决。运营者想要有效提升短视频的播放量,想让快手短视频快速上热门,还可以从推荐指数…

JAVA的数据类型有哪些?

⑴基本数据类型(八种): 整型: byte 1字节, short 2字节, int 4字节, long 8字节 浮点型: float 4字节, double 8字节 【float 类型共 32位(不 int相同),其中 1位为符号位…