JAVA全系列 教程
3762个小节阅读:7088.5k
目录
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
在通用模块引入JWT依赖
xxxxxxxxxx
<!-- JWT -->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.4.0</version>
</dependency>
在通用模块编写JWT工具类
xxxxxxxxxx
public class JWTUtil {
//token过期时间,一天
private static final Long EXPIRE_DATE = 1000*60*60*24L;
// 秘钥
private static final String SECRET = "baizhan";
// 签发者
private static final String ISSUER = "BAIZHAN";
/**
* 签名生成
* @param shoppingUser
* @return
*/
public static String sign(ShoppingUser shoppingUser){
String token = JWT.create()
.withIssuer(ISSUER) // 签发者
.withIssuedAt(new Date()) // 签发时间
.withExpiresAt(new Date(new Date().getTime() + EXPIRE_DATE)) // 过期时间
.withSubject(shoppingUser.getUsername()) // 保存用户名
.sign(Algorithm.HMAC256(SECRET)); // 秘钥
return token;
}
/**
* 签名解析
* @param token 签名字符串
* @return 解析得出的用户名
*/
public static String verify(String token){
try {
String username = JWT
.require(Algorithm.HMAC256(SECRET))
.withIssuer(ISSUER)
.build()
.verify(token)
.getSubject();
return username;
} catch (Exception e){
throw new BusException(CodeEnum.VERIFY_TOKEN_ERROR);
}
}
}
登录后生成令牌
xxxxxxxxxx
@Override
public String loginPassword(String username, String password) {
// 1.验证用户名
QueryWrapper<ShoppingUser> queryWrapper = new QueryWrapper();
queryWrapper.eq("username",username);
ShoppingUser shoppingUser = shoppingUserMapper.selectOne(queryWrapper);
if (shoppingUser == null){
throw new BusException(CodeEnum.LOGIN_NAME_PASSWORD_ERROR);
}
// 2.验证密码
boolean verify = Md5Util.verify(password, shoppingUser.getPassword());
if (!verify){
throw new BusException(CodeEnum.LOGIN_NAME_PASSWORD_ERROR);
}
// 3.生成JWT令牌,返回令牌
String sign = JWTUtil.sign(shoppingUser);
return sign;
}
@Override
public String loginCheckCode(String phone, String checkCode) {
ValueOperations valueOperations = redisTemplate.opsForValue();
Object checkCodeRedis = valueOperations.get("loginCode:" + phone);
if (!checkCode.equals(checkCodeRedis)){
throw new BusException(CodeEnum.LOGIN_CODE_ERROR);
}
// 登录成功,查找用户,返回用户名
QueryWrapper<ShoppingUser> queryWrapper = new QueryWrapper();
queryWrapper.eq("phone",phone);
ShoppingUser shoppingUser = shoppingUserMapper.selectOne(queryWrapper);
// 生成JWT令牌,返回令牌
String sign = JWTUtil.sign(shoppingUser);
return sign;
}
将令牌返回给客户端
xxxxxxxxxx
/**
* 用户名密码登录
* @param shoppingUser 用户对象
* @return 登录结果
*/
@PostMapping("/loginPassword")
public BaseResult loginPassword(@RequestBody ShoppingUser shoppingUser){
String sign = shoppingUserService.loginPassword(shoppingUser.getUsername(), shoppingUser.getPassword());
return BaseResult.ok(sign);
}
/**
* 手机号验证码登录
* @param phone 手机号
* @param checkCode 验证码
* @return 登录结果
*/
@PostMapping("/loginCheckCode")
public BaseResult loginCheckCode(String phone,String checkCode){
String sign = shoppingUserService.loginCheckCode(phone, checkCode);
return BaseResult.ok(sign);
}