SpringBoot项目Token的生成与解析

本文详细介绍了如何在前后端间安全地传递Token,包括后端生成Token的方法及前端解析Token获取用户信息的过程。同时,展示了如何通过Axios请求解析Token,并将关键信息存储在本地缓存中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有的时候我们需要传给后端一个值,只能通过前端的 token获取这个值,然后传给后端

 

后端生成Token 的方法

    private String jwtToken(String userId, String username, String role) {
        return JWT.create()
                .withClaim("userId", userId)
                .withClaim("username", username)
                .withClaim("role", role)
                .withClaim("expireAt", expireTime())
                .sign(Algorithm.HMAC256(jwtSecret));
    }

登录成功之后,我们想在前端获取 token 中的值,如:userId,role等,需要解析该token。

请求解析token的URL:

this.axios.get('/login-user-info')
    .then(res => {
        if (res.data) {
            // 解析成功
            // 获取从token中解析到的值
            this.userInfo.jwtToken = res.data.jwtToken;
            this.userInfo.userId = res.data.userId;
            this.userInfo.username = res.data.username;
            this.userInfo.role = res.data.role;

            //将变量 licence,token,username 添加到缓存中
            localStorage.setItem("locate.licence", res.data["licence"]);
            localStorage.setItem("locate.token", res.data["token"]);
            localStorage.setItem("locate.username", this.userInfo.username);
        }
})

后端解析Token 的接口代码

    @ApiOperation("当前登录用户信息")
    @GetMapping("/login-user-info")
    public ReturnMsg loginUserInfo(HttpServletRequest request) {
        String token = request.getHeader(jwtHeader);
        if (Strings.isNullOrEmpty(token)) {
            return ReturnMsg.defaultSuccessResult();
        }
        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(jwtSecret)).build();
        try {
            DecodedJWT verify = jwtVerifier.verify(token);
            String username = verify.getClaim("username").asString();
            String role = verify.getClaim("role").asString();
            Long expireAt = verify.getClaim("expireAt").asLong();
            //token参数不对
            if (!Strings.isNullOrEmpty(username)
                    && !Strings.isNullOrEmpty(role) && expireAt != null
                    && expireAt > System.currentTimeMillis()) {
                Optional<BuildingManagerBO> bm = buildingManagerService.findByUsername(username);
                LoginUserInfoVO loginUserInfoVO = bm.map(bo -> new LoginUserInfoVO(token, role, bo.getUserId(), bo.getUsername(), bo.getLicence(),
                        bo.getBuildCount())).orElse(null);
                return ReturnMsg.wrapSuccessfulResult(loginUserInfoVO);
            }

        } catch (JWTVerificationException ignore) {
            //验证失败
        }

        return ReturnMsg.defaultSuccessResult();
    }

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值