前面介绍的时候,我们提到 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 不能跨域