token 工具类的编写

530 阅读2分钟

方式一

<!--jwt-->
    <dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.7.0</version>
    </dependency>
public class JwtUtil  {

    private static final String secret = "asdfasdf";
    //根据设置的secret,生成token
    public static String createToken(String subject){

        String token = Jwts.builder().setSubject(subject)
            //设置过期时间 3s
            .setExpiration(new Date(System.currentTimeMillis()+1000*3))
            .signWith(SignatureAlgorithm.HS256,secret)
            .compact();
        return token;
    }
    //解析token
    public static String parseToken(String token){
        Claims body = Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
        String subject = body.getSubject();
        return subject;
    }

    public static void main(String[] args) throws InterruptedException {
        String name = "海王";

        String token = createToken(name);
        System.out.println("token:"+token);

        String srcStr = parseToken(token);
        System.out.println("解析出来:"+srcStr);
        System.out.println("==========================");
        //睡眠4秒
        TimeUnit.SECONDS.sleep(4);
        srcStr = parseToken(token);
        System.out.println("解析出来:"+srcStr);

    }
}

运行结果

token:

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiLmtbfnjosiLCJleHAiOjE2Njc3MTg2NjB9.53zZ4F5uNC4psd1SNzNp3ehBDBVUaIcHiXWHN2O4KTw

eyJhbGciOiJIUzI1NiJ9 :基于base64.encode(header) 编码

eyJzdWIiOiLmtbfnjosiLCJleHAiOjE2Njc3MTg2NjB9 :基于base64编码 包含 用户信息

53zZ4F5uNC4psd1SNzNp3ehBDBVUaIcHiXWHN2O4KTw :(散列加密 (payload ,盐(secret)))

package com.whj.dongbao.common.base;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.concurrent.TimeUnit;

/**
* @Auther: wanghaijun
* @Date: 2022/11/6 - 11 - 06 - 14:25 
* @Description: com.whj.dongbao.common.base
*/

public class JwtUtil  {

    private static final String secret = "asdfasdf";
    //根据设置的secret,生成token
    public static String createToken(String subject){

        String token = Jwts.builder().setSubject(subject)
            //设置过期时间
            .setExpiration(new Date(System.currentTimeMillis()+1000*60*60))
            .signWith(SignatureAlgorithm.HS256,secret)
            .compact();
        return token;
    }
    //解析token
    public static String parseToken(String token){
        Claims body = Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
        String subject = body.getSubject();
        return subject;
    }

    public static void main(String[] args) throws InterruptedException {
        String name = "海王";

        String token = createToken(name);
        System.out.println("token:"+token);

        String srcStr = parseToken(token);
        System.out.println("解析出来:"+srcStr);
        System.out.println("==========================");
        //睡眠4秒
        TimeUnit.SECONDS.sleep(4);
        srcStr = parseToken(token);
        System.out.println("解析出来:"+srcStr);

    }
}

方式二(项目使用)

导入依赖

    	<dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.14.0</version>
        </dependency>

代码展示

解析后返回的实体类

@Data
public class TokenResult {

    private String phone;

    private String identity;
}

JWT工具类

package com.whj.internalcommon.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.whj.internalcommon.dto.TokenResult;

import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @Auther: wanghaijun
 * @Date: 2022/12/31 - 12 - 31 - 15:30 
 * @Description: 生成token验证token
 */

public class JwtUtils {

    //盐
    private static final String SIGN="WHJ@QQ123";

    private static final String JWT_KEY_PHONE="phone";

    //1 表示乘客,0表示司机  加入身份标识符来确保身份
    private static final String JWT_KEY_IDENTITY ="identity";

    //生成token
    private static String generatorToken(String passengerPhone,String identity){
        Map<String,String> map =new HashMap<>();
        map.put(JWT_KEY_PHONE,passengerPhone);
        map.put(JWT_KEY_IDENTITY,identity);
        //设置token的过期时间
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DATE,1);
        Date date =calendar.getTime();

        JWTCreator.Builder builder = JWT.create();
        //整合map lambda表达式
        map.forEach(
                (k,v)->{
                        builder.withClaim(k,v);
                });
        //整合过期时间
        builder.withExpiresAt(date);

        //生成token
        String token = builder.sign(Algorithm.HMAC256(SIGN));
        return token;
    }
    //解析token
    public static TokenResult parseToken(String token){
        DecodedJWT verify = JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token);

        String phone = verify.getClaim(JWT_KEY_PHONE).toString();
        String identity = verify.getClaim(JWT_KEY_IDENTITY).toString();

        TokenResult tokenResult = new TokenResult();
        tokenResult.setPhone(phone);
        tokenResult.setIdentity(identity);
        return tokenResult;
    }

    public static void main(String[] args) {

        String token = generatorToken("14760186137","1");
        System.out.println("token = " + token);
        TokenResult tokenResult = parseToken(token);
        System.out.println("解析后token的包含的值 = " + tokenResult.getIdentity()+" "+tokenResult.getPhone());
    }
}

测试

储存token的有效性两种方案:

第一种创建一个新的token,相当于重置了token的时间,但是有可能另一个还没有过期

第二种将创建的token存入redis,每次访问都重新增加token的时间

token续期

token续期:

  1. 每天第一次请求,续期token
  2. 每次接口请求,续期token
  3. access_token,refresh_token中途续期 (时间差一小时,那么一小时不操作就重新登录)
  4. access_token新老共存