一、添加依赖包

<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.1</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.1</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId> <!-- or jjwt-gson if Gson is preferred -->
<version>0.11.1</version>
<scope>compile</scope> <!-- Not runtime -->
</dependency>

二、示例代码

@RestController
@RequestMapping("/token")
public class TokenController {
/**
* SECRET 是签名密钥,只生成一次即可,生成方法:
* Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
* String secretString = Encoders.BASE64.encode(key.getEncoded()); # 本文使用 BASE64 编码
* */
private static final String SECRET = "cuAihCz53DZRjZwbsGcZJ2Ai6At+T142uphtJMsk7iQ="; private static final String USER_INFO_KEY = "user_info"; private static final long TOKEN_EXPIRED_SECOND = 60; @Autowired
private HttpServletRequest request; @RequestMapping("/get")
public Object get() { Map<String, Object> claims = new HashMap<>();
UserInfo userInfo = new UserInfo();
userInfo.setId("123456");
userInfo.setName("测试abc123");
claims.put(USER_INFO_KEY, userInfo); // 添加自定义参数
JwtBuilder jwtBuilder = Jwts.builder()
.setClaims(claims); long currentTimeMillis = System.currentTimeMillis();
// 设置过期时间
jwtBuilder.setExpiration(new Date(currentTimeMillis + TOKEN_EXPIRED_SECOND * 1000)); SecretKey secretKey = getSecretKey();
jwtBuilder.signWith(secretKey); String jwsStr = jwtBuilder.compact();
return jwsStr;
} @RequestMapping("/verify")
public Object verify() {
String token = request.getHeader("Authorization"); SecretKey secretKey = getSecretKey();
Jws<Claims> jws = Jwts.parserBuilder()
// 解析 JWT 的服务器与创建 JWT 的服务器的时钟不一定完全同步,此设置允许两台服务器最多有 3 分钟的时差
.setAllowedClockSkewSeconds(180L)
.setSigningKey(secretKey)
// 默认情况下 JJWT 只能解析 String, Date, Long, Integer, Short and Byte 类型,如果需要解析其他类型则需要配置 JacksonDeserializer
.deserializeJsonWith(new JacksonDeserializer(Maps.of(USER_INFO_KEY, UserInfo.class).build()))
.build().parseClaimsJws(token); Claims claims = jws.getBody(); UserInfo userInfo = claims.get(USER_INFO_KEY, UserInfo.class); return userInfo;
} /**
* SecretKey 根据 SECRET 的编码方式解码后得到:
* Base64 编码:SecretKey key = Keys.hmacShaKeyFor(Decoders.BASE64.decode(secretString));
* Base64URL 编码:SecretKey key = Keys.hmacShaKeyFor(Decoders.BASE64URL.decode(secretString));
* 未编码:SecretKey key = Keys.hmacShaKeyFor(secretString.getBytes(StandardCharsets.UTF_8));
* */
private SecretKey getSecretKey() {
byte[] encodeKey = Decoders.BASE64.decode(SECRET);
return Keys.hmacShaKeyFor(encodeKey);
}
}

注意 setAllowedClockSkewSeconds 和 deserializeJsonWith 部分的配置

JJWT 使用示例的更多相关文章

  1. Spring Security + JJWT 实现 JWT 认证和授权

    关于 JJWT 的使用,可以参考之前的文章:JJWT 使用示例 一.鉴权过滤器 @Component public class JwtAuthenticationTokenFilter extends ...

  2. Json Web Token JJWT

    什么是JWT? Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站 ...

  3. Java 的 JJWT 实现 JWT

    JJWT是一个提供端到端的JWT创建和验证的Java库 依赖 <dependency> <groupId>io.jsonwebtoken</groupId> < ...

  4. Spring Boot Security JWT 整合实现前后端分离认证示例

    前面两章节我们介绍了 Spring Boot Security 快速入门 和 Spring Boot JWT 快速入门,本章节使用 JWT 和 Spring Boot Security 构件一个前后端 ...

  5. 轻松上手SpringBoot Security + JWT Hello World示例

    前言 在本教程中,我们将开发一个Spring Boot应用程序,该应用程序使用JWT身份验证来保护公开的REST API.在此示例中,我们将使用硬编码的用户和密码进行用户身份验证. 在下一个教程中,我 ...

  6. SpringBoot整合SpringSecurity示例实现前后分离权限注解

    SpringBoot 整合SpringSecurity示例实现前后分离权限注解+JWT登录认证 作者:Sans_ juejin.im/post/5da82f066fb9a04e2a73daec 一.说 ...

  7. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

  8. .NET跨平台之旅:将示例站点升级至 ASP.NET Core 1.1

    微软今天在 Connect(); // 2016 上发布了 .NET Core 1.1 ,ASP.NET Core 1.1 以及 Entity Framework Core 1.1.紧跟这次发布,我们 ...

  9. 通过Jexus 部署 dotnetcore版本MusicStore 示例程序

    ASPNET Music Store application 是一个展示最新的.NET 平台(包括.NET Core/Mono等)上使用MVC 和Entity Framework的示例程序,本文将展示 ...

随机推荐

  1. 【USACO】Strolling Cows

    Strolling Cows 给定有 \(n\) 个点 \(n\) 条边的有向图,每个点的出度都为 \(1\),求图中的最大环. 显然入度为 \(0\) 的点不可能为最大环上的点,所以考虑删点. 然后 ...

  2. 什么是SPI

    一.什么是SPI SPI ,全称为 Service Provider Interface,是一种服务发现机制.它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加 ...

  3. 写文档太麻烦,试试这款 IDEA 插件吧!

    前言 每次开发完新项目或者新接口功能等,第一件事就是提供接口文档.说到接口文档,当然是用 Markdown 了.各种复制粘贴字段,必填非必填,字段备注,请求返回示例等等.简直是浪费时间哇.所以想到了开 ...

  4. 有奖体验 CODING 产品,iPad Pro、HHKB 键盘等超级礼包等你来!

    DevOps 研发效能升级.高效率研发工具已成为软件研发行业的热门话题,也是每个企业研发团队需要不断探索的命题.CODING 一站式软件研发管理工具平台旨在让开发团队低门槛使用 DevOps 工具,帮 ...

  5. Firefox威武 尚译威武!

    有感于鹰文文档看起来麻烦,期待有一款即时翻译的工具,在windows上还可以,但是上班用的是ubuntu,所以就想到要找一个firefox插件,还真找到了,但是不是插件,是一个书签,那就是尚译!尚哥威 ...

  6. TCP中RTT的测量和RTO的计算

    https://blog.csdn.net/zhangskd/article/details/7196707 tcp传输往返时间是指:发送方发送tcp断开时, 到发送方接收到改段立即响应的所耗费的时间 ...

  7. 一:JavaWeb

    1.javaWeb技术体系 2.HTMl 超文本标记语言 (超文本的意思就是除了可以包含文字之外,还可以包含图片链接音乐视频等...) 2.1 HTML网页的组成  (结构:HTML 表现:CSS 行 ...

  8. Spring源码之@Configuration原理

    总结 @Configuration注解的Bean,在BeanDefinition加载注册到IOC容器之后,进行postProcessBeanFactory处理时会进行CGLIB动态代理 将@Prope ...

  9. FLEX弹性布局小结

    1. 弹性盒子中: flex: 0 1 auto表示什么意思 flex默认三个参数是flex-grow, flex-shrink, flex-basis,默认值是0 1 auto. flex-grow ...

  10. HttpClient4.5X使用-集成微服务

    HttpClient4.5X使用-集成微服务       1.什么是HttpClient HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直 ...