JWT :按一定规范生成token,通过解密算法逆向解密token
redis集群
方案一 开启tomcat的session 共享 sessionid
(广播风暴)
方案二 redis集群存储登陆token (分布式应用)
高并发 流量带宽损失
方案三 (best) 微服务下登陆解决方案
通过加解密算法生成token校验 ,token加密前的对象不能包含敏感信息。
JWT的组成格式:头部 、负载、签名
header :描述基本加解密签名算法 payload :包含用户基本信息 约定:iss(发行着) ,exp(过期时间), sub(发放给谁)
signature: 把header和payloader进行加密 其作用为:防止伪造
JWT相关实践:
创建工具类 JwtUtils 包含两个方法 ,加密和解密
声明变量
public static final String SUBJECT="lzh"; //头部文件 public static final long EXPIRE=100*60*60*24*7; //过期时间为一周,毫秒,一周 public static final String APPSECRET="xxxxx"; //密钥
方法一 加密形成token
public static String geneJsonWebToken(User user){ if(user==null||user.getId()==null||user.getName()==null||user.getHeadImg()==null) return null; String token=Jwts.builder().setSubject(SUBJECT) .claim("id",user.getId()) .claim("name",user.getName()) .claim("img",user.getHeadImg()) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis()+EXPIRE)) .signWith(SignatureAlgorithm.HS256,APPSECRET).compact(); return token ; }
方法二 传入参数token进行解密(检验token合法性):
public static Claims checkJWT(String token){ try{ final Claims claims= Jwts.parser().setSigningKey(APPSECRET) .parseClaimsJws(token).getBody(); return claims; }catch (Exception e){ } return null; }
下面进行测试:
创建CommonTest类
对方法一进行测试 ,传入自定义属性的user对象,进行加密并打印token
@Test public void testGeneJwt(){ User user=new User(); user.setId(9); user.setHeadImg("www.baidu.com"); user.setName("xd"); String token=JwtUtils.geneJsonWebToken(user); System.out.println(token); }
对方法二进行测试,将上一步形成的token传入,解析出user用户的自定义属性
@Test public void testCheck(){ String token="XXXXXXX"; Claims claims= JwtUtils.checkJWT(token); if (claims!=null){ String name= (String) claims.get("name"); String img= (String) claims.get("img"); int id=(Integer) claims.get("id"); System.out.println(name); System.out.println(img); System.out.println(id); }else{ System.out.println("非法token"); } }
注意 :不要忘记添加@test注解