Session,JWT使用总结

发布时间 2023-06-29 11:53:07作者: 大树2

01.Session:

优点:Session是存储在服务端的,安全
缺点:
服务器集群环境下无法直接使用Session
移动端APP(Android、IOS)中无法使用Cookie
用户可以自己禁用Cookie
Cookie不能跨域

02.令牌技术:JWT令牌 JSON Web Token (官网:https://jwt.io/)

1.定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。由于数字
签名的存在,这些信息是可靠的。

2.JWT的组成: (JWT令牌由三个部分组成,三个部分之间使用英文的点来分割)
第一部分:Header(头), 记录令牌类型、签名算法等。 例如:
{"alg":"HS256","type":"JWT"}
第二部分:Payload(有效载荷),携带一些自定义信息、默认信息等。 例如:
{"id":"1","username":"Tom"}
第三部分:Signature(签名),防止Token被篡改、确保安全性。将header、payload,并加
入指定秘钥,通过指定签名算法计算而来

3.优点:
支持PC端、移动端
解决集群环境下的认证问题
减轻服务器的存储压力(无需在服务器端存储)
缺点:需要自己实现(包括令牌的生成、令牌的传递、令牌的校验)

4.JWT令牌生成和校验
4.1 添加依赖

io.jsonwebtoken jjwt 0.9.1

---------demo---------
package com.alex.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.Map;

public class JwtUtils {
private static String signKey="chenalex";
private static long expire=2436001000;

/**
 * 生产jwt令牌
 * @param claims
 * @return
 */
public static String generateJWT(Map<String,Object> claims,long expires){
    expires=expire;
    String jwt= Jwts.builder()
            .addClaims(claims)
            .signWith(SignatureAlgorithm.HS256,signKey)
            .setExpiration(new Date(System.currentTimeMillis()+ expires))
            .compact();
    return jwt;
}

/**
 * 解析jwt
 * 解析并返回jwt第2部分的payload数据
 */
public static Claims parseJWT(String jwt){
    Claims claims=Jwts.parser()
            .setSigningKey(signKey)
            .parseClaimsJws(jwt)
            .getBody();
    return claims;
}

}
---------------call------------------
@Test
public void testJWT(){
Map<String,Object> claims=new HashMap<>();
claims.put("id",1);
claims.put("name","alexchen");

   String token = JwtUtils.generateJWT(claims,3600);
   System.out.println(token);
   
    Claims claimss =  JwtUtils.parseJWT(token);
    System.out.println(claimss);
}