会话技术介绍

会话技术

代码测试环境:JDK 17 + SpringBoot + maven

1. 介绍

什么是会话?

  • 在我们日常生活当中,会话指的就是谈话、交谈。
  • 在 web 开发当中,会话指的就是浏览器与服务器之间的一次连接,我们就称为一次会话。

知道了会话的概念了,接下来我们再来了解下会话跟踪。

会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。

会话跟踪技术有:

  1. Cookie(客户端会话跟踪技术):数据存储在客户端浏览器当中
  2. Session(服务端会话跟踪技术):数据存储在储在服务端
  3. 令牌技术

2. 跟踪技术

2.1 Cookie

cookie 是客户端会话跟踪技术,它是存储在客户端浏览器的,我们使用 cookie 来跟踪会话,我们就可以在浏览器第一次发起请求来请求服务器的时候,我们在服务器端来设置一个 cookie。

Cookie 运行流程的 3 个自动:

  • 服务器会 自动 的将 cookie 响应给浏览器。
  • 浏览器接收到响应回来的数据之后,会 自动 的将 cookie 存储在浏览器本地。
  • 在后续的请求当中,浏览器会 自动 的将 cookie 携带到服务器端。

cookie 跟踪方案的原理

  • 响应头 Set-Cookie :设置 Cookie 数据的
  • 请求头 Cookie:携带 Cookie 数据的

代码测试:

@Slf4j
@RestController
public class SessionController {
  // 设置 Cookie
  @GetMapping("/c1")
  public Result cookie1(HttpServletResponse response){
    // 设置 Cookie / 响应 Cookie
    response.addCookie(new Cookie("login_username","itheima"));
    return Result.success();
  }

  // 获取 Cookie
  @GetMapping("/c2")
  public Result cookie2(HttpServletRequest request){
    Cookie[] cookies = request.getCookies();
    for (Cookie cookie : cookies) {
      if(cookie.getName().equals("login_username")){
        // 输出 name 为 login_username 的 cookie
        System.out.println("login_username: "+cookie.getValue());
      }
    }
    return Result.success();
  }
}

Cookie 的优缺点:

  1. 优点:HTTP 协议中支持的技术
  2. 缺点:
    1. 移动端 APP 无法使用 Cookie
    2. 由于存储在客户端,相对不安全
    3. Cookie 不能跨域

2.2 Session

如果要基于 Session 来进行会话跟踪,浏览器在第一次请求服务器的时候,我们就可以直接在服务器当中来获取到会话对象 Session。如果是第一次请求 Session ,会话对象是不存在的,这个时候服务器会自动的创建一个会话对象 Session 。而每一个会话对象 Session ,它都有一个 ID,我们称之为 Session 的 ID。

原理:底层是基于 Cookie 实现。服务端会响应给客户端一个 Cookie,通常称为 JSESSIONID,即服务器生成的 SessionID

代码测试:

@Slf4j
@RestController
public class SessionController {
  @GetMapping("/s1")
  public Result session1(HttpSession session){
    log.info("HttpSession-s1: {}", session.hashCode());

    // 往 session 中存储数据
    session.setAttribute("loginUser", "tom");
    return Result.success();
  }

  @GetMapping("/s2")
  public Result session2(HttpServletRequest request){
    HttpSession session = request.getSession();
    log.info("HttpSession-s2: {}", session.hashCode());

    // 从 session 中获取数据
    Object loginUser = session.getAttribute("loginUser");
    log.info("loginUser: {}", loginUser);
    return Result.success(loginUser);
  }
}

Session 的优缺点:

  1. 优点:
    1. 存储在服务端,相对安全
    2. 原生态 HTTP 协议支持技术
  2. 缺点:
    1. 服务器集群环境下无法直接使用 Session
    2. Cookie 的缺点它都有
    3. 浪费服务器内存空间

2.3 令牌技术

如果通过令牌技术来跟踪会话,我们就可以在浏览器发起请求。在请求登录接口的时候,如果登录成功,我就可以生成一个令牌,令牌就是用户的合法身份凭证。接下来我在响应数据的时候,我就可以直接将令牌响应给前端。

接下来我们在前端程序当中接收到令牌之后,就需要将这个令牌存储起来。这个存储可以存储在 cookie 当中,也可以存储在其他的存储空间当中。

接下来,在后续的每一次请求当中,都需要将令牌携带到服务端。携带到服务端之后,接下来我们就需要来校验令牌的有效性。如果令牌是有效的,就说明用户已经执行了登录操作,如果令牌是无效的,就说明用户之前并未执行登录操作。

此时,如果是在同一次会话的多次请求之间,我们想共享数据,我们就可以将共享的数据存储在令牌当中就可以了。

优缺点

  • 优点:
    • 支持 PC 端、移动端
    • 解决集群环境下的认证问题
    • 减轻服务器的存储压力(无需在服务器端存储)
  • 缺点:需要自己实现

JWT令牌最典型的应用场景就是登录认证:

  1. 在浏览器发起请求来执行登录操作,此时会访问登录的接口,如果登录成功之后,我们需要生成一个 jwt 令牌,将生成的 jwt 令牌返回给前端。
  2. 前端拿到 jwt 令牌之后,会将 jwt 令牌存储起来。在后续的每一次请求中都会将 jwt 令牌携带到服务端。
  3. 服务端统一拦截请求之后,先来判断一下这次请求有没有把令牌带过来,如果没有带过来,直接拒绝访问,如果带过来了,还要校验一下令牌是否是有效。如果有效,就直接放行进行请求的处理。

在 JWT 登录认证的场景中我们发现,整个流程当中涉及到两步操作:

  1. 在登录成功之后,要生成令牌。
  2. 每一次请求当中,要接收令牌并对令牌进行校验。

具体的 JWT 使用参考 java 中的身份校验

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值