Cookie
优点:
- HTTP协议自带支持
缺点:
- 移动端无法使用
- 不安全, 用户可以手动禁用
- Cookie不能跨域使用
使用
1.设置 Cookie
@GetMapping ("/c1")
public Result cookie1 (HttpServletResponse response){
response.addCookie (new Cookie ("login_username", "itheima")); // 设置 Cookie / 响应 Cookie
return Result.success ();
}
2.获取 Cookie
@GetMapping ("/c2")
public Result cookie2 (HttpServletRequest request){
Cookie [] cookies = request.getCookies ();
for (Cookie cookie : cookies) {
if (cookie.getName ().equals ("login_username")){
System.out.println ("login_username:"+cookie.getValue ()); // 输出 name 为 login_username 的 cookie
}
}
return Result.success ();
}
Session
优点:
- 存储在服务端, 安全
缺点:
- 服务器集群环境无法直接使用
- Cookie的缺点
1.存值
@GetMapping ("/s1")
public Result session1 (HttpSession session){
log.info("HttpSession-s1: {}", session.hashCode ());
session.setAttribute ("loginUser", "tom"); // 往 session 中存储数据
return Result.success ();
}
3.取值
@GetMapping ("/s2")
public Result session2 (HttpSession session){
log.info("HttpSession-s2: {}", session.hashCode ());
Object loginUser = session.getAttribute ("loginUser"); // 从 session 中获取数据
log.info("loginUser: {}", loginUser);
return Result.success(loginUser);
}
Token
优点:
- 支持PC端、移动端
- 解决集群环境下的认证问题
- 减轻服务器端存储压力
缺点:
- 需要手动实现
JWT令牌
介绍:
- 全称: Json Web Token
- 定义了一种简洁的、自包含的格式,用于在通信双方以 json 数据格式安全的传输信息
组成:
- 第一部分:Header(头),记录令牌类型、签名算法等。 例如:{"alg":"HS256","type":"JWT"}
- 第二部分:Payload(有效载荷),携带一些自定义信息、默认信息等。 例如:{"id":"1","username":"Tom"}
- 第三部分:Signature(签名),防止 Token 被篡改、确保安全性。将 header、payload 融入,并加入指定秘钥,通过指定签名算法计算而来。
实现:
- 常量:
private static final String SECRET_KEY = "WFhYWUphZGU=";
private static final long EXPIRATION_TIME = 12 * 60 * 60 * 1000;
SECRET_KEY : 密钥,通过Base64编码
EXPIRATION_TIME : 令牌有效时长
- 生成
public static String generateToken(Map<String,Object> claims){
return Jwts.builder()
.signWith(SignatureAlgorithm.HS256,SECRET_KEY) //设置加密算法和密钥
.addClaims(claims) //添加信息
.setExpiration(new Date(System.currentTimeMillis()+EXPIRATION_TIME)) //设置有效期
.compact();
}
- 解析
public static Claims parseToken(String token){
return Jwts.parser()
.setSigningKey(SECRET_KEY) //设置密钥
.parseClaimsJws(token) //解析信息
.getBody();
}