这里是修真院后端小课堂,每篇分享文从html
【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】程序员
八个方面深度解析后端知识/技能,本篇分享的是:web
【什么是session?什么是cookie?session和cookie有什么区别?什么场景适用于session?什么场景适用于cookie?】redis
【修真院JAVA小课堂】 什么是session?什么是cookie?session和cookie有什么区别?什么场景适用于session?什么场景适用于cookie?数据库
你们好,我是IT修真院西安分院第四期的学员赵立鼐,一枚正直纯洁善良的JAVA程序员,今天给你们分享一下,修真院官网JAVA任务五,深度思考中的知识点——session和cookie后端
(1)背景介绍:浏览器
HTTP的无状态性缓存
HTTP 是一种不保存状态,无状态(stateless)协议。tomcat
HTTP 协议自身不对请求和响应之间的通讯状态进行保存。也就是说在 HTTP 这个级别,协议对于发送过的请求或响应都不作持久化处理。使用 HTTP 协议,每当有新的请求发送时,就会有对应的新响应产生。协议自己并不保留以前一切的请求或响应报文的信息。服务器
这是为了更快地处理大量事务,确保协议的可伸缩性,而特地把 HTTP 协议设计成如此简单的。
随着 Web 的不断发展,无状态而致使业务处理变得棘手的状况增多了。好比,用户登陆到一家购物网站,即便他跳转到该站的其余页面后,也须要能继续保持登陆状态。针对这个实例,网站为了可以掌握是谁送出的请求,须要保存用户的状态。
HTTP/1.1 虽然是无状态协议,但为了实现指望的保持状态功能,因而引入了 Cookie 技术。有了 Cookie 再用 HTTP 协议通讯,就能够管理状态了。
(2)知识剖析:
什么是Session
Session表明服务器与浏览器的一次会话过程,这个过程是连续的,也能够时断时续的。
Session是一种服务器端的机制,Session 对象用来存储特定用户会话所需的信息。
Session由服务端生成,保存在服务器的内存、缓存、硬盘或数据库中。
对Tomcat而言,Session是一块在服务器开辟的内存空间,其存储结构为
Session的工做原理
当用户访问到一个服务器,若是服务器启用Session,服务器就要为该用户建立一个SESSION.
在建立这个SESSION的时候,服务器首先检查这个用户发来的请求里是否包含了一个SESSION ID,
若是包含了一个SESSION ID则说明以前该用户已经登录过并为此用户建立过SESSION,
那服务器就按照这个SESSION ID把这个SESSION在服务器的内存中查找出来(若是查找不到,就有可能为他新建立一个),
若是客户端请求里不包含有SESSION ID,则为该客户端建立一个SESSION并生成一个与此SESSION相关的SESSION ID。
这个SESSION ID是惟一的、不重复的、不容易找到规律的字符串,这个SESSION ID将被在本次响应中返回到客户端保存,
而保存这个SESSION ID的正是COOKIE,这样在交互过程当中浏览器能够自动的按照规则把这个标识发送给服务器。
什么是cookie?
因为HTTP是一种无状态的协议,服务器单从网络链接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,不管谁访问都必须携带本身通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工做原理。
Cookie其实是一小段的文本信息。客户端请求服务器,若是服务器须要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还能够根据须要修改Cookie的内容。
(3)常见问题:
sessionid如何产生?由谁产生?保存在哪里?
(4)解决方案:
反 sessionid是一个会话的key,浏览器第一次访问服务器会在服务器端生成一个session,有一个sessionid和它对应。
tomcat生成的sessionid叫作jsessionid。
存储在服务器的内存中,tomcat的StandardManager类将session存储在内存中,也能够持久化到file,数据库,memcache,redis等。客户端只保存sessionid到cookie中,而不会保存session,session销毁只能经过invalidate或超时,关掉浏览器并不会关闭session。
(5)编码实战:
尽量的去寻找在真实项目中在用的。若是你能找到某个网站在用你说的知识点,这是最好的。学以至用,不然当成练习题就没有意义了。多准备一些demo,讲解过程当中将知识点和demo结合,便于你们理解所讲解的知识点。
(6)拓展思考:
session和cookie有什么区别?
Cookie与Session都可以进行会话跟踪,可是完成的原理不太同样。普通情况下两者均可以知足需求,但有时不可以运用Cookie,有时不可以运用Session。下面通过比拟阐明二者的特性以及适用的场所:
1.存取方式的不一样
Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需求先进行编码。Cookie中也不能直接存取Java对象。若要存储略微复杂的信息,运用Cookie是比较艰难的.
而Session中可以存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session中也可以直接保管JavaBean乃至任何Java类,对象等,运用起来十分便当。可以把Session看作是一个Java容器类。
2.隐私策略的不一样
Cookie存储在客户端阅读器中,对客户端是可见的,客户端的一些程序可能会窥探、复制以致修正Cookie中的内容。而Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。
假如选用Cookie,比较好的方法是,敏感的信息如帐号密码等尽可能不要写到Cookie中。最好是像Google、Baidu那样将Cookie信息加密,提交到服务器后再进行解密,保证Cookie中的信息只要本人能读得懂。而假如选择Session就省事多了,反正是放在服务器上,Session里任何隐私都可以有效的保护。
3.有效期上的不一样
使用过Google的人都晓得,假如登陆过Google,则Google的登陆信息长期有效。用户不用每次访问都从新登陆,Google会持久地记载该用户的登陆信息。要到达这种效果,运用Cookie会是比较好的选择。只须要设置Cookie的过时时间属性为一个很大很大的数字。
因为Session依赖于名为JSESSIONID的Cookie,而CookieJSESSIONID的过时时间默许为–1,只需关闭了阅读器该Session就会失效,于是Session不能完成信息永世有效的效果。运用URL地址重写也不能完成。并且假如设置Session的超时时间过长,服务器累计的Session就会越多,越容易招致内存溢出。
4.服务器压力的不一样
Session是保管在服务器端的,每一个用户都会产生一个Session。假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存。于是像Google、Baidu、Sina这样并发访问量极高的网站,是不太可能运用Session来追踪客户会话的。而Cookie保管在客户端,不占用服务器资源。假如并发使用的用户十分多,Cookie是很好的选择。关于Google、Baidu、Sina来讲,Cookie或许是惟一的选择。
(7)参考文献:
https://www.cnblogs.com/aspwe...
(8)更多讨论:
Q1:鲁伯良: 一、服务器如何判断客户端发送过来的请求是属于同一个会话?
用Session id区分,Session id相同的即认为是同一个会话,在Tomcat中Session id用JSESSIONID表示;
Q2:刘优:二、服务器、客户端如何获取Session id?Session id在其之间是如何传输的呢?
A2: 赵立鼐 :服务器第一次接收到请求时,开辟了一块Session空间(建立了Session对象),同时生成一个Session id,并经过响应头的Set-Cookie:“JSESSIONID=XXXXXXX”命令,向客户端发送要求设置cookie的响应;
客户端收到响应后,在本机客户端设置了一个JSESSIONID=XXXXXXX的cookie信息,该cookie的过时时间为浏览器会话结束;
接下来客户端每次向同一个网站发送请求时,请求头都会带上该cookie信息(包含Session id);
而后,服务器经过读取请求头中的Cookie信息,获取名称为JSESSIONID的值,获得这次请求的Session id;
ps:服务器只会在客户端第一次请求响应的时候,在响应头上添加Set-Cookie:“JSESSIONID=XXXXXXX”信息,接下来在同一个会话的第二第三次响应头里,是不会添加Set-Cookie:“JSESSIONID=XXXXXXX”信息的;
而客户端是会在每次请求头的cookie中带上JSESSIONID信息;
Q3:秦永辉: 三、 session产生的session_id放在cookie里面,若是用户把cookie禁止掉,是否是session也不能用了呢?
A3: 赵立鼐: 禁止掉cookie后,session固然能够用,不过经过其余的方式来得到这个sessionid,好比,能够跟在url的后面,或者以表单的形势提交到服务器端。从而使服务器端了解客户端的状态。
(9)鸣谢:
感谢刘优师兄,此教程是在他们以前技术分享的基础上完善而成。
(10)结束语:
今天的分享就到这里啦,欢迎你们点赞、转发、留言、拍砖~