zoukankan      html  css  js  c++  java
  • 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注解

  • 相关阅读:
    C++高精度运算类bign (重载操作符)
    Spring4.0支持Groovy配置
    统计Oracle数据库文件的大小
    ThinkPHP pdo连接Oracle的配置写法,提示报错
    【PHP缩略图类】手机照片不能生成缩略图问题以及解决方式
    ping and traceroute(tracert)
    HDU-1053-Entropy(Huffman编码)
    Python学习之四【变量】
    linux mysql
    xorm
  • 原文地址:https://www.cnblogs.com/who-am-i/p/14221036.html
Copyright © 2011-2022 走看看