jwt
1, 添加 依赖, 到 service; 因为这跟 业务相关
2, 生成token
添加依赖
修改UserServiceImpl.java
package com.qfedu.fmmall.service.impl;
import com.qfedu.fmmall.dao.UsersMapper;
import com.qfedu.fmmall.dao.UsersMapper;
import com.qfedu.fmmall.entity.Users;
import com.qfedu.fmmall.entity.Users;
import com.qfedu.fmmall.utils.Base64Utils;
import com.qfedu.fmmall.utils.MD5Utils;
import com.qfedu.fmmall.vo.ResStatus;
import com.qfedu.fmmall.vo.ResultVO;
import com.qfedu.fmmall.service.UserService;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
/**
* @author beyondx
* @date Created in 2022/08/10/ 12:04
*/
// 实现类, 纳入spring管理
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UsersMapper usersMapper;
/**
* 注册业务
*
* @param name
* @param pwd
* @return
*/
@Transactional
@Override
public ResultVO userRegist(String name, String pwd) {
synchronized (this) {
// 密码加密存储
// 账号(用户名) 没有被占用
// 严格意义上讲, 这里要加 jvm锁
// 1.根据用户名查询, 这个用户 是否 已经被注册
Example example = new Example(Users.class);
Example.Criteria criteria = example.createCriteria();
criteria.andEqualTo("username", name);
List<Users> users = usersMapper.selectByExample(example);
// 2.如果没有被注册, 则进行保存操作
if (users.size() == 0) {
// 密码加密
String md5Pwd = MD5Utils.md5(pwd);
Users user = new Users();
user.setUsername(name);
user.setPassword(md5Pwd);
user.setUserImg("img/default.png");
user.setUserRegtime(new Date());
user.setUserModtime(new Date());
int i = usersMapper.insertUseGeneratedKeys(user);
if (i > 0) {
return new ResultVO(ResStatus.OK, "注册成功!", user);
} else {
return new ResultVO(ResStatus.NO, "注册失败", null);
}
} else {
return new ResultVO(ResStatus.OK, "用户名已经被注册!", null);
}
}
}
/**
* 登录业务, 不涉及 事务操作; 只是查询
*
* @param name
* @param pwd
* @return
*/
@Override
public ResultVO checkLogin(String name, String pwd) {
Example example = new Example(Users.class);
Example.Criteria criteria = example.createCriteria();
criteria.andEqualTo("username", name);
List<Users> users = usersMapper.selectByExample(example);
if (users.size() == 0) {
return new ResultVO(ResStatus.NO, "登录失败, 用户名不存在!", null);
} else {
String md5Pwd = MD5Utils.md5(pwd);
if (md5Pwd.equals(users.get(0).getPassword())) {
// // 如果登录验证成功, 则需要生成令牌token; 需要给 前端传一个 token(按照特定规则生成的额字符串)
// String token = Base64Utils.encode(name + "QIANfeng6666");
// 基于Base64的不安全性, 下面使用 jwt 生成 token; jwt不仅指定了规则, 还对规则进行了实现
// 使用 jwt规则, 生成 token字符串
JwtBuilder builder = Jwts.builder();
HashMap<String, Object> map = new HashMap<>();
// 给 builder设置参数
String token = builder.setSubject(name) // 主题, 就是 token中 携带的数据; 支持 链式调用
.setIssuedAt(new Date()) // 设置 token的生成时间, 目标是 做 过期校验
.setId(users.get(0).getUserId() + "") // 设置用户id 为 token的 id
.setClaims(map)
.setExpiration(new Date(System.currentTimeMillis() + 24 * 60 * 60 * 1000)) // 设置token的过期时间
.signWith(SignatureAlgorithm.HS256, "QIANfeng6666")// 设置加密方式 和 加密密码
.compact();
return new ResultVO(ResStatus.OK, token, users.get(0));
} else {
return new ResultVO(ResStatus.NO, "登录失败, 密码错误!", null);
}
}
}
}