JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络上安全传输信息的简洁、自包含的方式。它通常被用于身份验证和授权机制。 JWT 由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。 1、头部(Header): 包含了关于生成该 JWT 的信息以及所使用的算法类型。 2、载荷(payload): 包含了要传递的数据,例如身份信息和其他附属数据。 3、签名(Signature): 使用密钥对头部和载荷进行签名,以验证其完整性。 记录JWT如何生成和校验 使用hutool工具生成和校验 1、引入hutool依赖
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.16</version> </dependency>
2、在业务代码中简单生成JWT,接口返回token
@PostMapping("/login")
public ResponseResult login(String username,String password){
if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)){
return ResponseResult.fail(1,"参数有误");
}
// 账号密码的校验
LambdaQueryWrapper<UserInfo> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(UserInfo::getUserName,username);
UserInfo userInfo = userService.getOne(wrapper);
if (ObjectUtils.isEmpty(userInfo)){
return ResponseResult.fail(1,"用户名或者密码有误");
}
if (!userInfo.getPassword().equals(password)){
return ResponseResult.fail(1,"用户名或者密码有误");
}
Map<String,Object> map = new HashMap<>(){
private static final long serialVersionUID = 1L;
{
put("uid",userInfo.getUid());
// 15天时间后过期
put("exp",System.currentTimeMillis() + 1000 * 60 * 60 * 24* 15);
}
};
String token = JWTUtil.createToken(map, AppVariable.JWT_SECRET.getBytes());
return ResponseResult.success(token);
}
这里不用在意前面的密码校验,主要就是map开始生成。
map其实就是载荷,保存用户信息,至于保存什么,可自行决定。
下面是关于如何校验token,和生成一样,也是采用hutool里面的JWTUtil,以下是代码
package org.ongoal.gateway.filter; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; import cn.hutool.jwt.JWT; import cn.hutool.jwt.JWTUtil; import org.ongoal.common.ResponseResult; import org.ongoal.common.config.AppVariable; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; import org.springframework.http.HttpStatus; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.stereotype.Component; import org.springframework.util.ObjectUtils; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; import java.util.List; @Component public class AuthFilter implements GlobalFilter , Ordered { private String[] skipAuthUrl = {"/user/login"}; @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { String url = exchange.getRequest().getURI().getPath(); for (String s : skipAuthUrl) { if (s.equals(url)){ return chain.filter(exchange); } } ServerHttpResponse response = exchange.getResponse(); //登陆判断 List<String> tokens = exchange.getRequest().getHeaders().get(AppVariable.TOKEN_KEY); if (CollUtil.isEmpty(tokens)){ response.setStatusCode(HttpStatus.UNAUTHORIZED); return response.setComplete(); } // token不为空 String token = tokens.get(0); boolean verify = false; try { verify = JWTUtil.verify(token, AppVariable.JWT_SECRET.getBytes()); // 这行就是JWTUtil解析token }catch (Exception e){ verify = false; } if (!verify){ response.setStatusCode(HttpStatus.UNAUTHORIZED); return response.setComplete(); }else { //看下是否过期 final JWT jwt = JWTUtil.parseToken(token); // 得到过期时间 Object expObj = jwt.getPayload("exp"); if (ObjUtil.isEmpty(expObj)){ response.setStatusCode(HttpStatus.UNAUTHORIZED); return response.setComplete(); } long exp = Long.parseLong(expObj.toString()); if (System.currentTimeMillis() >= exp){ response.setStatusCode(HttpStatus.UNAUTHORIZED); return response.setComplete(); } } return chain.filter(exchange); } @Override public int getOrder() { return 0; } }
主要就是这段校验
至此,简单的JWTUtil生成token和校验token完成。
以上为demo,只作为个人学习笔记!
标签:和校验,return,JWT,hutool,生成,token,org,import From: https://www.cnblogs.com/qwg-/p/18002086