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>

基于HS256生成复杂密钥

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

开始生成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);

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

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

你可能感兴趣的:(java)