JWT以及相干实践


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注解

 

posted @ 2021-01-03 14:08  Havk_lzh  阅读(110)  评论(0编辑  收藏  举报