1、需要引入hutool依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.16</version>
</dependency>
2、编写工具类
package com.jiawa.train.common.util;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.json.JSONObject;
import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTPayload;
import cn.hutool.jwt.JWTUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.Map;
/**
* jwt工具类
*/
public class JwtUtil {
private static final Logger LOG = LoggerFactory.getLogger(JwtUtil.class);
/**
* 盐值很重要,不能泄漏,且每个项目都应该不一样,可以放到配置文件中
*/
private static final String KEY = "Jiawa12306";
/**
* 创建token
* @param id
* @param mobile
* @return
*/
public static String createToken(Long id, String mobile) {
DateTime now = DateTime.now();
DateTime expTime = now.offsetNew(DateField.HOUR, 24);
Map<String, Object> payload = new HashMap<>();
// 签发时间
payload.put(JWTPayload.ISSUED_AT, now);
// 过期时间
payload.put(JWTPayload.EXPIRES_AT, expTime);
// 生效时间
payload.put(JWTPayload.NOT_BEFORE, now);
// 内容
payload.put("id", id);
payload.put("mobile", mobile);
String token = JWTUtil.createToken(payload, KEY.getBytes());
LOG.info("生成JWT token:{}", token);
return token;
}
/**
* 校验token
* @param token
* @return
*/
public static boolean validate(String token) {
JWT jwt = JWTUtil.parseToken(token).setKey(KEY.getBytes());
// validate包含了verify
boolean validate = jwt.validate(0);
LOG.info("JWT token校验结果:{}", validate);
return validate;
}
public static JSONObject getJSONObject(String token) {
JWT jwt = JWTUtil.parseToken(token).setKey(KEY.getBytes());
JSONObject payloads = jwt.getPayloads();
payloads.remove(JWTPayload.ISSUED_AT);
payloads.remove(JWTPayload.EXPIRES_AT);
payloads.remove(JWTPayload.NOT_BEFORE);
LOG.info("根据token获取原始内容:{}", payloads);
return payloads;
}
public static void main(String[] args) {
createToken(1L, "123");
String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYmYiOjE2NzY4OTk4MjcsIm1vYmlsZSI6IjEyMyIsImlkIjoxLCJleHAiOjE2NzY4OTk4MzcsImlhdCI6MTY3Njg5OTgyN30.JbFfdeNHhxKhAeag63kifw9pgYhnNXISJM5bL6hM8eU";
validate(token);
getJSONObject(token);
}
}
3、登录颁发token
package com.jiawa.train.member.service;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import com.jiawa.train.common.exception.BusinessException;
import com.jiawa.train.common.exception.BusinessExceptionEnum;
import com.jiawa.train.common.resp.CommonResp;
import com.jiawa.train.common.resp.MemberLoginResp;
import com.jiawa.train.common.util.JwtUtil;
import com.jiawa.train.common.util.SnowUtil;
import com.jiawa.train.member.domain.Member;
import com.jiawa.train.member.domain.MemberExample;
import com.jiawa.train.member.mapper.MemberMapper;
import com.jiawa.train.member.req.MemberLoginReq;
import com.jiawa.train.member.req.MemberRegisterReq;
import com.jiawa.train.member.req.MemberSendCodeReq;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @Author lhj
* @Date 2023-06-02 22:56
*/
@Service
public class MemberService {
private static final Logger LOG = LoggerFactory.getLogger(MemberService.class);
@Autowired
private MemberMapper memberMapper;
public CommonResp<Long> register(MemberRegisterReq req) {
String mobile = req.getMobile();
MemberExample memberExample = new MemberExample();
memberExample.createCriteria().andMobileEqualTo(mobile);
List<Member> memberList = memberMapper.selectByExample(memberExample);
if (CollUtil.isNotEmpty(memberList)) {
throw new BusinessException(BusinessExceptionEnum.MEMBER_MOBILE_EXIST);
}
Member member = new Member();
member.setId(SnowUtil.getSnowflakeNextId());
member.setMobile(mobile);
memberMapper.insert(member);
return new CommonResp<>(member.getId());
}
public CommonResp<Long> sendCode(MemberSendCodeReq req) {
String mobile = req.getMobile();
MemberExample memberExample = new MemberExample();
memberExample.createCriteria().andMobileEqualTo(mobile);
List<Member> memberList = memberMapper.selectByExample(memberExample);
if (CollUtil.isEmpty(memberList)) {
LOG.info("该号码未注册,插入数据库....");
Member member = new Member();
member.setId(SnowUtil.getSnowflakeNextId());
member.setMobile(mobile);
memberMapper.insert(member);
}
String code = RandomUtil.randomNumbers(4);
LOG.info("手机验证码code:{}......", code);
return new CommonResp<>();
}
public MemberLoginResp login(MemberLoginReq req) {
String code = req.getCode();
Member memberDB = selectByMobile(req.getMobile());
// 如果手机号不存在 抛异常
if (ObjectUtil.isNull(memberDB)) {
throw new BusinessException(BusinessExceptionEnum.MEMBER_MOBILE_NOT_EXIST);
}
// 校验短信验证码
if (!"8888".equals(code)) {
throw new BusinessException(BusinessExceptionEnum.MEMBER_MOBILE_CODE_ERROR);
}
// Bean赋值 从memberDB对象中获取属性值,并将其设置到memberLoginResp对象中对应的属性中。
MemberLoginResp memberLoginResp = BeanUtil.copyProperties(memberDB, MemberLoginResp.class);
// 颁发token
String token = JwtUtil.createToken(memberLoginResp.getId(), memberLoginResp.getMobile());
memberLoginResp.setToken(token);
return memberLoginResp;
}
private Member selectByMobile(String mobile) {
MemberExample memberExample = new MemberExample();
memberExample.createCriteria().andMobileEqualTo(mobile);
List<Member> list = memberMapper.selectByExample(memberExample);
if (CollUtil.isEmpty(list)) {
return null;
} else {
return list.get(0);
}
}
}