前面介绍的时候,我们提到
Session
,它是服务器端会话跟踪技术,所以它是存储在服务器端的。而 Session 的底层其实就是基于我们刚才所介绍的
Cookie
来实现的。
1.如果我们现在要基于
Session
来进行会话跟踪,浏览器在第一次请求服务器的时候,我们就可
以直接在服务器当中来获取到会话对象
Session
。如果是第一次请求
Session
,会话对象是不存
在的,这个时候服务器会自动的创建一个会话对象
Session
。而每一个会话对象
Session
,它
都有一个
ID
(示意图中
Session
后面括号中的
1
,就表示
ID
),我们称之为
Session
的
ID
。
2.
接下来,服务器端在给浏览器响应数据的时候,它会将
Session
的
ID
通过
Cookie
响应给
浏览器。其实在响应头当中增加了一个
Set-Cookie
响应头。这个
Set-Cookie
响应头
应的值是不是
cookie
?
cookie
的名字是固定的
JSESSIONID
代表的服务器端会话对象
Session
的
ID
。浏览器会自动识别这个响应头,然后自动将
Cookie
存储在浏览器本地。
3.
接下来,在后续的每一次请求当中,都会将
Cookie
的数据获取出来,并且携带到服务端。接下
来服务器拿到
JSESSIONID
这个
Cookie
的值,也就是
Session
的
ID
。拿到
ID
之后,就会
从众多的
Session
当中来找到当前请求对应的会话对象
Session
。
代码测试:
@Slf4j
@RestController
public class
SessionController
{
@GetMapping
(
"/s1"
)
public
Result session1
(
HttpSession session
){
log
.
info
(
"HttpSession-s1: {}"
,
session
.
hashCode
());
session
.
setAttribute
(
"loginUser"
,
"tom"
);
//
往
session
中存储数
据
return
Result
.
success
();
}
@GetMapping
(
"/s2"
)
public
Result session2
(
HttpServletRequest request
){
HttpSession session
=
request
.
getSession
();
log
.
info
(
"HttpSession-s2: {}"
,
session
.
hashCode
());
Object
loginUser
=
session
.
getAttribute
(
"loginUser"
);
//
从
session
中获取数据
log
.
info
(
"loginUser: {}"
,
loginUser
);
return
Result
.
success
(
loginUser
);
}
}
优缺点
优点:
Session
是存储在服务端的,安全
缺点:
服务器集群环境下无法直接使用
Session
移动端
APP(Android
、
IOS)
中无法使用
Cookie
用户可以自己禁用
Cookie
Cookie
不能跨域