- 什么是session?
session就是会话,会话就是session。
打开浏览器,然后进行一系列的操作,最后关闭浏览器。这整个过程就是一次会话。
- 为什么要有session?session有什么用?
session是用来保存会话状态的。用户在网页是否已经登陆?这个状态就需要用session来保存。
这也是为什么要有session。因为HTTP是一种无状态协议。所以想要获取会话状态,就必须要有“人”来负责保存会话状态,而这个“人”就是session。
HTTP之所以是无状态的,是因为当浏览器发送一次请求后,服务器会给出响应,响应结束后,浏览器与服务器之间连接的通道就会关闭。当初人家设计网站的时候也好、规定HTTP协议的时候也好,就是这个设计、这么规定的。这样做的好处就是减轻服务器的压力。不然可以试想一下:每次请求之后响应都结束了,通讯通道还打开着,是不是非常浪费资源呢?然后当用户多了之后,每次请求都是一个开着的通道,而每个用户都有很多次请求,那是不是会给到服务器很大的压力呢?[eg]举例来说,假设张三去商场买蛋糕,拿了一个桂花芋泥可颂和13块9毛钱给店员,店员在收银台记录完成后给张三说:“谢谢惠顾,欢迎下次光临!”。这样一次请求就结束了对吧。在例子中,张三是浏览器,店员是服务器。张三拿可颂🥐和钱💰给店员的行为是请求(request),店员给张三说话是响应(response),这样一次请求就完成了。接下来正常来讲,服务器就与浏览器之间的连接断开了,直到浏览器下一次发送请求,连接通道才会再次打开。现实里也是这样,帮张三收银完成后,店员便会去做其他的事情了,比方说给下一个顾客收银,又或者是打理打理前台。假设不是这样的,我就想让通道一直不关闭,那会怎么样呢?那我想应该就是店员帮张三收银完成之后,就一直盯着张三看,因此好处就是店员(服务器)能知道张三(浏览器)的一举一动,每时每刻的状态也能获悉,但是缺点就是压力太大,因为张三买单了,店员要看张三,李四来了又要同时看李四,等整个店人很多了,店员也就看不过来了,这时候店员(服务器)就垮了。所以,HTTP协议做成无状态的,就是为了减轻服务器端的压力。
- 什么是状态?状态有什么用?
从刚才的例子里,有一个疑问:假设店员与张三之间是有状态的,我们说那即使是张三付完了钱,店员依然要把注意力放在张三身上,那什么时候这个连接才会断开呢?张三都到家了,店员总不能还盯着张三吧?---对,答案其实比较好想了,就是当张三离开蛋糕店之后,店员就不用再管张三了。因此啊,张三是否在店里,就是状态。就好比我们在网站上登陆一样,登陆了,就是登陆状态,张三就在蛋糕店里面,张三可以查看蛋糕种类、价格,然后下单。这就是对应用户在登录之后可以享受网站的一些服务;张三不在店里,就是用户没有登录,张三就不能购买蛋糕,用户就不能获得网站的服务。
所以状态简单理解就是指用户是否登陆,状态不同,能获取的服务器服务就不同,例如不登陆就无法清空购物车。
由此我们解决了两个问题:1 会话状态是什么?简单来说就是登陆了是一种状态,没登陆是另一种状态。2 为什么HTTP协议是无状态的?为了减轻服务器压力。
所以说到这,应该就能明白session是用来干什么的了吧。---session就是那个用来保存会话状态的对象。
- 回归最初的问题,什么是session?session有什么用?
session是用来保存会话状态的对象,一个会话对应一个session,一个会话包含多次请求
session存在于服务器中。
之所以用session来保存会话状态,是因为HTTP是无状态的,即一次请求响应结束后,用户关闭浏览器这个动作服务器是不知道的,所以为了知道用户的状态,用session来保存。
- session的使用
session的获取
HttpSession session = request.getSession();从服务器获取当前session对象,如没有,则新建
HttpSession session = request.getSession(false);从服务器获取当前session对象,如没有,则返回null
session的销毁
session.invalidate();session的手动销毁方法
- session的实现原理
服务器中有一个session列表,(可以理解为Map集合),key部分是sessionid,value部分是session对象。
当用户第一次发送请求的时候,服务器会新建一个session对象,并赋一个sessionid给该对象,然后这个sessionid和session对象就成对的被存储在session列表中,然后服务器把sessionid返还给浏览器,浏览器则将这个id保存在浏览器的缓存中。
第二次再发送请求的时候,浏览器会将id一并发给服务器,然后服务器就会根据id找到session对象,接下来就可以从session对象中获取状态信息了。
[eg]这就好比体育课里拿排球🏐️,我很喜欢某个排球🏐️,于是我偷偷在上面做个标记,下次上课我专门找标记的排球🏐️拿,就能再次拿到。
- 为什么浏览器关闭,会话结束?
浏览器关闭,缓存清除,浏览器端保存的sessionid消失了。下次再打开浏览器的时候,没有sessionid一并发给服务器,自然就找不到session对象了,所以可以看做会话结束。
就好比在上一段的例子中,我虽然在排球🏐️上做了标记,但是我脑袋里不记得这个标记了,那下次是不是还是找不到我喜欢的那个排球🏐️了呢?
注意:此时,虽然找不到session了,但是这个session对象可能并没有销毁。
- session对象什么时候销毁?
两种情况:1 超时机制。2 手动销毁。
1 超时机制是设置session超时时间,超过这个时间还没有访问,则session自动销毁
2 手动销毁,即是上文提及的session.invalidate();方法,该方法一般用于网银等高安全要求的网站内的“安全退出”按钮。
刚才提到了session会有个sessionid用来“标记”session对象,其实这个sessionid就存储在Cookie中。
- Cookie
Cookie与Session的关联
前文说sessionid会随着请求一并传到服务器,具体的形式就是JSESSIONID=XXXXX...(32位)。
这个键值对就是cookie对象。cookie是被保存在浏览器的“运行内存”中的。
只要浏览器不关闭,用户每次发送请求,会自动将运行内存中的cookie发送给服务器的,接下来便是服务器根据cookie中的sessionid来获取session对象了。
Cookie保存在什么地方?
cookie最终是保存在浏览器客户端上的。底层来说,可以是保存在运行内存中(但是浏览器关闭cookie就消失了);也可以保存在硬盘文件里(永久保存)
Cookie有啥用?
和session一样,都是用于保存会话状态。小区别就是 session是保存在服务器端的,而cookie是保存在浏览器端的。
Cookie的应用案例
壹 在苏宁易购网站购物时,我将几件商品加入购物车之后,我关闭了浏览器之后,重新打开该网站发现我的商品仍在购物车中。
这是因为在我加入购物车的时候,商品id等信息保存在cookie中,我再次打开该网址的时候,会从cookie中读取商品id等相关信息,然后就可以动态展示购物车中商品信息了。
当然,cookie一删,就看不见购物车信息了。
贰 126邮箱的“十天内免登录”。这个是将账号密码等信息保存在cookie中,下次打开网址的时候自动从cookie中获取账号密码然后自动登录,从而实现“免登录”功能。
让Cookie失效的方法(那上一段中126邮箱为例)
超时机制(十天一过自动失效)、改密码(原cookie中的密码不对,自然是不能登陆)、删除设备中的cookie
Cookie的常用方法
Cookie cookie = new Cookie(key , value);创建cookie
cookie.setMaxAge(s); 设置cookie的有效时间,单位为秒
这个方法中若s>0,则cookie写在硬盘文件中。若s=0,则删除cookie(主要应用于删除同名cookie)。若s<0,则表示cookie不会被储存,和不设置cookie一样
cookie.setPath("/servlet13"); 这个表示只要是访问servlet13或其子路径的时候,都会自动将cookie提交给服务器。
Cookie[ ] cookies = request.getCookies(); 这个方法是用来获取cookie。如果没有cookie可以获取,则返回null,而不是长度为0的数组。这点细节要注意