Session的底层实现原理
Session实现原理
客户对向服务器端发送请求后,Session创建在服务器端,返回Sessionid给客户端浏览器保存在本地,
当下次发送请求的时候,在请求头中传递ssionId获取对应的从服务器上获取对应的Sesison
Session常见问题
Session保证在那⾥?
答案:存放在服务器上
关闭浏览器Session会失效吗
答案:不会消失
我们开始分析SESSION的⼀个原理,这是要重点的去给⼤家讲的,SESSION的原理,我们在讲SESSION原理的时候要快⼀点,
localhost:8080/createSession?nameValue=zhangsan
localhost:8080/getSession
SESSION常见的问题,浏览器关闭了SESSION,SESSION会失效吗,这个是为空的,既然是为空的,在这⾥我们做⼀件事,
localhost:8080/createSession?nameValue=leon644,这个时候我们是不是可以把值存放进去了,这个时候我们再查⼀下,
localhost:8080/getSession,8080-leon644,是不是查得到,这个是属于⼀个⾮常基础的知识,浏览器关闭ssion
会失效吗,这是第⼀个问题,第⼆个问题是SESSION存放在哪⾥,有没有⼈能告诉我答案的,SESSION肯定是存放在服务器端上的,
浏览器关闭SESSION,SESSION会失效吗,肯定不会失效的,为什么呢,这是我要重点去讲的,在这个地⽅我去给⼤家画⼀个图,
画⼀个什么图呢,在这个地⽅我们写⼀下,叫做客户端,我们举⼀反三,然后把它去copy⼀遍,是不是叫做服务器端的,这个地⽅我们
叫做服务器端,你们要记住,我们发起http请求的话,客户端和服务器端要进⾏通信的时候,在这个时候⼤家⼀定要思考⼀下,
⾛的是请求,英⽂叫做request,那么举⼀反三,如果服务器端响应给客户端的时候,这个时候我们叫做respon,这个你们肯定都知道,
respon的英⽂怎么说,我们叫做响应,响应的过程我们叫做respon,那么这个地⽅你们肯定就知道了,本⾝来说⼀个HTTP通信的话,
http通讯本⾝就是基于请求和响应的过程,既然他基于请求和响应的话,这个时候客户端我们可以理解为浏览器,这个地⽅⼤家去看,
你们看代码
Cookie:JSESSIONID=66115D0AA6ACFCF82AA61999799F571A
存⼊Sessionssionid:信息66115D0AA6ACFCF82AA61999799F571A,nameValue:zhangsan,rverPort:8080
这个时候本地是会把SESSIONID保存起来,这表⽰什么意思呢,localhost:8080/createSession?nameValue=zhangsan
这是第⼀次请求,也就是什么意思,也就是客户端向服务器端发起createSession请求的时候,创建ssion,返回ssionId
打开开发者⼯具⾥⾯,当你再去查询的时候,客户端是不是会读取到本地的ssionId,存放到请求头⾥⾯去,是不是能够查到
这个值,在请求头⾥⾯是不是有ssionId,客户端它会读取到本地的ssionId,然后存放到请求头⾥⾯去,他这边是不是就查
对应的结果,你们有没有发现⼀个问题,为什么响应头⾥⾯没有显⽰全,createSession的时候响应头⾥⾯为什么没有ssionId,
但是请求头⾥⾯有ssionId,这是什么原因,你们不觉得不对劲吗,客户端发起⼀个createSession请求的时候,通过响应头
把ssionId响应给客户端,响应头⾥⾯没有返回ssionId给客户端,但是请求头⾥⾯有,这是什么原因,是因为你第⼀次
创建完了之后,
Set-Cookie:JSESSIONID=A8E197E167C7750BB9D19D1B8F420B5B;Path=/;HttpOnly
Cookie:JSESSIONID=66115D0AA6ACFCF82AA61999799F571A
读取缓存中的,在这边你们把缓存全部清掉看,因为它已经有了,清除缓存,他是不是会把本地的ssionId全部给清除掉,
这个之后,是不是返回来ssionId看到没有,
Set-Cookie:JSESSIONID=A8E197E167C7750BB9D19D1B8F420B5B;Path=/;HttpOnly
是不是就是这个ssionId,⾸先客户端向服务端发起请求的时候,它会返回⼀个ssionId给客户端,通过响应头返回给客户端的,
那么浏览器捕获到响应头,获取到对应的ssionId的时候,保存在本地的,保存在本地之后,当你在这边getSession的时候,
他是不是直接读取本地的ssionId,存放在请求头⾥⾯,是不是这样的,是不是可以查到⾥⾯的信息了,是不是这样的,
当我第⼆次重新加载的时候,他是不是没有返回ssionId,因为本地cookie已经缓存了ssionId了,我可以复⽤的,
这就是ssion的整个原理过程,⽐较简单,那么这边我要总结⼀下,你们知道ssion肯定是存在服务器端的,是存放在
客户端的,只是ssionId是存放在客户端进⾏保存的
<>1.8>
<>1.8>
zh_CN
zh_CN
rver:
port:8080
spring:
redis:
databa:0
host:59.110.138.145
port:6666
password:1234
jedis:
pool:
max-active:8
max-wait:-1
max-idle:8
min-idle:0
timeout:10000
redis:
hostname:59.110.138.145
port:6666
password:1234
ller;
rvletRequest;
ssion;
;
BootApplication;
tMapping;
ntroller;
/**
*
*@
*
*/
@SpringBootApplication
@RestController
publicclassTestSessionController{
/**
*这表⽰端⼝号
*这是读取配置⽂件⾥⾯的
*为什么这么做的⽬的
*⽬的是为了区分服务器不同的节点
*
*
*@return
*/
@Value("${}")
privateStringrverPort;
@RequestMapping("/")
publicStringindex(){
returnrverPort;
}
//创建ssion会话
/**
*这段代码表⽰什么意思呢
*表⽰他会去创建⼀个SESSION
*就是通过拿到request对象
*
*⽐如现在客户端发起⼀个createSession请求
*如果他⼀旦发起createSession请求的时候
*那么这个时候你们去看⼀段代码
*看⼀段什么代码呢
*
*
*
*@paramrequest
*@paramnameValue
*@return
*/
@RequestMapping("/createSession")
publicStringcreateSession(HttpServletRequestrequest,StringnameValue){
/**
*看⼀下这段代码
*表⽰什么意思呢
*getSession()他这⾥⾯可以传true或者fal
*不知道你们有没有印象
*你们现在可能不理解true和fal什么意思
*不理解没关系
*待会讲集群的时候你们瞬间就理解了
*默认是true
*这段代码表⽰什么意思呢
*默认创建⼀个ssion
*创建⼀个SESSION的时候
*默认值是true
*⼀旦是为true的情况下的时候
*没有找到对应的SESSION的时候
*⾃动创建SESSION
*他如果去⾃动创建这样的⼀个SESSION的时候
*⼀个SESSION他和什么相似
*ssion分为ssionId和ssionValue
*这个你们知道吧
*这个我相信你们知道
*那么在这⾥我问⼤家⼀个问题
*ssion他和什么⽐较相似
*我不说map集合
*ssion和我们之前学的什么知识⽐较相似
*和TOKEN
*不是cookie
*他和token⾮常相似
*ssion本⾝来说是不是临时的
*是不是⼀个临时的
*他如果是临时的话
*不是永久有效的
*既然是临时的话
*和token是不是很相似
*因为我令牌也是做临时的
*ssionId和token令牌也是⾮常相似的
*保证临时且唯⼀
*这个你们⼀定要记住
*我在后⾯会讲到
*很多公司分布式SESSION⽤什么解决呢
*就⽤token解决
*没有⽤到Spring-Session
*客户端向服务器端肯定会发起⼀个createSession请求
*如果在发起createSession请求的时候
*注意看代码
*服务器端接收到客户端请求之后
*会创建⼀个ssion
*创建完⼀个ssion之后
*通过响应头返回⼀个ssionId
*这个是请求的过程
*这个叫做请求过程
*那么反过来再看
*叫做响应的过程
*注意看⼀下
*请求和响应过程
*第⼆次请求的时候是这样的过程
*这个时候什么意思呢
*客户端向服务器端发起请求的时候
*它会返回⼀个ssionId
*返回⼀个ssionId给客户端
*是不是浏览器
*浏览器它会怎么做呢
*浏览器获取到ssionId以后
*保存在本地
*既然他的ssionId是保存在本地的话
*那么他和什么技术⽐较相似
*想想他和什么技术⽐较相似
*是不是叫做cookie
*是不是⾮常⾮常相似
*那么浏览器这个时候要怎么做呢
*那么在这边我要讲的是什么呢
*第⼆次请求
*客户端读取到本地的ssionId
*存放在请求头中
*服务器端从请求头中获取到对应的ssionId
*使⽤ssionId在本地内存中查询
*你们现在可能还不明⽩什么意思
*在这⾥我们打开我们的开发者⼯具
*当我们发起⼀个createSession请求的时候
*看⼀下它是⼀个什么过程
*我们把⽇志打开
*⼀旦向createSession
*⾸先默认是为true的
*他如果没有ssionId的话
*创建⼀个ssion
*创建⼀个SESSION之后
*返回⼀个ssionId
*对应的是存放的值
*我故意把这个ssion打印出来了
*对应的值是存放在对应的ssionId⾥⾯的
*那你们注意看⼀个效果
*我在这个地⽅去查询的时候
*我们再次发起请求
*找到netWork
*找到响应头
*响应头是不是把ssionId返回给客户端
*也就是⼀个SESSIONID
*客户端拿到ssionId保存在本地了
*
*
*/
HttpSessionssion=sion();
n(
"存⼊Sessionssionid:信息"+()+",nameValue:"+nameValue+",rverPort:"+rverPort);
/**
*在这⾥存放⼀个nameValue这个值
*
*/
*/
ribute("name",nameValue);
return"success-"+rverPort;
}
//获取ssion会话
/**
*这⾥有⼀个获取SESSION
*
*
*@paramrequest
*@return
*/
@RequestMapping("/getSession")
publicObjectgetSession(HttpServletRequestrequest){
//设置为true情况下的时候,客户端使⽤对应的ssionid查询不到对应的sison会直接创建⼀个新的ssion
//设置为fal情况下的时候,客户端使⽤对应的ssionid查询不到对应的sison不会直接创建⼀个新的ssion
/**
*这⾥表⽰获取SESSION
*
*
*/
HttpSessionssion=sion(fal);
if(ssion==null){
returnrverPort+"该服务器上没有存放对应的ssion值";
}
n("获取Sessionssionid:信息"+()+"rverPort:"+rverPort);
/**
*这⾥直接获取getName
*
*
*/
Objectvalue=ribute("name");
returnrverPort+"-"+value;
}
}
;
Application;
BootApplication;
/**
*
*@
*
*/
@SpringBootApplication
publicclassAppSession{
publicstaticvoidmain(String[]args){
/**
*我们直接启动这个项⽬
*
*/
(,args);
}
}
本文发布于:2022-12-07 00:00:13,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/56067.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |