介绍这个的文章很多,本文旨在快速总体梳理一下session和cookies机制。

在了解session之前最好先了解cookies。

Cookies

cookie是什么?

cookie是一个文本文件,和浏览器挂钩,保存在硬盘里,形式为键值对。(注意:会话级别的cookie存在于内存)

当我们浏览器去对一个服务器发出请求时,实际上会先去读取cookie文件,把一些属于该服务器的cookies信息写到http请求头里再去访问,这个是浏览器自动帮我们完成的。

访问一个网站,打开请求报文,可以看到这次访问你携带上的cookies信息
(说明一下,这个服务端是我当时为了保持登录瞎写的,正常的服务端不会让浏览器把密码写在cookies这么逗比,即使写了也会加密才传输)

那这些信息是怎么来的呢?

主要是服务器端给你设置,由于http请求的无状态性,所以你每次请求,服务器为了认识你是谁,它会需要你携带点信息好让我知道你是谁。

服务端如果是java写的,可以通过如下代码设置cookies

Cookie cookie = new Cookie("account", 111111);
cookie.setHttpOnly(true);
cookie.setPath("/");
cookie.setDomain("localhost");
response.addCookie(cookie);

这样http响应头就会添加上set-Cookie的字段.

cookie的主要属性包括:名字,值,过期时间,路径和域:

域: 作用的域名

路径:作用的路径,不设置默认就是当前路径

域和路径一起构成了cookie的作用范围,也就是决定了存在浏览器请求的时候会不会带上这个cookie。

过期时间: 如果不设置过期时间即为会话级别的cookie,表示这个cookie的生命期为浏览器的会话期间,关闭浏览器窗口,cookie就消失了,会话cookie一般保存在内存里。如果设置了过期时间,浏览器会把cookie保存在硬盘上。

名字: 就是给cookie起一个名字(key)。

值: cookie中记录的信息内容(value)。

这样响应后,只要浏览器没有禁用cookie,那么这些信息就会写到浏览器进程的内存里或cookie文件里。

下次访问服务器,且访问域在cookie的有效范围内的话浏览器就会读取cookie文件,把这些信息抽出来放到请求头里。

服务端就可以读取到你携带过来的cookie信息,就知道你是谁啦。

java的话可以通过request.getCookies()来获取接收到的cookie数组。

Session

session和cookie有点类似,同样可以解决http无状态的问题。

session中文意思是会话,有些人包括我第一次听到这个东西的时候觉得有点抽象。

不像cookie那样,会有人告诉你那个东西就是存在与硬盘的一个文件,里面保存着键值对信息,所以会觉得云里雾里。

一般情况下,我们可以简单地把这个东西看作是一个存在于内存的对象,这个对象保存的东西也是一个个键值对。

另外,session也可以存在redis,甚至是数据库等,但这时这个所谓session还能否叫session呢。

和cookie不同,
1 session是存在与服务器上的,所有客户端过来访问的session信息全部保存在服务器上

2 session是在内存中,随时有丢失的风险,例如服务器崩了。实际上也可以把session持久化到硬盘或数据库来进行登陆认证。

3 session有效期相对较短,如果session一直没有访问,那么很快就会被释放掉,tomcat默认是30分钟,超过这个时间没被访问就会被服务器清除掉。

由于session是保存在服务器的,那某一个浏览器去访问它,它是怎么认出来的呢?

那就要靠cookies啦!

细心的朋友可能已经注意到了上图请求头中的cookie有一个熟悉的字段

注意第一个的J session ID,这个就是服务器能认出我们的关键(不同服务器session的id名字可能不一样)。

机制:
第一次访问服务器,当然不会有JSESSIONID,所以服务器会给你定制生成一个session在内存中,并且告诉你id,这个id就是JSESSIONID,它唯一标识了你的session。
然后通过上文提及的set-Cookie是方式告诉你,你的sessionid是啥。

这样浏览器就会把cookie保存起来,下次再访问的时候浏览器就会自动把这个JSESSIONID的cookie放在请求头去访问服务器,服务器就会根据这个id去找session,就可以拿到你的专属session了,服务器就认出你来了。

但要注意的是,这个保存着Jsessionid的cookie的有效期如果不设置有效期的话,是会话级的,就是说这个cookie不会写到硬盘里,是存在于浏览器的内存的,所以当你把浏览器关闭掉,这个JSESSIONID的cookie就会丢失。

所以当你关闭浏览器后再去访问服务器,请求头就没有这个id,这时即使服务端那边你的session还没失效,由于你没有携带JSESSIONID过来,服务器也不知道你有这个session,那么原来的session就成了没爹的孩子,随有效时间结束而死去,这时服务器还是会把你当做第一次访问,重新给你生成一个session并告诉你JSESSIONID,让你下次再携带这个id过来。

补充:如果cookie被禁用了可以采用重写url的方式把JSESSIONID传递到服务端。
如 http://www.xx.com/center?JSESSIONID=1234567

Token

token的机制和上面说的很类似,简单来说就是服务端生成一个token字符串给客户端存到cookie或者localStorage,然后下次访问带着token去访问。

推荐一篇文章 https://mp.weixin.qq.com/s/79D0SdhyYlqfkhHerGEacA

简单说一下session和cookies相关推荐

  1. Applicatin、 server、 session 、cookies对象的简单使用方法

    Applicatin 对象 能够记录一组对象,对各个会话都是共享的,为了防止并发,我们用Application.Lock 如:   Application.Lock();   Response.Wri ...

  2. URL、Session、Cookies、Server.Transfer、Application和跨页面传送。

    URL.Session.Cookies.Server.Transfer.Application和跨页面传送. [分析] 本题考查面试者对ASP.NET中多页面传值的理解是否全面.因为ASP.NET的页 ...

  3. 第04讲: 基础探究,Session 与 Cookies

    我们在浏览网站的过程中,经常会遇到需要登录的情况,而有些网页只有登录之后才可以访问,而且登录之后可以连续访问很多次网站,但是有时候过一段时间就需要重新登录. 还有一些网站,在打开浏览器时就自动登录了, ...

  4. Session和Cookies的作用以及实现

    实际很多情况下,由于网站的限制,不登录的话我们只能爬取到一小部分信息. 而我们想要登录的话,则需要带上小饼干. 什么是小饼干?小饼干就是cookies的中文翻译,它是模拟登录时会涉及到的. 我准备带你 ...

  5. Redis简单案例(四) Session的管理

    Redis简单案例(四) Session的管理 原文:Redis简单案例(四) Session的管理 负载均衡,这应该是一个永恒的话题,也是一个十分重要的话题.毕竟当网站成长到一定程度,访问量自然也是 ...

  6. Servlet中(Session、Cookies、Servletcontext)的基本用法

    //req: 用于获得客户端(浏览器)的信息 //res: 用于向客户端(浏览器)返回信息 1.session的设置:              //得到和req相关联的session,如果没有就创建 ...

  7. Application,Session和Cookies的区别

    1.Application对象      Application用于保存所有用户的公共的数据信息,如果使用Application对象,一个需要考虑的问题是任何写操作都要在Application_OnS ...

  8. jsp中session 和 cookies区别

    为什么登陆后,只要不关闭浏览器,session就能一直存在?当然session的数据是保存在服务器上的,但服务器是怎么识别这些数据都是谁的呢?答案是sessionid,每一个浏览者都唯一的sessio ...

  9. Flask中session和cookies的设置、删除、修改、获取

    一.session配置 1.在配置文件中导入session包. 2.在配置文件中加入SECRET="123456"#涉及到加盐算法,用于生成session_id和csrf_toke ...

最新文章

  1. R语言ggplot2可视化绘制一头奶牛、Linux下使用cowsay打印奶牛(cow)
  2. js实现简单的图片轮播
  3. 收集下关系数据库处理亿万级别的数据
  4. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第23篇]写一个实现蒙哥马利算法的C程序
  5. python雷达图详解_Python简单雷达图绘制
  6. 信息学奥赛一本通(1016:整型数据类型存储空间大小)
  7. C51指针定义和应用小结
  8. keil spi 调试_单片机软件出问题了?有经验的工程师这么调试
  9. MPAA正在对BT下毒手,BT大站被警方关闭
  10. java jigsaw demo_Java9模块化(Jigsaw)初识
  11. 什么是LAMP?LAMP有什么优势?
  12. 神舟计算机主板bios,最详细的各种主板bios设置方法
  13. 小米青春版路由器解锁root与SSH方法
  14. arduino环境下用ESP32连接PS2手柄
  15. 知道吗?借助InterSystems Caché数据库,欧洲航天局正在绘制银河系最大的地图
  16. STM32 HAL OTA 小白教程
  17. srand rand c语言,C语言srand和rand函数
  18. 抓住金三银四的尾巴,解锁程序员面试《刷题神器》
  19. linux PCIE驱动开发
  20. 2022全国大学生物联网设计竞赛火热开启,限量礼品等你来拿

热门文章

  1. mac刷新本地DNS缓存
  2. autoconf automake使用
  3. python可视化 matplotlib画图使用colorbar工具自定义颜色
  4. 其境遇与文章中描写的现实恰恰相反科技的
  5. springbootGetmapping获取参数的方式
  6. 黑马学ElasticSearch(五)
  7. 银河仿真计算机说明书,“银河”高性能分布仿真计算机系统诞生
  8. Oracle 11g 安装教程及pl/sql下载安装
  9. css给长方形画对角线
  10. Meego Linux 联想Z370(蓝)官方报4999