简单说一下session和cookies
介绍这个的文章很多,本文旨在快速总体梳理一下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相关推荐
- Applicatin、 server、 session 、cookies对象的简单使用方法
Applicatin 对象 能够记录一组对象,对各个会话都是共享的,为了防止并发,我们用Application.Lock 如: Application.Lock(); Response.Wri ...
- URL、Session、Cookies、Server.Transfer、Application和跨页面传送。
URL.Session.Cookies.Server.Transfer.Application和跨页面传送. [分析] 本题考查面试者对ASP.NET中多页面传值的理解是否全面.因为ASP.NET的页 ...
- 第04讲: 基础探究,Session 与 Cookies
我们在浏览网站的过程中,经常会遇到需要登录的情况,而有些网页只有登录之后才可以访问,而且登录之后可以连续访问很多次网站,但是有时候过一段时间就需要重新登录. 还有一些网站,在打开浏览器时就自动登录了, ...
- Session和Cookies的作用以及实现
实际很多情况下,由于网站的限制,不登录的话我们只能爬取到一小部分信息. 而我们想要登录的话,则需要带上小饼干. 什么是小饼干?小饼干就是cookies的中文翻译,它是模拟登录时会涉及到的. 我准备带你 ...
- Redis简单案例(四) Session的管理
Redis简单案例(四) Session的管理 原文:Redis简单案例(四) Session的管理 负载均衡,这应该是一个永恒的话题,也是一个十分重要的话题.毕竟当网站成长到一定程度,访问量自然也是 ...
- Servlet中(Session、Cookies、Servletcontext)的基本用法
//req: 用于获得客户端(浏览器)的信息 //res: 用于向客户端(浏览器)返回信息 1.session的设置: //得到和req相关联的session,如果没有就创建 ...
- Application,Session和Cookies的区别
1.Application对象 Application用于保存所有用户的公共的数据信息,如果使用Application对象,一个需要考虑的问题是任何写操作都要在Application_OnS ...
- jsp中session 和 cookies区别
为什么登陆后,只要不关闭浏览器,session就能一直存在?当然session的数据是保存在服务器上的,但服务器是怎么识别这些数据都是谁的呢?答案是sessionid,每一个浏览者都唯一的sessio ...
- Flask中session和cookies的设置、删除、修改、获取
一.session配置 1.在配置文件中导入session包. 2.在配置文件中加入SECRET="123456"#涉及到加盐算法,用于生成session_id和csrf_toke ...
最新文章
- R语言ggplot2可视化绘制一头奶牛、Linux下使用cowsay打印奶牛(cow)
- js实现简单的图片轮播
- 收集下关系数据库处理亿万级别的数据
- [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第23篇]写一个实现蒙哥马利算法的C程序
- python雷达图详解_Python简单雷达图绘制
- 信息学奥赛一本通(1016:整型数据类型存储空间大小)
- C51指针定义和应用小结
- keil spi 调试_单片机软件出问题了?有经验的工程师这么调试
- MPAA正在对BT下毒手,BT大站被警方关闭
- java jigsaw demo_Java9模块化(Jigsaw)初识
- 什么是LAMP?LAMP有什么优势?
- 神舟计算机主板bios,最详细的各种主板bios设置方法
- 小米青春版路由器解锁root与SSH方法
- arduino环境下用ESP32连接PS2手柄
- 知道吗?借助InterSystems Caché数据库,欧洲航天局正在绘制银河系最大的地图
- STM32 HAL OTA 小白教程
- srand rand c语言,C语言srand和rand函数
- 抓住金三银四的尾巴,解锁程序员面试《刷题神器》
- linux PCIE驱动开发
- 2022全国大学生物联网设计竞赛火热开启,限量礼品等你来拿