存储用户登陆状态方案:
方案1:session存储。
方案2:JWT
另一种方案是JVM索性不保存 session 数据了,所有数据都保存在客户端或保存到一个公共的存储介质,JWT 就是这种方案的一个代表。
JWT介绍
JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案。是用于对应用程序上的用户进行身份验证的标记。也就是说,使用 JWT 的应用程序不再需要保存有关其用户的 cookie 或其他session数据。此特性便于可伸缩性,同时保证应用程序的安全。
在身份验证过程中, 当用户使用其凭据成功登录时, 将返回 JSON Web token。
每当用户要访问受保护的资源时,需要在请求头中携带 JWT。后端服务器接收到带有 JWT 的请求时,首先要做的是验证token。
JWT格式
JWT使用
1、导入依赖:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
</dependency>
测试类:
/**
* jwt单元测试
*/
public class JwtTest {
@Test
public void testJwt(){
// 1.定义加密内容
Map<String, Object> map = new HashMap<>();
map.put("id", 1);
map.put("mobile", "12345678901");
// 2.定义加密密钥
String secret = "XXX";
// 3.生成jwt字符串
String token = Jwts.builder()
.setClaims(map)
.signWith(SignatureAlgorithm.HS256, secret)
.compact();
System.out.println("生成token:" + token);
// 4.解析token,获取map集合
Map<String, Object> body = (Map<String, Object>)
Jwts.parser().setSigningKey(secret).parse(token).getBody();
System.out.println("body内容:" + body);
}
}
2、抽取JWT工具类:
public class JwtUtils {
//参数1、id 参数2、手机号码 参数3、加密的密匙
public static String createToken(Long id, String phone, String secret) {
// 定义要加密的数据
Map<String,Object> map = new HashMap<>();
map.put("id", id);
map.put("phone", phone);
// 生成token并返回
return Jwts.builder()
.setClaims(map) // 声明加密的数据
.signWith(SignatureAlgorithm.HS256, secret) // 指定加密算法与密钥
.compact();
}
}
3、yml 配置密钥
secret: XXX # 密钥
4、类中使用通过@Value注解加上yml配置密匙全路径获取-密钥
// 获取密钥
@Value("${XXX}")
private String secret;
// 【使用抽取的JWT工具类生成token、存储token到redis中】
String token = JwtUtils.createToken(user.getId(), phone, secret);
// 【往token中存储的应该是整个用户对象数据,所以这里需要把对象转换为json字符串存储】
String tokenData = JSON.toJSONString(user);
// 【生成的token作为key,用户数据作为value,存储到redis中,并设置过期时间】
redisTemplate.opsForValue().set(TOKEN_KEY + token, tokenData, Duration.ofHours(4));
|