登录认证-登录校验-会话技术

news/2024/5/18 14:29:39 标签: chrome, 前端, Session, Cookie, JWT, 令牌

目录

会话技术

会话跟踪方案对比

Cookie-toc" style="margin-left:80px;">方案一:Cookie

实现思路

具体代码

优点

缺点

Session-toc" style="margin-left:80px;">方案二:Session

实现思路

具体代码

优点

缺点

方案三:令牌技术(主流方案)

实现思路

优点

缺点


会话技术

  • 会话:用户打开浏览器,访问web服务的资源,会话建立,直到一方断开连接,会话结束。在一次会话中包含多次请求和响应。
  • 会话跟踪:一种维护浏览器状态的方法,浏览器需要识别多次请求是否来源于同一个浏览器,以便在同一次会话的多次请求之间共享数据
  • 会话跟踪方案

会话跟踪方案对比

  • Cookie">方案一:Cookie

    • 实现思路

      • 在浏览器第一次发送请求,请求服务器时,可以设置一个Cookie,在Cookie可以存储相关的信息,然后服务器端将Cookie自动(Set-Cookie:name=valie,用于设置Cookie的数据)响应给浏览器,浏览器接收到Cookie后,会自动Cookie的值(name=value)存储到浏览器本地,以后的请求都会自动将存储在本地的Cookie中的数据(Cookie:name=value,用于携带Cookie的数据)传送到服务端,在服务端就可以获取到该Cookie的值,并且判断该Cookie中的值是否存在。
    • 具体代码

    • package com.example.tlias.controller;
      
      import com.example.tlias.pojo.Result;
      import jakarta.servlet.http.Cookie;
      import jakarta.servlet.http.HttpServletRequest;
      import jakarta.servlet.http.HttpServletResponse;
      import lombok.extern.slf4j.Slf4j;
      import org.springframework.web.bind.annotation.GetMapping;
      import org.springframework.web.bind.annotation.RestController;
      
      @RestController
      @Slf4j
      public class SessionController {
          @GetMapping("/c1")
          // todo 设置Cookie
          public Result cookie1(HttpServletResponse response) {
              response.addCookie(new Cookie("login_name", "hkm"));
              return Result.success();
          }
      
          @GetMapping("/c2")
          // todo 获取Cookie
          public Result cookie2(HttpServletRequest request) {
              Cookie[] cookies = request.getCookies();
              for (Cookie cookie : cookies) {
                  if (cookie.getName().equals("login_name")) {
                      System.out.println("login_name:" + cookie.getValue());
                  }
              }
              return Result.success();
          }
      }
      
    • 访问c1运行结果如下

    • 访问c2运行结果如下

      • 优点

        • Http协议中支持的技术
      • 缺点

        • 移动端APP无法使用Cookie
        • 不安全,用户可以自己禁用Cookie
        • Cookie不能跨域(跨域区分的三个维度:协议、ip/域名、端口)
  • Session">方案二:Session

    • 实现思路

      • Sesnsion是服务器端会话跟踪技术,Session是存储在服务器端的,其底层是基于Cookie实现的,在浏览器发送请求请求服务器时,服务器端会自动创建Session会话对象,每一个Session会话对象都会有一个ID,我们称之为SessionID,服务器响应浏览器时会将Session对象的ID通过Cookie响应给浏览器(Set-Cookie:JSESSIONID=1),浏览器会自动存储接受到的Cookie对象至本地,然后在后续的请求会将Cookie的值携带到服务端,服务器获取到Cookie的值(即Session的id),就会找到当前请求的会话对象Session
    • 具体代码

      • package com.example.tlias.controller;
        
        import com.example.tlias.pojo.Result;
        import jakarta.servlet.http.Cookie;
        import jakarta.servlet.http.HttpServletRequest;
        import jakarta.servlet.http.HttpServletResponse;
        import jakarta.servlet.http.HttpSession;
        import lombok.extern.slf4j.Slf4j;
        import org.springframework.web.bind.annotation.GetMapping;
        import org.springframework.web.bind.annotation.RestController;
        
        @RestController
        @Slf4j
        public class SessionController {
        
            // todo 在HttpSession中设置session对象的值
            @GetMapping("/s1")
            public Result Session1(HttpSession session) {
                log.info("HttpSession:{}", session.hashCode());
                session.setAttribute("loginUser-s1","hkm");// 往Session对象中存储
                return Result.success();
            }
        
            @GetMapping("/s2")
            // todo 获取=session对象的值
            public Result Session2(HttpServletRequest request) {
                HttpSession httpSession = request.getSession();
                log.info("HttpSession-s2:{}", httpSession.hashCode());
                Object loginUser = httpSession.getAttribute("loginUser");
                log.info("loginUser:{}", loginUser);
                return Result.success(loginUser);
            }
        
        }
        
        
      • 访问s1运行结果如下:
      • 访问s2运行结果如下 

    • 优点

      • 数据存储在服务端,安全
    • 缺点

      • 服务器集群环境下无法直接使用Sesson
      • Cookie的缺点(Session的底层是基于Cookie实现的)
  • 方案三:令牌技术(主流方案)

    • 实现思路

      • 令牌是用户身份的标识,本质是一个字符串,浏览器发起请求,在请求登录接口时,如果登陆成功,服务端可以生成一个令牌,该令牌是该用户的合法身份凭证,接下来响应数据的时候就可以直接将令牌响应给前端前端就会将令牌存储起来(可以存储在Cookie中也可以存储在其他存储空间中),接下来的每一次请求都会将令牌携带到服务端,服务端会校验该令牌的有效性。
    • 优点

      • 支持PC端、移动端
      • 解决集群环境下的认证问题
      • 减轻服务器的存储压力
    • 缺点

      • 需要自己实现

http://www.niftyadmin.cn/n/4972612.html

相关文章

微信开放注册微信小号功能,工作人群福音!

微信,这个坐拥数亿用户的社交巨头,最近终于开放了注册微信小号的功能。这个功能对于需要多个微信账号进行工作的人来说,无疑是一场及时雨,极大地提高了工作便利性。 在之前的版本中,每个微信账号都绑定了一个手机号&am…

根据案例写PLC程序-红绿灯控制

案例: 1、南北方向红灯点亮30s后熄灭; 2、在点亮南北方向红灯的同时点亮东西方向绿灯,并在点亮25s后,以0.5s熄灭0.5s点亮的时间闪烁3次后熄灭; 3、在东西方向绿灯熄灭后,东西方向黄灯点亮2s后熄灭&#xff…

结合源码拆解Handler机制

作者:Pingred 前言 当初在讲App启动流程的时候,它的整个流程涉及到的类可以汇总成下面这张图: 那时着重讲了AMS、PMS、Binder这些知识点,有一个是没有对它进行详细讲解的,那就是常见的Handler,它不仅在这个…

买卖股票的最佳时机 II【贪心策略】

买卖股票的最佳时机 II 给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。 在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。 返回 你能获得的…

支付宝的支付

对于前端的入门学习的人员来说,支付宝提供的沙箱环境,可以让你体验支付的整个流程。 一、沙箱环境 沙箱(又叫沙盘)环境是用于开发者测试的模拟环境,中间发生任何行为都是虚拟的,如支付。 二、技术选型 支…

安全学习DAY19_小程序信息打点

信息打点-小程序应用&解包反编译&抓包&静态分析&源码架构 文章目录 信息打点-小程序应用&解包反编译&抓包&静态分析&源码架构本节知识&思维导图本节使用到的链接&工具 小程序获取-各大平台&关键字搜索小程序-模版测试上线&源码…

解决MyBatis不能将表中含有下划线的字段映射到实体属性的两种方案

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 问题描述 MyBatis不能准确地将表中含有下划线的字段映射到实体属性。例如:表中的列名为:user_name,实体类中的属性为:userNa…

Ubuntu释放VMware虚拟磁盘未使用空间

By: Ailson Jack Date: 2023.08.26 个人博客:http://www.only2fire.com/ 本文在我博客的地址是:http://www.only2fire.com/archives/152.html,排版更好,便于学习,也可以去我博客逛逛,兴许有你想要的内容呢。…