JWT使用教程

在这里插入图片描述

JWT是json web token的简写,意为json格式的token。(官网

使用场景

常用于web项目的token校验,用户校验,权限校验等,也可以用于信息的加密传输。
由于http的无状态的,所以我们通常会使用session cookie来保存用户的状态,随着微服务的兴起,session cookie无法在分布式环境下达到保存用户状态的目的,所以我们需要寻找另外的途径来保存用户的状态

一、保存于数据库
我们可以将用户的uuid信息保存于数据库中,当用户登录的时候,我们通过校验用户登录信息的正确性来生成一个uuid,然后将这个uuid保存于数据库中,然后客户端与服务端就通过这个uuid来判断用户
二、使用JWT
使用统一的一个token生成策略,对用户的信息加密生成可加密的token,然后分布式环境下每个节点都使用同一种解密方式进行解密,就可以得到用户的信息

jwt是json结构,分为3段(head、Payload、Signature)

head

head的作用主要是表明Signature使用的加密算法和token的类型
常用写法{ “alg”: “HS256”, “typ”: “JWT”}

Payload

用于存放我们需要校验的信息,譬如(username:admin,password:admin)

Signature

Signature是签名,使用head的加密算法对payload的内容进行加密,目的是防止token的信息被篡改

jwt简单的使用教程

以java为例
首先引入jar,版本可以改,按具体的使用环境来定

<dependency>
			<groupId>io.jsonwebtoken</groupId>
			<artifactId>jjwt</artifactId>
			<version>0.9.0</version>
		</dependency>
	private final static String SCRENT = "abc123";

    private final static long TOKEN_EXPIRATION = 12*3600*1000L;

    private static String userName = "test";

    private static String password = "test123456";
    
	/**
     * 生成token
     * @param username 用户名
     * @param password 密码
     * @param secret 密钥
     * @return token
     */
    private static String generateToken(String username,String password, String secret){
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        SecretKey secretKey = generalKey();
        Date date = new Date(System.currentTimeMillis()+TOKEN_EXPIRATION);
        JwtBuilder jwtBuilder = Jwts.builder()
                .setHeaderParam("typ","JWT").setHeaderParam("alg","HS256")
                .claim("username",username)
                .claim("password",password)
                .signWith(signatureAlgorithm,secretKey)
                .setExpiration(date);
        return jwtBuilder.compact();
    }
    
    private static SecretKey generalKey(){
        byte[] encodeKey = Base64.getDecoder().decode(SCRENT);
        SecretKey key = new SecretKeySpec(encodeKey,0,encodeKey.length,"AES");
        return key;
    }

    /**
     * 解密token 返回payload的信息主体对象claims
     * @param jwtToken token
     * @return Claims
     */
    private static Claims validateJWT(String jwtToken){
        Claims claims = Jwts.parser()
                .setSigningKey(generalKey())
                .parseClaimsJws(jwtToken).getBody();
        return claims;
    }

    /**
     * 从token中获取key的值
     * @param jwtToken token
     * @param key key
     * @return value
     */
    public static Object get(String jwtToken,String key){
        Claims claims = validateJWT(jwtToken);
        String value = claims.get(key,String.class);
        return value;
    }

下面是代码运行的效果
在这里插入图片描述

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啊狸的Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值