session会话追踪的实现机制

会话


用户打开浏览器,客户端和服务器之间发生的一系列连续的请求和响应,最后把浏览器关闭,这个过程叫做一次会话。会话在服务器端有对应的Java对象—Session
以我自己对会话的理解来说,会话可以类比打电话,打一次电话是一次会话,电话挂断代表会话结束,那么同样的打开浏览器进行一系列操作,直到浏览器关闭才代表会话结束

一次会话对应N个请求

对于会话有了基本的理解以后,我们来看一下,它的作用是什么:

Session的作用
保存会话状态。(用户登录成功了,这是一种登录成功的状态,你怎么把登录成功的状态一直保存下来呢?使用session对象可以保留会话状态。)
为什么不用request或者ServletContest来保存会话状态

request.setAttribute()存,request.getAttribute()取,ServletContext也有这个方法。request是请求域。ServletContext是应用域。ServletContext对象是服务器启动的时候创建,服务器关闭的时候销毁,这个ServletContext对象只有一个。
request对象的生命周期太短了。
以在淘宝买东西作为例子:我们要买东西,先把商品加入购物车,我们是不是想要每一次请求都放在同一个购物车里面,但是request对象是一次请求一个,如果使用它的话,你会发现,每次请求放的购物车都不一样,你是不是很郁闷,所以不能使用request对象存放会话状态,如果我们使用的是ServletContext的话,那么就会变成所有用户共享一个购物车,最后你会发现购物车一堆的商品,所以也不适合。

既然Session是用来保存会话状态的,那么我们就会有一个疑惑,为什么要用它来保存会话状态。因为客户端发送请求以后,它和服务器的连接就断开了。

在这里插入图片描述

这就涉及到HTTP 协议的无状态特点,相信大家可能也有困惑,所以在正式说明Session的原理以前,我先来给大家说一下,HTTP协议的无状态特点是什么意思

HTTP协议的无状态特点
服务器没有办法识别每一次请求是从哪一台电脑访问的,它能接收请求,但是它不知道这个请求是从哪里来的,不知道要响应给谁。比如说我们买东西,添加购物车,由于它无法识别是来自哪一个客户端的请求,它就可能把我们的请求发送给其他人,所以必须要有一种技术来让服务器知道请求来自哪里,这就是会话技术

在这里插入图片描述

 

 Session的实现原理(重点)
Session对象是存储在服务器中的
我在下面这个图对Session对象的创建做了很清楚的说明了,我相信大家看了应该都能挺清楚的,而不是含含糊糊的。
由于下面的图片中,出现了Session超时机制,我现在就举个例子,给大家说明一下这个机制运用的地方。比如说你本来登录淘宝想买东西,结果这个时候,家里面来客人了,你就去招待客人了,很长一段时间里面,都没有再去碰过淘宝,也就是说明,在很长一段时间里面,你都没有发送请求给服务器,这个时候,服务器就会把Session对象销毁,由于Session对象存储登录信息,你就会发现当客人走了以后,当你想要去淘宝继续买东西的时候,还需要重新登录。因为这个系统会验证你是否曾经登录过,登录过的才可以继续访问,但是Session对象是存储登录信息的,Session对象都已经销毁了,当然无法访问。
Session超时机制简单来说就是长时间没有发送请求,服务器会销毁Session对象:

在这里插入图片描述

 

大家看了上面的图应该已经有了一定的理解了吧。现在是否有一个疑惑,为什么我们每一次发送请求,它都能找到同一个Session对象,而不是找到其他对象呢。就比如说同一时间有多个人在访问淘宝网站,为什么不同的人发送请求每次都可以返回他们的Session对象,为什么不会拿到其他人的Session对象。

大家可以想一下有什么方法可以很好的解决呢?
其实很容易可以想到,就是标记,没错吧,通过标记,我们就可以知道要返回哪一个Session对象。
我们可以给每一个Session对象生成一个编号,然后把这个编号发送给浏览器,在浏览器上面保存起来,那我们发送请求给服务器的时候,就能自动把编号发给服务器,服务器根据这个编号来找相应的Session对象。一个编号对应一个Session对象,这种存储方法是不是让你想到了Map集合,专业术语是Session列表

会话状态:指的是服务器和浏览器在会话过程中产生的状态信息,借助于会话状态,服务器可以把属于同一次会话的一系列请求和响应关联起来–sessionid

从一个终端发起的请求都会带有sessionid(Session对象的编号),这样我们通过id就可以标注它,服务器就知道要响应给谁,就比如说有好多人打电话给你,你手机没有来电显示,那我们是不是就得回拨电话回去,如果我们不知道电话号码不就不知道打电话给谁,但是如果显示电话号码,我们就知道打电话给谁了。

在这里插入图片描述

 

如果在同一个浏览器打开页面,他们的sessionid是一样的

属于同一次会话的请求都有一个相同的标识符:sessionid

其实sessionid是被包装成Cookie发送给浏览器的

Session常用方法:

Session在实际开发中是用来记录我们的用户信息的,我们不需要每一次访问都输入用户名和密码,如果登录过一次,后面可以不用再输入,但是这是有一个周期的,不可能一直存着的,默认失效时间为1800秒

方法    作用
String getId()获取sessionID
void setMaxInactiveInterval(int interval)设置session的失效时间,时间单位为秒
int getMaxInactiveInterval() 获取当前session的失效时间
void invalidate()设置session立即失效,也就是销毁session对象(比如说登录一个网站以后,点击退出,我们就可以用这个方法)
void setAttribute(String key,Object value)通过键值对的形式存储数据(这个方法类似于map的put方法,可以用来存储数据,也可以用来修改数据,如果用来修改数据的话,前后两次的key要相同)
Object getAttribute(String key)通过键来获取对应的数据
void removeAttribute(String key)通过键来删除对应的数据

二、Cookie;


(一)什么是cookie?Cookie(Java的一个类)
存储数据的形式和map差不多,以键值对的形式存储数据
Cookie在客户端存储,Session在服务端存储
Cookie是服务端在HTTP响应中附带传给浏览器的一个小文本文件,一旦浏览器保存了某一个Cookie,在之后的请求和响应过程中,会将此Cookie来回传递,这样就可以通过Cookie这个载体完成客户端和服务端的数据交流。

Session和Cookie的区别
Session:保存在服务器,Session是一个对象保存在Java虚拟机中
保存的数据是Object
随着会话的结束而销毁
保存重要信息

Cookie:保存在浏览器
只能保存String类型,类似于文本文件,存放的都是数据,而不是对象
可以长期保存在浏览器,与会话无关
保存不重要信息

存储用户信息:
Session:setAttribute(name,“admin”) 存
getAttribute(name) 取
生命周期:服务端:只要WEB应用重启或者销毁
客户端:只要浏览器关闭就销毁
退出登录:session.invalidate();
Cookie:
Cookie cookie=new Cookie(name,“admin”);
response.addCookie(cookie); 存取数据

	Cookie[] cookies=request.getCookie();
 		for(Cookie cookie:cookies){
				if(cookie.getName().equals("name"){
						out.write("欢迎回来"+cookie.getValue());
			}
}

生命周期:不会随着服务端的重启而销毁,客户端:默认是只要关闭浏览器就会销毁,我们通过setMaxAge()方法来设置有效期,一旦设置了有效期,就不会随着浏览器的关闭而销毁,而是由设置的时间来决定

Cookie是浏览器提供的一种技术,通过服务器的程序能把一些只须保存在客户端,或者在客户端进行处理的数据放在本地计算机上,不需要通过网络传送,因此提高网页处理效率,并且可以减少服务器的负载,但是因为Cookie是服务器端保存在客户端的信息,所以它的安全性也是很差的,例如:常见的记住密码就可以通过Cookie来实现

cookie注意点

1.cookie保存在当前浏览器,不能跨浏览器,更不用说换电脑了
2.cookie存中文问题
cookie不能存中文,如果有中文,则通过URLEncoder.encode()来进行编码

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大西瓜写java、C#、.NET

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值