会话跟踪——JWT令牌

  • 会话指的是浏览器与服务器之间的一次连接,我们称之为一次会话。
    • 在用户打开浏览器第一个访问服务器的时候,这个会话就建立了,只要有任何一方断开连接,此时会话就结束了。再一次会话中是可以包含多次请求和相应。
  • 那什么是会话跟踪呢?
    • 会话跟踪是一种维护浏览器状态的方法,服务器需要识别请求是否来自同一浏览器,一遍在同一次会话的多次请求间共享数据。而识别多次请求是否来自同一浏览器的过程,我们称之为会话跟踪。
  • 什么是令牌技术?
    • 令牌呢就是一个用户身份的表示,看似很高大上非常神秘,其实本质就是一个字符串。
    • 通过令牌技术跟踪会话,我们就可以在浏览器发起请求。登录接口成功生成令牌,在响应数据的时候就直接将令牌响应给前段。
    • 前段接受到令牌就需要存储起来
    • 后续每次请求都要将令牌携带到服务端,来校验令牌的有效性。令牌有效证明已经执行了登录操作,令牌无效证明并未执行登录操作。
    • 优点:
      • 支持PC端、移动端
      • 解决集群环境下的认证问题
      • 减轻服务器的存储压力(无需再服务器端存储)
    • 缺点:
      • 需要自己实现(包括令牌的生成、传递、校验)
  • JWT介绍(JSON Web Token)
    • 就是一个简单的字符串,可以在请求参数或者是请求头当中直接传递。
    • 自包含:JWT令牌,看似是一个随机的字符串,但是我们是可以根据自身的需求唉JWT令牌中存储自定义的数据类容。
  • JWT组成

     

    • Header(头),记录令牌类型、签名算法等
    • PayLoad(有效载荷),携带一些自定义信息,默认信息等
    • Signature(签名),防止Token被篡改,确保含安全性
  • 介绍完这么多正题来啦,要想使用JWT令牌,首先引入JWT的依赖:
    • 
      
          io.jsonwebtoken
          jjwt
          0.9.1
      

  • 添加Jwt工具类 
    • public class JwtUtils {
      
          private static String signKey = "itheima";//签名密钥
          private static Long expire = 43200000L; //有效时间
      
          /**
           * 生成JWT令牌
           * @param claims JWT第二部分负载 payload 中存储的内容
           * @return
           */
          public static String generateJwt(Map claims){
              String jwt = Jwts.builder()
                      .addClaims(claims)//自定义信息(有效载荷)
                      .signWith(SignatureAlgorithm.HS256, signKey)//签名算法(头部)
                      .setExpiration(new Date(System.currentTimeMillis() + expire))//过期时间
                      .compact();
              return jwt;
          }
      
          /**
           * 解析JWT令牌
           * @param jwt JWT令牌
           * @return JWT第二部分负载 payload 中存储的内容
           */
          public static Claims parseJWT(String jwt){
              Claims claims = Jwts.parser()
                      .setSigningKey(signKey)//指定签名密钥
                      .parseClaimsJws(jwt)//指定令牌Token
                      .getBody();
              return claims;
          }
      }
  •   引用完依赖后,调用工具类中提供的API来完成JWT令牌的生成和校验
    •    
      @RestController
      @Slf4j
      public class LoginController {
          //依赖业务层对象
          @Autowired
          private EmpService empService;
      
          @PostMapping("/login")
          public Result login(@RequestBody Emp emp) {
              //调用业务层:登录功能
              Emp loginEmp = empService.login(emp);
      
              //判断:登录用户是否存在
              if(loginEmp !=null ){
                  //自定义信息
                  Map claims = new HashMap<>();
                  claims.put("id", loginEmp.getId());
                  claims.put("username",loginEmp.getUsername());
                  claims.put("name",loginEmp.getName());
      
                  //使用JWT工具类,生成身份令牌
                  String token = JwtUtils.generateJwt(claims);
                  return Result.success(token);
              }
              return Result.error("用户名或密码错误");
          }
      }

你可能感兴趣的:(springboot,java)