SSM学习记录6:编码token以登录(JJWT框架)

编码token以登录(JJWT框架)

导入依赖↓

        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>
        
        <!-- java高版本不自带javax.xml.bind等依赖,需导入 -->
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.1</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>4.0.2</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>4.0.2</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>

导入依赖后再如前面学习的那样导入项目库↓
导入所有依赖项目库,不止图中这一个,选择全部导入就好
在这里插入图片描述
创建Jjwt类↓

import io.jsonwebtoken.*;

import java.util.*;

public class Jjwt {
    private static String iss = "virtualtravel";//保存iss值
    private static int expiration = 60*60;      //保存exp,单位秒
    private Claims claims = null;               //保存解析后得到的jwt值
    private String secret = "自定义密匙";//Jjwt加密所用密匙

    /**
     * 创建jwt
     * @return
     *      返回生成的jwt token
     */
    public String generateJwtToken(){

        // 头部 map,Jwt的头部承载,第一部分
        // 可不设置 默认格式是{"alg":"HS256"}
        Map<String, Object> map = new HashMap<>();
        map.put("alg", "HS256");
        map.put("typ", "JWT");


        //载荷 claims,Jwt的载荷,第二部分
        Map<String,Object> claims = new HashMap<String,Object>();
        /*标准中注册的声明 (建议但不强制使用)
        一旦写标准声明赋值之后,就会覆盖了那些已存在的标准声明*/
        claims.put("iss", iss);
        claims.put("sub", "sub");
        /*claims.put("exp", new Date(System.currentTimeMillis() + 1)); //直接设置格式会错误,通过setExpiration设置
        claims.put("iat", new Date());*/
        claims.put("jti", UUID.randomUUID().toString());

            /*	默认7个字段
                iss: jwt签发者
                sub: jwt所面向的用户
                aud: 接收jwt的一方
                exp: jwt的过期时间,这个过期时间必须要大于签发时间
                nbf: 定义在什么时间之前,该jwt都是不可用的.
                iat: jwt的签发时间
                jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击
            */

        //私有声明  自定义数据,根据业务需要添加
        claims.put("uAccount","uAccount");

        //下面就是在为payload添加各种标准声明和私有声明了
        return Jwts.builder() // 这里其实就是new一个JwtBuilder,设置jwt的body
                .setHeader(map)         // 头部信息
                .setClaims(claims)      // 载荷信息
                //.setSubject(uAccount)    //设置sub:代表这个jwt所面向的用户
                .setExpiration(new Date(System.currentTimeMillis() + expiration * 1000)) // 设置exp:jwt过期时间
                //.setId(UUID.randomUUID().toString()) // 设置jti(JWT ID):是JWT的唯一标识,从而回避重放攻击。
                .setIssuedAt(new Date())       // 设置iat: jwt的签发时间    .                    */
                .signWith(SignatureAlgorithm.HS256, secret.getBytes())//设置签名:通过签名算法和秘钥生成签名
                .compact(); // 开始压缩为xxxxx.yyyyy.zzzzz 格式的jwt token
    }

    //解析JwtToken
    public Claims getClaimsFromJwt(String token) {
        try {
            claims = Jwts.parser().setSigningKey(propertiesService.getSecret().getBytes()).parseClaimsJws(token).getBody();
            claims.put("token", token);
            /*SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            System.out.println("签发时间:"+sdf.format(claims.getIssuedAt()));
            System.out.println("过期时间:"+sdf.format(claims.getExpiration()));
            System.out.println("当前时间:"+sdf.format(new Date()) );*/
        }catch (ExpiredJwtException e) {//解析时,若过期则异常
            e.printStackTrace();
        }catch (UnsupportedJwtException e) {//解析时若不支持Jwt则异常
            e.printStackTrace();
        }catch (Exception e) {
            e.printStackTrace();
        }
        return claims;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

倚肆

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

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

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

打赏作者

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

抵扣说明:

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

余额充值