Java会话技术之 —— cookie与session

前言

说到cookie与session,想必大家都不陌生,写过单机模式下的登录业务逻辑的应该多少都会接触到cookie与session,对于cookie和session,很多同学第一反应就是cookie是存储再客户端浏览器的,而session是放在服务端的

对于网上一大堆的关于对比cookie与session技术的,对于面试来讲,临时突击加以记忆还是可以的,但说到具体的使用以及原理,还是有必要对其做一些深入的理解和探讨

首先我们通过一个具体的小案例来看看cookie与session的由来

业务场景

假如在单机模式下,系统需要先进行登录,然后才能访问其他的资源(接口)

1、环境准备

快速搭建一个springboot工程,提供两个接口,登录接口和获取用户信息接口

@RestController
public class LoginController {

    @GetMapping("/login")
    public String login(HttpSession session,HttpServletRequest request,HttpServletResponse response,
                        String username, String password) {
        if(username.equals("admin") && password.equals("123456")){
            session.setAttribute("login_info",username);
            return "login success:" + username;
        }
        return "login fail:" + username;
    }

    @GetMapping("/info")
    public String getLoginInfo(HttpSession session,HttpServletRequest request,HttpServletResponse response) {
        return "info:" + session.getAttribute("login_info");
    }

}

首先调第一个登录接口:http://localhost:8081/login?username=admin&password=123456

在这里插入图片描述
接着调第二个获取用户信息接口:
在这里插入图片描述
在此,我们注意到,通过F12观察到cookie那一栏中,在登陆成功后会产生一个 :jsessionid = B8F3038B28A83185F50BEB116CB97805

而session与cookie的由来就要从这里说起

2、cookie与session产生的背景

在这里插入图片描述

上图是一个非常简单的客户端通过浏览器访问服务端的示意图,由于浏览器发起请求是无状态的,即请求不会直接保存客户端的会话信息,但是服务端为了安全考虑以及记录客户端请求的会话信息,于是需要一种中间介质,可理解为缓存空间,于是各自保存一下本次的会话信息,而对于双方来说,只需要一个凭证用于标识对方的身份,这个标识就是上面的JSESSIONID

对于客户端来说,保存的位置就是浏览器中看到的cookie,而服务端来说,就是session,那么对于上面的两个接口可以拆成下面两步:

  1. 用户登录成功后,服务端保存JESSIONID至session,同时浏览器将JESSIONID保存至cookie,这一步通过浏览器的接口请求的header信息也可以看到,可理解为,客户端登录时顺便携带了这个JESSIONID作为凭证告知服务端,这个就是双方确认身份的凭证

在这里插入图片描述
2、再次调用获取用户信息接口时,客户端在请求头中携带上面的JSESSIONID,服务端从session中解析这个JSESSIONID的值,解析到了,就从session中取出来,这里不管是通过断点还是浏览器的请求header都可以反映出这个信息
在这里插入图片描述

在这里插入图片描述
3、清掉cookie,再次发起调用用户信息接口时,这一次 /info接口携带新的cookie,服务端拿到这个值去session中找并不存在,因此返回了null
在这里插入图片描述
4、更换浏览器,在调用了登录接口之后,通过另一个浏览器访问,无法获取到用户的信息,这说明cookie具有禁止跨域的操作
在这里插入图片描述
5、重新启动后端服务,在浏览器没有做变更的状态下,再次访问获取用户信息接口,发现未能获取到用户的信息,说明服务端保存session信息是存在于tomcat的进程中
在这里插入图片描述
6、使用上述相同的工程再启动一个相同的服务,以端口区分,然后8081端口依次访问登录,获取用户信息,8082获取用户信息(同一个浏览器)

在这里插入图片描述
在这里插入图片描述

很明显,8081和8082是两个服务对应着不同的进程,8082拿着8081的JSESSIONID去请求第二个服务的用户信息肯定是请求不到结果的

从第六步的演示,我们开始思考一个问题,同一个服务部署多份的情况下(集群部署),如何才能获取到任一台服务上的资源呢?于是就产生了分布式会话技术

最后再简单总结下Cookie(Session)的技术点

  1. Cookie属于客户端(浏览器)技术,session属于服务端(tomcat)技术
  2. 各自记录JSSESIONID的值,作为双方互认的凭证,可用于登录校验中(通过header头中携带cookie的信息,服务端解析Cookie进行前置校验)
  3. Cookie具有不可跨域性
  4. 服务端的session信息的生命周期随着容器的销毁而销毁
  5. Cookie可以在浏览器进行修改、删除
  6. Cookie可以设置有效期(过期时间)

本篇通过案例演示说明了cookie与session的使用和原理,由于从cookie的原理衍生出了众多的分布式会话解决方案,但是其核心原理都是从这里出发,希望能够深入理解,本篇到此结束,最后感谢观看!

猜你喜欢

转载自blog.csdn.net/zhangcongyi420/article/details/113141343