SpringBoot与JWT整合,史上最全最好用的基础案例 - Go语言中文社区

SpringBoot与JWT整合,史上最全最好用的基础案例


前言

这里是案例源码 springboot_jwt,喜欢的同学可以给一个star呢!哈哈哈!
首先你得引入Maven依赖(第一步)

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

然后你需要创建一个JWT的工具类(第二步)

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.io.UnsupportedEncodingException;
import java.util.Date;

/**
 * @Auther: xipiker
 * @Date: 2019-8-6
 * @Description: JWT
 */
public class JwtUtils {

    // 过期时间一个星期
    private static final long EXPIRE_TIME = 7 * 24 * 60 * 60 * 1000;
    // 签名秘钥
    private static final String SECRET = "xipiker";

    /**
     * 校验token是否正确
     *
     * @param token    密钥
     * @param userCode 用户名
     * @return 是否正确
     */
    public static boolean verify(String token, String userCode) {
        try {
            Algorithm algorithm = Algorithm.HMAC256(SECRET);
            JWTVerifier verifier = JWT.require(algorithm)
                    .withClaim("userCode", userCode)
                    .build();
            verifier.verify(token);
            return true;
        } catch (Exception exception) {
            return false;
        }
    }

    /**
     * 获得token中的信息无需secret解密也能获得
     *
     * @return token中包含的用户名
     */
    public static String getUserCode(String token) {
        try {
            DecodedJWT jwt = JWT.decode(token);
            return jwt.getClaim("userCode").asString();
        } catch (JWTDecodeException e) {
            return null;
        }
    }

    /**
     * 生成签名,指定时间后过期,一经生成不可修改,令牌在指定时间内一直有效
     * @param userCode 用户名
     * @return 加密的token
     */
    public static String createJWT(String userCode) {
        try {
            Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
            Algorithm algorithm = Algorithm.HMAC256(SECRET);
            // 附带username信息
            return JWT.create()
                    .withClaim("userCode", userCode)
                    .withExpiresAt(date)
                    .sign(algorithm);
        } catch (UnsupportedEncodingException e) {
            return null;
        }
    }

}

最后你需要编写Controller层来测试你得工具类是否有问题(第三步)

/**
 * @author: xipiker
 * @Date: 2019-8-6
 * @Description: JwtController
 */

@Controller
public class JwtController {

    /**
     * 生成用户对应的token
     * @param username
     * @return token
     */
    @ResponseBody
    @RequestMapping(value="login", method = RequestMethod.POST)
    public String login(String username) {
         String JWT = JwtUtils.createJWT(username);
         return JWT;
    }

    /**
     * 验证token是否有效
     * @param token
     * @param username
     * @return String
     */
    @ResponseBody
    @RequestMapping(value="verifyToken", method = RequestMethod.POST)
    public String verifyToken(String token, String username) {
        Boolean flag = JwtUtils.verify(token, username);
        if(flag){
            return "token success";
        }else {
            return "token error";
        }
    }

    /**
     * 无需SECRET,直接获取用户信息
     * @param token
     * @return userCode
     */
    @ResponseBody
    @RequestMapping(value="findUserCode", method = RequestMethod.POST)
    public String findUserCode(String token) {
        return JwtUtils.getUserCode(token);
    }
}

最后测试环节,测试工具使用PostMan,不废话,看测试图。
这里输入username:xipiker,返回对应token
在这里插入图片描述
接下来验证token是否正确
输入刚才产生的token,和对应的username,会返回"token success"否则返回"token error"。
在这里插入图片描述
最后一步“无需SECRET,直接获取用户信息”验证,主要是写业务逻辑用的,一般不需要暴露接口,这里为了方便测试暴露了一下。
在这里插入图片描述
后续会学习整理SpringBoot+Shiro+Jwt(RBAC),希望能通过努力可以做得完善。
谢谢大家的支持,可以给点鼓励给个赞呢!哈哈哈!

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_25040155/article/details/98540776
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-04-19 13:29:49
  • 阅读 ( 781 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢