Token生成方案-JWT_jwt生成token

import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
import java.util.Date;
import java.util.UUID;

/**

  • JWT工具类
    */
    public class JwtUtil {
    //有效期为
    public static final Long JWT_TTL = 60 * 60 * 1000L;// 60 * 60 *1000 一个小时
    //设置秘钥明文
    public static final String JWT_KEY = “奇遇少年”;

    /**

    • 创建token
    • @param id
    • @param subject
    • @param ttlMillis
    • @return
      */
      public static String createJWT(String id, String subject, Long ttlMillis) {
      SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
      long nowMillis = System.currentTimeMillis();
      Date now = new Date(nowMillis);
      if (ttlMillis == null) {
      ttlMillis = JwtUtil.JWT_TTL;
      }
      long expMillis = nowMillis + ttlMillis;
      Date expDate = new Date(expMillis);
      SecretKey secretKey = generalKey();
      JwtBuilder builder = Jwts.builder()
      .setId(id) //唯一的ID
      .setSubject(subject) // 主题 可以是JSON数据
      .setIssuer(“yu”) // 签发者
      .setIssuedAt(now) // 签发时间
      .signWith(signatureAlgorithm, secretKey) //使用HS256对称加密算法签 名, 第二个参数为秘钥
      .setExpiration(expDate);// 设置过期时间
      return builder.compact();
      }

    /**

    • 生成加密后的秘钥 secretKey
    • @return
      */
      public static SecretKey generalKey() {
      byte[] encodedKey = Base64.getDecoder().decode(JwtUtil.JWT_KEY);
      SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, “AES”);
      return key;
      }

    /**

    • 解析
    • @param jwt
    • @return
    • @throws Exception
      */
      public static Claims parseJWT(String jwt) throws Exception {
      SecretKey secretKey = generalKey();
      return Jwts.parser()
      .setSigningKey(secretKey)
      .parseClaimsJws(jwt)
      .getBody();
      }
      }


##### 数据准备




CREATE TABLE user (
id int(10) NOT NULL AUTO_INCREMENT,
name varchar(20) DEFAULT NULL,
pwd varchar(20) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8


##### 实体类



@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
private Integer id;
private String name;
private String pwd;
}


##### UserController




package com.exmple.controller;

import com.exmple.pojo.User;
import com.exmple.result.ResponseResult;
import com.exmple.service.UserService;
import com.exmple.utils.JwtUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

@RestController
@RequestMapping(“/user”)
public class UserController {
@Autowired
private UserService userService;

@PostMapping("/login")
public ResponseResult login(@RequestBody User user) {

//校验用户名密码是否正确
User loginUser = userService.login(user);
Map<String, Object> map;
if (loginUser != null) {

        //如果正确 生成token返回
        map = new HashMap<>();
        String token = JwtUtil.createJWT(UUID.randomUUID().toString(),
                String.valueOf(loginUser.getId()), null);
        map.put("token", token);
    } else {

//如果不正确 给出相应的提示
return ResponseResult.error(“用户名或密码错误,请重新登录”);
}
return ResponseResult.success(map);
}
}


##### Service



package com.exmple.service.impl;

import com.exmple.mapper.UserMapper;
import com.exmple.pojo.User;
import com.exmple.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService {

@Autowired
private UserMapper UserMapper;
@Override
public User login(User user) {
    User loginUser = UserMapper.login(user);
    return loginUser;
}

}


##### dao




package com.exmple.mapper;

import com.exmple.pojo.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper {
User login(User user);
}



<?xml version="1.0" encoding="UTF-8" ?> select * from user where name = #{name} and pwd = #{pwd} ```
测试

结语

JWT是一种强大的身份认证解决方案,通过简单的生成和解析流程,能够有效地实现身份认证和信息传递

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

3980122)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 13
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值