SpringBoot项目Token的生成与解析

有的时候我们需要传给后端一个值,只能通过前端的 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();
    }

 

好的,关于生成解析token的代码,你需要使用Spring Security这个框架来辅助你实现。 首先,在你的pom.xml中添加Spring Security的依赖: ``` <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-jwt</artifactId> <version>1.1.1.RELEASE</version> </dependency> ``` 然后,创建一个JwtUtils工具类,实现token生成解析功能。示例代码如下: ``` import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.impl.DefaultClaims; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Component; import java.util.Date; import java.util.HashMap; import java.util.Map; @Component public class JwtUtils { private static final String CLAIM_KEY_USERNAME = "sub"; private static final String CLAIM_KEY_CREATED = "created"; private static final String TOKEN_SECRET = "your_token_secret_here"; private static final long TOKEN_EXPIRATION = 3600; public String generateToken(UserDetails userDetails) { Map<String, Object> claims = new HashMap<>(); claims.put(CLAIM_KEY_USERNAME, userDetails.getUsername()); claims.put(CLAIM_KEY_CREATED, new Date()); return Jwts.builder().setClaims(claims).setExpiration(generateExpirationDate()) .signWith(SignatureAlgorithm.HS512, TOKEN_SECRET).compact(); } private Date generateExpirationDate() { return new Date(System.currentTimeMillis() + TOKEN_EXPIRATION * 1000); } public String getUsernameFromToken(String token) { Claims claims = getClaimsFromToken(token); return claims.getSubject(); } public boolean validateToken(String token, UserDetails userDetails) { String username = getUsernameFromToken(token); return username.equals(userDetails.getUsername()) && !isTokenExpired(token); } private Claims getClaimsFromToken(String token) { Claims claims; try { claims = Jwts.parser().setSigningKey(TOKEN_SECRET).parseClaimsJws(token).getBody(); } catch (Exception e) { claims = new DefaultClaims(); } return claims; } private boolean isTokenExpired(String token) { final Date expiration = getExpirationDateFromToken(token); return expiration.before(new Date()); } private Date getExpirationDateFromToken(String token) { final Claims claims = getClaimsFromToken(token); return claims.getExpiration(); } } ``` 这个示例代码中,我们使用了HS512签名算法,并且设置了token过期时间为3600秒。 接下来,在你的登录方法中,调用JwtUtils工具类的generateToken方法来生成token,将token返回给客户端使用。 在你的后续请求中,将token添加到Authorization头中,然后在你的请求过滤器中,使用JwtUtils工具类的getUsernameFromToken方法来获取用户名,从而完成用户身份的验证。 以上便是生成解析token的简单示例,希望能够帮到你。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值