一.springboot后端
1.导入依赖
<!--jwt-->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.4.0</version>
</dependency>
2.工具类:生成token和认证token
utils–JwtUtil:生成和验证token时传入的参数key必须完全相同,当然可以不使用key,只是用盐值进行加密。这三个参数只有过期时间是必要的。
public class JwtUtil {
private static String sign = "¥g%)0*&fkgn4646"; //盐值
//生成token(传入参数主要是为了能够自定义):参数1 token对谁使用,参数2 token过期时间,参数3 加密盐值
public static String getToken(String audience, int expiresAt, String key, @Nullable Map<String,String> map) {
Date nowDate = new Date();
String token = JWT.create()
.withAudience("TOKEN_AUDIENCE" + audience)
.withIssuer("TOKEN_ISSUER") //签名由谁生成
.withSubject("TOKEN_SUBJECT") //签名的主题
.withIssuedAt(nowDate) //生成签名的时间
.withExpiresAt(new Date(nowDate.getTime() + expiresAt))//这里设置(签名)过期时间
.sign(Algorithm.HMAC256(sign + key));//签名 Algorithm:加密方式
return token;
}
//验证token
public static void verifyToken(String token, String key) {
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(sign + key)).build();
jwtVerifier.verify(token);
}
}
3.在用户登录成功的时候生成token,保存到redis,返回前端
controller的登录接口中调用了
LoginVo loginVo=userService.login(username, SecretUtil.desEncrypt(password));
返回值放入mapmap.put("loginInfo",loginVo.getData());
@RequestMapping(value = "/login",method = RequestMethod.POST)
@ResponseBody
public Message login(String username, String password){
LoginVo loginVo=userService.login(username, SecretUtil.desEncrypt(password));
if(user!=null){
//将用户的身份和权限封装为map返回前端
Map map=new HashMap();
map.put("loginInfo",loginVo.getData());
return onSuccess(map);
}else{
return onError(MessageConstant.MESSAGE_ERROR);
}
}
返回值由业务层处理
@Override
public LoginVo login(String username, String password) {
LoginVo loginVo=new LoginVo();
User user=userMapper.login(username,password);
if(user==null){
loginVo.setResult(false);
loginVo.setMessage("账号不存在");
}else{
if(password.equals(user.getUser_pwd())){
//使用工具类生成token
String token= JwtUtil.getToken(user.getUsername(),60*60*24*1000,user.getUser_pwd(),payload);
//将登录的