springboot整合token的实现代码

 更新时间:2019年11月05日 09:49:13   作者:邓奔成  
这篇文章主要介绍了springboot整合token的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

写在前面

  1. 在前后端交互过程中,为了保证信息安全,我们往往需要加点用户验证。本文介绍了用springboot简单整合token。
  2. springboot版本2.2.0。另外主要用到了jjwt,redis。阅读本文,你大概需要花费7-10分钟时间

整合token

1. 导入相关依赖

pom.xml文件中

<!--    jwt 加密解密工具类-->
    <dependency>
      <groupId>io.jsonwebtoken</groupId>
      <artifactId>jjwt</artifactId>
      <version>0.9.0</version>
    </dependency>

2.TokenUtil.java实现生成/解析token

package com.dbc.usermanager.util;

import com.dbc.usermanager.service.RedisService;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Autowired;

import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.security.Key;
import java.util.Date;

public class TokenUtil {
  /**
   * 签名秘钥,可以换成 秘钥 注入
   */
  public static final String SECRET = "DaTiBao";//注意:本参数需要长一点,不然后面剪切的时候很可能长度为0,就会报错
  /**
   * 签发地
   */
  public static final String issuer = "dtb.com";
  /**
   * 过期时间
   */
  public static final long ttlMillis = 3600*1000*60;

  /**
   * 生成token
   *
   * @param id 一般传入userName
   * @return
   */
  public static String createJwtToken(String id,String subject) {
    return createJwtToken(id, issuer, subject, ttlMillis);
  }
  public static String createJwtToken(String id) {
    return createJwtToken(id, issuer, "", ttlMillis);
  }

  /**
   * 生成Token
   *
   * @param id    编号
   * @param issuer  该JWT的签发者,是否使用是可选的
   * @param subject  该JWT所面向的用户,是否使用是可选的;
   * @param ttlMillis 签发时间 (有效时间,过期会报错)
   * @return token String
   */
  public static String createJwtToken(String id, String issuer, String subject, long ttlMillis) {

    // 签名算法 ,将对token进行签名
    SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

    // 生成签发时间
    long nowMillis = System.currentTimeMillis();
    Date now = new Date(nowMillis);

    // 通过秘钥签名JWT
    byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(SECRET);
    String str=signatureAlgorithm.getJcaName();
    Key signingKey = new SecretKeySpec(apiKeySecretBytes, str);

    // 让我们设置JWT声明
    JwtBuilder builder = Jwts.builder().setId(id)
        .setIssuedAt(now)
        .setSubject(subject)
        .setIssuer(issuer)
        .signWith(signatureAlgorithm, signingKey);

    // if it has been specified, let's add the expiration
    if (ttlMillis >= 0) {
      //过期时间
      long expMillis = nowMillis + ttlMillis;
      Date exp = new Date(expMillis);
      builder.setExpiration(exp);
    }

    // 构建JWT并将其序列化为一个紧凑的url安全字符串
    return builder.compact();

  }

  /**
   * Token解析方法
   * @param jwt Token
   * @return
   */
  public static Claims parseJWT(String jwt) {
    // 如果这行代码不是签名的JWS(如预期),那么它将抛出异常
    Claims claims = Jwts.parser()
        .setSigningKey(DatatypeConverter.parseBase64Binary(SECRET))
        .parseClaimsJws(jwt).getBody();
    return claims;
  }


  public static void main(String[] args) {

    String token = TokenUtil.createJwtToken("2","ltz");

    System.out.println(TokenUtil.createJwtToken("2","ltz"));

    Claims claims = TokenUtil.parseJWT(token);

    System.out.println(claims);

  }
}

3.新增登录验证的注解@LoginRequired

package com.dbc.usermanager.util;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

//加入此注解,就需要token
@Target({ElementType.METHOD, ElementType.TYPE})// 表明此注解可用在方法名上
@Retention(RetentionPolicy.RUNTIME)// 运行时有效
public @interface LoginRequired {
  boolean required() default true;
}

4.测试

  @PostMapping(value = "test")
  @ApiOperation(value="生成token")
  public ResultJson test(@RequestBody JSONObject requestJson){
    String token= TokenUtil.createJwtToken("1","dtb");
    redisService.set(token,"1");
    return new ResultJson(0,"测试成功",null);
  }
  @GetMapping(value = "getToken")
  @LoginRequired
  @ApiOperation("")
  public ResultJson getToken(String token){
    if(redisService.exists(token)){
      System.out.println(redisService.get(token));
    }
    return new ResultJson(0,"测试成功",null);
  }

最后

  • 实体类User.java等相关文件就不贴出来了,大家可以用自己写好的实体类去编写。
  • 很多步骤与思想都在代码中体现,代码中也加了很多注释,你可以根据自己的需求进行增删查改。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java代码是如何被CPU狂飙起来的

    Java代码是如何被CPU狂飙起来的

    无论是刚刚入门Java的新手还是已经工作了的老司机,恐怕都不容易把Java代码如何一步步被CPU执行起来这个问题完全讲清楚。本文就带你详细了解Java代码到底是怎么运行起来的。感兴趣的同学可以参考阅读
    2023-03-03
  • 在Java中使用基本的正则表达式

    在Java中使用基本的正则表达式

    这篇文章主要介绍了在Java中使用基本的正则表达式,本文通过简要的案例,说明了很多场景下的正则表达式的用法,列出了正则表达式匹配规则的表格,需要的朋友可以参考下
    2021-07-07
  • Java验证码功能的实现方法

    Java验证码功能的实现方法

    这篇文章主要为大家详细介绍了Java验证码功能的实现方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • spring框架集成flyway项目的详细过程

    spring框架集成flyway项目的详细过程

    今天通过本文给大家分享spring框架集成flyway项目的详细过程,由于大多数都是springboot集成flyway,很少见到spring框架的项目,今天就抽空给大家介绍下spring框架集成flyway项目的方法,一起看看吧
    2021-07-07
  • SpringMVC中请求参数的获取方式

    SpringMVC中请求参数的获取方式

    这篇文章主要为大家介绍了SpringMVC中请求参数的获取方式,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • MyBatis多对多映射初识教程

    MyBatis多对多映射初识教程

    这篇文章重点给大家介绍mybatis多对多映射,多对多映射的例子也很常见,本文通过代码实例相结合的方式给大家介绍mybatis多对多映射,需要的朋友参考下吧
    2016-08-08
  • SpringDataJPA实体类关系映射配置方式

    SpringDataJPA实体类关系映射配置方式

    这篇文章主要介绍了SpringDataJPA实体类关系映射配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 详解使用Spring Security OAuth 实现OAuth 2.0 授权

    详解使用Spring Security OAuth 实现OAuth 2.0 授权

    本篇文章主要介绍了详解使用Spring Security OAuth 实现OAuth 2.0 授权,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Servlet注解之@WebInitParam多个InitParam的使用

    Servlet注解之@WebInitParam多个InitParam的使用

    这篇文章主要介绍了Servlet注解之@WebInitParam多个InitParam的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • springboot启动的注意事项之不同包下有同样名字的class类问题

    springboot启动的注意事项之不同包下有同样名字的class类问题

    这篇文章主要介绍了springboot启动的注意事项之不同包下有同样名字的class类问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06

最新评论