Java 基于JWT生成Token 与Token解密

一、token与cookie相比较的优势

1、支持跨域访问,将token置于请求头中,而cookie是不支持跨域访问的;

2、无状态化,服务端无需存储token,只需要验证token信息是否正确即可,而session需要在服务端存储,一般是通过cookie中的sessionID在服务端查找对应的session;

3、无需绑定到一个特殊的身份验证方案(传统的用户名密码登陆),只需要生成的token是符合我们预期设定的即可;

4、更适用于移动端(Android,iOS,小程序等等),像这种原生平台不支持cookie,比如说微信小程序,每一次请求都是一次会话,当然我们可以每次去手动为他添加cookie,详情请查看博主另一篇博客;

5、避免CSRF跨站伪造攻击,还是因为不依赖cookie;

二、基于JWT的token认证实现

JWT:JSON Web Token,其实token就是一段字符串,由三部分组成:Header,Payload,Signature

1.引入依赖

<!--JWT-->
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.8.2</version>
        </dependency>

2.设置秘钥与生存时间

//设置过期时间
private static final long EXPIRE_DATE = 30 * 60 * 100000;
//token秘钥
private static final String TOKEN_SECRET = "SmTicket";

3.加密Token代码

/**
     * 加密Token
     *
     * @Author: RZH
     * @Date: 2020/4/6 9:25
     */
    public static String token(Integer userId) {
        String token;
        try {
            //过期时间
            Date date = new Date(System.currentTimeMillis() + EXPIRE_DATE);
            //秘钥及加密算法
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
            //设置头部信息
            Map<String, Object> header = new HashMap<>();
            header.put("typ", "JWT");
            header.put("alg", "HS256");
            //携带UserId信息,生成签名
            token = JWT.create()
                    .withHeader(header)
                    .withClaim("userId", userId)
                    .withExpiresAt(date)
                    .sign(algorithm);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return token;
    }

4.解密Token

/**
     * JWT解密
     *
     * @Author: RZH
     * @Date: 2020/4/6 9:30
     */
    public static Integer decodeToken(final String token) {
        Integer userId = null;
        try {
            JWTVerifier verifier = JWT.require(Algorithm.HMAC256(TOKEN_SECRET))
                    .build();
            DecodedJWT jwt = verifier.verify(token);
            if (jwt != null) {
                userId = Integer.valueOf(jwt.getClaim("userId").asInt());
            }
        } catch (JWTVerificationException exception) {
            exception.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        }
        return userId;
    }

5.验证Token

/**
     * 验证Token
     *
     * @Author: RZH
     * @Date: 2020/4/5 19:35
     */
    public static boolean verify(String token) {
        try {
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
            JWTVerifier verifier = JWT.require(algorithm).build();
            verifier.verify(token);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

完事over

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Boot 是一个用于构建企业级应用程序的开源框架,它简化了Java开发过程。JWT(JSON Web Token)是一种用于身份验证和授权的开放标准,它基于JSON格式并使用了JWT令牌来安全地传输用户声明信息。Redis 是一个开源的高性能内存数据库,它提供了快速的数据访问和存储功能。微信小程序是一种由微信官方提供的移动应用开发框架,它能够帮助开发者快速搭建小程序应用。 结合这三个技术,可以实现一个安全、高性能的微信小程序后端开发。具体的实现方式可以是使用Spring Boot作为后端框架,通过集成JWT来实现身份认证和授权的功能。当用户登录时,后端可以生成一个JWT令牌并返回给前端,在后续的请求中,前端会将该令牌携带在请求头中。后端可以通过验证JWT令牌来验证用户的身份和权限。 另外,可以使用Redis作为身份认证令牌的存储介质。当用户登录时,将JWT令牌存储到Redis中,并设置过期时间。在后续的请求中,后端可以通过查询Redis来验证JWT令牌的有效性,从而实现快速的身份认证。 总结来说,通过使用Spring Boot、JWT和Redis,可以构建一个安全、高性能的微信小程序后端。Spring Boot提供了强大的开发框架,JWT提供了身份认证和授权的功能,而Redis提供了快速的令牌存储和验证功能。这样的组合将能够为微信小程序用户提供安全、高效的服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

R6N

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

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

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

打赏作者

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

抵扣说明:

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

余额充值