• 【Token】JWT使用Token进行登录


    1.Token

    token:服务端生成的一串字符串,可以解决频繁登录的问题
    它作为客户端进行请求的一个令牌:
    第一次登录后,服务器生成一个token返回给客户端;
    客户端只需要带上token来请求数据即可,无需再次带上用户名和密码

    2.使用目的

    为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮

    3.Token存放在客户端

    服务端生成的Token

    存放在客户端的Token 

     


    1.JWT的pom包

    1. <dependency>
    2. <groupId>io.jsonwebtokengroupId>
    3. <artifactId>jjwtartifactId>
    4. <version>0.9.1version>
    5. dependency>

    2.JWT工具类

    1. private static final String jwtToken = "xiaosuda"; //C部分;签名
    2. //生成Token:通过UserId创建Token
    3. public static String createToken(Long userId){
    4. Map claims = new HashMap<>();
    5. claims.put("userId",userId);
    6. JwtBuilder jwtBuilder = Jwts.builder()
    7. .signWith(SignatureAlgorithm.HS256, jwtToken) //A部分;表头
    8. .setClaims(claims) //B部分;负载
    9. .setIssuedAt(new Date())
    10. .setExpiration(new Date(System.currentTimeMillis() + 24 * 60 * 60 * 1000));
    11. String token = jwtBuilder.compact();
    12. return token;
    13. }
    14. //解析Token
    15. public static Map checkToken(String token){
    16. try {
    17. Jwt parse = Jwts.parser().setSigningKey(jwtToken).parse(token);
    18. return (Map) parse.getBody();
    19. }catch (Exception e){
    20. e.printStackTrace();
    21. }
    22. return null;
    23. }

    这里解析token可以更简单的写直接返回clams获得各种信息,因为我后面还做了封装

    3.登录生成token逻辑

    1. @Override
    2. public Result login(LoginParams loginParams) {
    3. String account = loginParams.getAccount(); //拿到账号
    4. String password = loginParams.getPassword(); //拿到密码
    5. String slat = loginParams.getSlat(); //拿到加密盐
    6. //根据用户名和密码取user表中查询,查询是否存在
    7. if (StringUtils.isBlank(account)||StringUtils.isBlank(password)){
    8. return Result.fail(ErrorCode.PARAMS_ERROR.getCode(),ErrorCode.PARAMS_ERROR.getMsg());
    9. }
    10. password= DigestUtils.md5Hex(password + slat);
    11. SysUser sysUser = sysUserService.findUser(account,password);
    12. //每次登录生成新的token
    13. String token = JWTUtils.createToken(sysUser.getId());
    14. System.out.println("=================================");
    15. System.out.println("第一次登陆的的token: "+token);
    16. System.out.println("=================================");
    17. return Result.success(token);
    18. }

    这样登入成功后客户端会存放一个token 


    1. /*
    2. 登录后用户:验证token是否合法的方法
    3. */
    4. @Override
    5. public SysUser checkToken(String token) {
    6. //判断是否为空
    7. if (StringUtils.isBlank(token)){
    8. System.out.println("前端没有传来token");
    9. return null;
    10. }
    11. Map stringObjectMap = JWTUtils.checkToken(token);
    12. //解析是否成功
    13. if (stringObjectMap == null){
    14. System.out.println("token解析未成功");
    15. return null;
    16. }
    17. String userJson = redisTemplate.opsForValue().get("TOKEN_" + token);
    18. //Redis是否校验成功
    19. if (StringUtils.isBlank(userJson)){
    20. System.out.println("redis中token不正确");
    21. return null;
    22. }
    23. SysUser sysUser = JSON.parseObject(userJson, SysUser.class);
    24. return sysUser;
    25. }

    这里对校验token进行了进一步封装,原本逻辑是直接调用JWT工具类中的checktoken生成claims

    1. @Override
    2. public Result findUserByToken(String token) {
    3. //校验失败:通过 loginService.checkToken 的方法实现以上三个检查条件
    4. SysUser sysUser = loginService.checkToken(token);
    5. if (sysUser == null){
    6. return
    7. Result.fail(ErrorCode.TOKEN_ERROR.getCode(),ErrorCode.TOKEN_ERROR.getMsg());
    8. }
    9. LoginUserVo loginUserVo = new LoginUserVo();
    10. loginUserVo.setId(String.valueOf(sysUser.getId()));
    11. loginUserVo.setNickname(sysUser.getNickname());
    12. loginUserVo.setAvatar(sysUser.getAvatar());
    13. loginUserVo.setAccount(sysUser.getAccount());
    14. return Result.success(loginUserVo); //验证成功
    15. }
  • 相关阅读:
    arm-linux 原子操作
    OS 处理机调度
    基于SSM+MySQL+Bootstrap的员工信息管理系统
    论文笔记 《FAST-LIO2: Fast Direct LiDAR-inertial Odometry》及 激光SLAM综述
    Machine Learning With Go 第4章:回归
    单条视频播放近4000w,如何利用“跟风效应”实现流量暴增?
    RK3568驱动指南|第五期-中断-第49章 中断线程化实验
    结构体学习
    Java EE——线程
    arduino 记录
  • 原文地址:https://blog.csdn.net/m0_46628950/article/details/126207776