JAVA之JWT简单应用测试

1 引入pom文件

<dependency>
	<groupId>com.auth0</groupId>
	<artifactId>java-jwt</artifactId>
	<version>3.8.3</version>
</dependency>
<dependency>
	<groupId>io.jsonwebtoken</groupId>
	<artifactId>jjwt</artifactId>
	<version>0.9.0</version>
</dependency>

在控制器同级包下新建JWT.java文件

不是同一包下应该也可以,只是我学的时候是放在同包下了,方便引入

//下面是需要的包,当时刚开始学的时候很多都是一个个试出来的,太难了
import cn.jeefast.modules.platform.entity.Nuser;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

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

public class JWT {
    //https://www.cnblogs.com/jimisun/p/9482439.html
    //创建token
    public static String createJWT(long ttlMillis,Nuser nuser){//Nuser是数据库中的表明(也就是实体)
        //指定签名的时候使用的算法
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        //生成jwt的时间
        long nowMills = System.currentTimeMillis();
        Date now = new Date(nowMills);
        //创建payload的私有声明
        Map<String, Object> claims = new HashMap<>();

        claims.put("uid",nuser.getUid());//获取id
        claims.put("name",nuser.getUname());//获取姓名
        claims.put("pwd",nuser.getPwd());//获取密码,但实际操作中为了安全一般不会保存密码,可以保存一个唯一的id
        //下面的注释是原文的注释,因为不会封装,就直接用密码代替了
        //生成签名的时候使用的秘钥secret,这个方法本地封装了的,一般可以从本地配置文件中读取,切记这个秘钥不能外露哦。
        // 它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。
        String key = nuser.getPwd();
        //生成签发人
        String subject = nuser.getUname();

        //下面就是在为payload添加各种标准声明和私有声明了
        JwtBuilder builder = Jwts.builder()
                //如果有私有声明,一定要先设置这个自己创建的私有的声明,
                // 这个是给builder的claim赋值,一旦写在标准的声明赋值之后,就是覆盖了那些标准的声明的
                .setClaims(claims)
                .setId(UUID.randomUUID().toString())//设置一个不重复的值,主要用来作为一次性token,从而回避重放攻击
                .setIssuedAt(now)
                .setSubject(subject)
                .signWith(signatureAlgorithm,key);


        if(ttlMillis >= 0){
            long expMillis = nowMills + ttlMillis;
             Date exp = new Date(expMillis);

             //设置过期时间
            builder.setExpiration(exp);
        }
        return builder.compact();

    }


    /**
     *
     *  token解密
     *
     */
    public static Claims parseJwt(String token,Nuser nuser){
        //签名密钥,和生成的签名密钥一模一样
        String key = nuser.getPwd();

        Claims claims = Jwts.parser()
                .setSigningKey(key)
                .parseClaimsJws(token).getBody();
        return claims;
    }


    /**
     *  校验token
     */

    public static Boolean isVerify(String token,Nuser nuser) {
        String key = nuser.getPwd();

        Claims claims = Jwts.parser()
                .setSigningKey(key)//设置签名的密钥
                .parseClaimsJws(token).getBody();//设置需要解析的jwt

        if(claims.get("pwd").equals((nuser.getPwd()))){
            return true;
        }
        return false;
    }

}

controller层的实际应用(只有加密,没有解密)

/**
	 * jwt验证,生成token
	 */
	@RequestMapping(value = "yzlogin")
	public Object yzlogin (){
		JSONObject jsonObject = new JSONObject();
		//用户的密码不可以太简单,过于简单会报错,报错内容如下
		//secret key byte array cannot be null or empty.
		Nuser nuser = nuserService.byName("admin");

		if(nuser == null){
			jsonObject.put("message","登陆失败,用户名错误");
			return jsonObject;
		}else {
			String token = JWT.createJWT(6000000,nuser);//设置有效时间
			jsonObject.put("token",token);//临时生成的token
			jsonObject.put("nuser",nuser);//报错根据用户名查询到的内容
			return jsonObject;
		}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值