Session,JWT使用总结
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 添加依赖
---------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);
}