目录

1、为什么使用JWT?

2、JWT 的 格式

3、使用 JWT 就绝对安全 吗?

4、JWT 的 鉴权 流程

5、JWT 入门案例

5.1 引入依赖

5.2 生成Token

5.3 解析Token

5.4 工具类


JSON Web token简称JWT, 是用于对应用程序上的用户进行身份验证的标记。

也就是说, 使用 JWTS 的应用程序不再需要保存有关其用户的 cookie 或其他session数据。

此特性便于可伸缩性, 同时保证应用程序的安全

1、为什么使用JWT?

在不使用JWT的情况下,我们一般选择的是cookie和session来进行服务鉴权(判断是否登录,是否具有某种权限),但是这是针对于只有一个客户端的情况下,现在客户端从pc端增长到了app端,现在就是多端访问了。

在多端访问的情况下,可能就会存在一个问题,获取不到session和cookie。

同时在我们的服务端,通过集群的形式来进行搭建 ,也就是说服务端有多个共同提供服务,如果第一个服务器里记录session,那第二个服务如何获取呢?这些都是现实存在的问题, 那我们该如何解决?

这就引出了在微服务架构中如何进行服务鉴权的方案,这个方案就是 JWT.

2、JWT 的 格式

JWT就是一个字符串,经过加密处理与校验处理的字符串,形式为:A.B.C 三段,每一段中间通过 . 来隔开

  • A由JWT头部信息header加密得到
  • B由JWT用到的身份验证信息json数据加密得到
  • C由A和B加密得到,是校验部分

如果你还感觉不到清晰,这里有它的官方网站 : JSON Web Tokens - jwt.io

进入官方网站往下拉。

3、使用 JWT 就绝对安全 吗?

答案:

不安全

虽然我们看到JWT 经过多层加密。但是我们随便在网上找一个jwt 的 反解码工具,将JWT 处理后的字符串放进去。

大家可以发现,数据原封不动的还原了,所以在这里提醒大家对于敏感数据,比如用户的密码,账户的金额登录信息不应该存到JWT 字符串中,因为可以被解密。

4、JWT 的 鉴权 流程

JWT 如何判断是否登录呢?如何获取用户的用户信息呢?

这些内容就是JWT 的鉴权功能。

接下来我们来了解一下JWT 的 是如何鉴权的。

首先是登陆,客户端登陆的时候将用户的信息,用户名+密码发送到服务端。

服务端判断完之后,通过用户信息生成 JWT Token。

接着将生成的Token 响应给客户端,客户端再记录到本地。

这个时候客户端有一个Toke 字符串里面有了用户信息,那么接下来客户端去访问其他接口,将Token,写入到请求头当中,发送到服务端,服务端就可以通过token来获取信息。

这里还要对Token 进行校验,看他是否是我们生成的,是否被进行了数据篡改。

如果全部没有问题,完成业务逻辑,最终响应给客户端。

当然啦,如果Token 有问题,就要响应给客户端,您未登录或者鉴权为通过。

这就是JWT 的鉴权流程了。

5、JWT 入门案例

接下来就带大家如何在JAVA 中使用JWT。

5.1 引入依赖

<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.2</version>
</dependency>

5.2 生成Token

public void testCreateToken() {//生成token//1、准备数据Map map = new HashMap();map.put("id",1);map.put("mobile","110");//2、使用JWT的工具类生成tokenlong now = System.currentTimeMillis();String token = Jwts.builder().signWith(SignatureAlgorithm.HS512, "yiqie") //指定加密算法.setClaims(map) //写入数据.setExpiration(new Date(now + 30000)) //失效时间.compact();System.out.println(token);
}

执行效果:

5.3 解析Token

public void testParseToken() {String token = "eyJhbGciOiJIUzUxMiJ9.eyJtb2JpbGUiOiIxMTAiLCJpZCI6MSwiZXhwIjoxNjY1MTI1MTkyfQ.0VU2gdRpJ1eEoDFev740VkVKrdT_bYecgB3qcw-ZtrhZstFbAFwhAhESXaHb-11AxG3AjZKEEWVoaBlkzFd6ug";try {Claims claims = Jwts.parser().setSigningKey("yiqie").parseClaimsJws(token).getBody();Object id = claims.get("id");Object mobile = claims.get("mobile");System.out.println(id + "--" + mobile);}catch (ExpiredJwtException e) {System.out.println("token已过期");}catch (SignatureException e) {System.out.println("token不合法");}
}

5.4 工具类

对于JWT 的生成和解析,我们可以整合成一个工具类,便于我们自己后续使用。

public class JwtUtils {// TOKEN的有效期1小时(S)private static final int TOKEN_TIME_OUT = 1 * 3600;// 加密KEYprivate static final String TOKEN_SECRET = "yiqie";// 生成Tokenpublic static String getToken(Map params){long currentTime = System.currentTimeMillis();return Jwts.builder().signWith(SignatureAlgorithm.HS512, TOKEN_SECRET) //加密方式.setExpiration(new Date(currentTime + TOKEN_TIME_OUT * 1000)) //过期时间戳.addClaims(params).compact();}/*** 获取Token中的claims信息*/public static Claims getClaims(String token) {return Jwts.parser().setSigningKey(TOKEN_SECRET).parseClaimsJws(token).getBody();}/*** 是否有效 true-有效,false-失效*/public static boolean verifyToken(String token) {if(StringUtils.isEmpty(token)) {return false;}try {Claims claims = Jwts.parser().setSigningKey("yiqie").parseClaimsJws(token).getBody();}catch (Exception e) {return false;}return true;}
}

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:腾讯云自媒体分享计划 - 腾讯云开发者社区-腾讯云

什么是JWT及在JAVA中如何使用?相关推荐

  1. JWT|概述|JWT结构|JWT在java中的使用|JWT工具类的封装|JWT在springboot中的使用|JWT与拦截器的配合

    JWT ! 前记: 官网:https://jwt.io/ jwt有人说是用计算力换空间(相对于session) 小程序后台要求全部用springboot实现..登录状态的管理:本来想用自己随便生成UU ...

  2. java中override快捷键_【基础回溯1】面试又被 Java 基础难住了?推荐你看看这篇文章。...

    本文已经收录自 https://github.com/Snailclimb/JavaGuide  (59k+ Star):[Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识. ...

  3. Java中的AES加密和解密(CBC模式)

    通过有线方式传输诸如纯文本密码之类的机密数据总是容易受到安全性的影响,始终建议对此类信息进行加密并使用SSL传输这些机密数据.Java为此提供了多种加密算法.在本文中,我们将讨论Java中具有CBC模 ...

  4. JWT Token的Java实现

    官网地址:https://jwt.io/ jwt github:https://github.com/jwtk/jjwt Demo源码地址: https://github.com/wangcantia ...

  5. java中实现具有传递性吗_Java中volatile关键字详解,jvm内存模型,原子性、可见性、有序性...

    一.Java内存模型 想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的. Java内存模型规定了所有的变量都存储在主内存中.每条线程中还有自己的工作内存,线程的工作 ...

  6. java中调用python

    在Java中调用Python </h1><div class="clear"></div><div class="postBod ...

  7. java中hashcode_浅谈Java中的Hash值

    1.Hash值有什么用? HashMap.HashTable.HashSet,所以涉及到使用Hash值进行优化存储的地方,都会用到HashCode.HashCode是Key,这种计算为提高计算的性能. ...

  8. JAVA中获取当前系统时间

    JAVA中获取当前系统时间 转自:http://www.cnblogs.com/Matrix54/archive/2012/05/01/2478158.html 一. 获取当前系统时间和日期并格式化输 ...

  9. Java中的对象和包

    什么是对象 对象就是实际生活中的事物,可以说一切事物都是对象. 对象的三个特点 1  对象的行为:这个对象能做什么, 例如包子是用来吃的 2  对象的状态:对象保持的一种状态,例如这个包子是热的还是凉 ...

最新文章

  1. 程序员应该吃透的集合List
  2. 程序员级别鉴定书(.NET面试问答集锦)
  3. 使用 ThreadLocal 一次解决老大难问题
  4. mfc 隐藏主窗口 visible_第80讲:工作表数据与UserForm窗口的交互,记录的编辑和保存...
  5. php socket 效率,php socket 模型及效率问题
  6. 大杂烩 -- 四种生成和解析XML文档的方法详解
  7. 这个库厉害了,自动补全 Python 代码,节省 50% 敲码时间
  8. akka mysql_Spray + Akka高性能异步IO并发
  9. python练习题4
  10. usb转rs485测试软件,usb转rs485驱动程序
  11. java获取基金实时数据_JAVA爬取天天基金网数据
  12. win10安装无法创建新分区也找不到现有分区问题
  13. [转载]铁路订票系统的简单设计
  14. 一个人如何开发一款app?(2020修改版)
  15. 爬取北邮人论坛美食帖子
  16. 关于ant design pro中2个下拉列表,下列列表a的数据需要依据列表b选择的值来进行变化,无法及时获取
  17. Word文档引用EndNote中文献的方法
  18. 新的、老的、无所不在的毒素
  19. 俞敏洪在同济大学的惊天动地的演讲
  20. 剑指Offer——如何做好自我介绍

热门文章

  1. Unity Particle System 粒子系统简单介绍
  2. 苹果5s现在还能用吗_苹果抛弃英特尔,现在又抛弃微软,你的黑苹果电脑到底能用多久?...
  3. 近期一个称重设备微信端开发前端知识点,及使用插件遇到的常见问题
  4. 传统蓝牙服务问询协议SDP概念
  5. dw如何制作图片自动切换效果_如何在Dreamweaver中制作图片切换的效果?
  6. Linux磁盘I/O(二):使用vm.dirty_ratio和vm.dirty_background_ratio优化磁盘性能
  7. 如何通过手机话费余额充值Q币?
  8. 正整数n分解成若干个个不同的自然数之和,使得乘积最大
  9. 立可得_第2章_新零售_重构人、货、场
  10. Win32公共控件 - 状态栏和工具栏