• jwt token


    1.token是带过期时间的密钥,可以用来做用户校验,登陆有效期
    2.添加jwt依赖
    3.生成加密字符串,创建map,存入自定义key,value.存入当前时间和过期时间。生成token
    4.传入用来加密的字符串。传入token。可以获得解析后的Jws,从中get到body,取出存进去的map

    token的生成与解析,有jjwt组件与auth0组件支持生成解析token.
    jjwt:json web token,用在web或android开发中的一个生成token的组件
    格式:
    header.body.密文
    {“alg”:“HS256”}.{“userid”:“11”,“createTime”:“12312312312312”,“endTime”:213123123123}.{密文}

    依赖

    <dependency>
                <groupId>io.jsonwebtokengroupId>
                <artifactId>jjwt-apiartifactId>
                <version>${jjwt.version}version>
            dependency>
            <dependency>
                <groupId>io.jsonwebtokengroupId>
                <artifactId>jjwt-implartifactId>
                <version>${jjwt.version}version>
            dependency>
            <dependency>
                <groupId>io.jsonwebtokengroupId>
                <artifactId>jjwt-jacksonartifactId> 
                <version>${jjwt.version}version>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    基于HS256生成复杂密钥

    SecretKey secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256);
            String encode = Encoders.BASE64.encode(secretKey.getEncoded());
            System.out.println(encode);
    
    • 1
    • 2
    • 3

    开始生成token,把生成的密钥闯进生成token的jwt中

    Map<String, Object> m = new HashMap<>(10);
            m.put("id", 1);
            Date date = new Date();
            long time = date.getTime();
            SecretKey test = Keys.hmacShaKeyFor(Decoders.BASE64.decode("89m/fnWuAs3SjWrabAdNRZhWtp6+auFFypvs+cHmd/w="));
            //设置签名(加密原型)时间戳,过期时间
            String compact = Jwts.builder()
                    .addClaims(m)
                    .setIssuedAt(date)
                    .setExpiration(new Date(date.getTime() + 60 * 60*1000))
                    .signWith(test).compact();
            System.out.println(compact);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    解析token

     Key test = Keys.hmacShaKeyFor(Decoders.BASE64.decode("89m/fnWuAs3SjWrabAdNRZhWtp6+auFFypvs+cHmd/w="));
            Jws<Claims> claimsJws = Jwts.parserBuilder().setSigningKey(test).build().parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwiaWF0IjoxNjYzNjczMTk4LCJleHAiOjE2NjM2NzY3OTh9.SqZGseChOeY3fIJJrhYA3t07R0uOpyf9VOZH8RLnMHA");
            Integer id = claimsJws.getBody().get("id", Integer.class);
            System.out.println(claimsJws.getHeader());
            System.out.println(claimsJws.getSignature());
            System.out.println(id); //ExpiredJwtException
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    登陆token思路
    登陆成功(即通过用户名密码在数据库查询到用户后),生成token。添加到响应头中。
    前端在 响应后拦截中获取到响应头中的token,并存储到localstorage中(永久有效,也可以放到cookie或session中,一次会话有效)。
    前端 在请求前拦截中 获取到localstorage中存储的token,并统一配到请求头中(所有请求请求头都包含token)
    后端在登陆拦截器 前拦截方法中获取请求头中的token,并对其进行校验(校验结果:空,过期,不对照,正确)
    正确查缓存(缓存中存的有token,并且有效时间比原token多两分钟)

  • 相关阅读:
    Docker实践:使用Docker搭建个人开发环境
    vue3+elementplus+flask 文件夹上传
    【鸿蒙开发实战】怎样安全和高效的使用N-API开发Native模块
    中国MEMS陀螺仪应用及市场需求空间测算研究报告
    【Ubuntu】Ubuntu20.04下安装视频播放器vlc和录屏软件ssr
    echart双柱状图
    《计算机病毒技术及其防御》 第一章 课后练习详解
    Python3 字典
    网络安全(黑客)自学
    【重磅开源】MapleBoot项目开发规范
  • 原文地址:https://blog.csdn.net/weixin_43775723/article/details/126959994