JWT --- 入门学习

article/2025/9/14 17:45:35

不知道为什么,不用springboot test测试或者启动类启动,会报这个错误,找不到类路径

1.常见的认证机制 

basic auth : 每次请求都会携带用户的username,password,易被黑客拦截。

Cookie auth : 我们请求服务器,创建一个session对象,客户端创建cookie对象。客户端每次访问,携带cookie对象。

(在当今,前后端分离中,通过前端服务器代理或反向代理,进行请求转发,从将cookie储存在客户端。)

oauth2 auth : 可以第三方登录,但是比较麻烦下去授权服务器获取授权码,再拿到token,再去访问资源服务。

token auth : 一般用户注册登录之后,生成token对象分别存储在数据库,以及客户端的localStore 或者 Cookie中。

 2.JWT 

jwt 全称 JSON Web Token ,简单来讲是一个拥有json格式的Token。

简单的理解:一种token的实现方式。

2.1 jwt组成

  •  Header:有令牌的类型和所使用的签名算法,如HMAC、SHA256、RSA;使用Base64编码组成;(Base64是一种编码,不是一种加密过程,可以被翻译成原来的样子)
{"alg" : "HS256","type" : "JWT"
}
  • Payload :有效负载,包含声明;声明是有关实体(通常是用户)和其他数据的声明,不放用户敏感的信息,如密码。同样使用Base64编码
{"sub" : "123","name" : "John Do","admin" : true
}
  • Signature :前面两部分都使用Base64进行编码,前端可以解开知道里面的信息。Signature需要使用编码后的header和payload
  • 加上我们提供的一个密钥,使用header中指定的签名算法(HS256)进行签名。签名的作用是保证JWT没有被篡改过
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret);

2.2 jwt的优点和验证流程

2.2.1 优点

1.jwt对比与传统json和session不需要在服务端存储

2.负载中包含了用户所需要的信息,避免多次查询数据库

2.2.2 验证流程

  • 前端通过Web表单将自己的用户名和密码发送到后端的接口。该过程一般是HTTP的POST请求。建议的方式是通过SSL加密的传输(https协议),从而避免敏感信息被嗅探。
  • 后端核对用户名和密码成功后,将用户的id等其他信息作为JWT Payload(负载),将其与头部分别进行Base64编码拼接后签名,形成一个JWT(Token)。
  • 后端将JWT字符串作为登录成功的返回结果返回给前端。前端可以将返回的结果保存在localStorage(浏览器本地缓存)或sessionStorage(session缓存)上,退出登录时前端删除保存的JWT即可。
  • 前端在每次请求时将JWT放入HTTP的Header中的Authorization位。(解决XSS和XSRF问题)HEADER
  • 后端检查是否存在,如存在验证JWT的有效性。例如,检查签名是否正确﹔检查Token是否过期;检查Token的接收方是否是自己(可选),验证通过后后端使用JWT中包含的用户信息进行其他逻辑操作,返回相应结果。

2.3 jwt快速入门

我们这里采用的jjwt实现。并且基于springboot项目实现的。

2.3.1 导入依赖

	<!--JWT 依赖--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency>

2.3.2 生成jwt

这将信息加密成jwt。

 JwtBuilder jwtBuilder = Jwts.builder()// 声明的标识{"jti":"8888"} 唯一的.setId("8888")// 主体,用户{"sub":"Rose"}.setSubject("Rose")// 创建日期  {"iat":"" }.setIssuedAt(new Date())// 用的什么编码.signWith(SignatureAlgorithm.HS256,"12345");// 拿到tokenString token = jwtBuilder.compact();System.out.println(token);System.out.println("---------------------");String[] split = token.split("\\.");System.out.println(Base64Codec.BASE64.decodeToString(split[0]));System.out.println(Base64Codec.BASE64.decodeToString(split[1]));// 无法解密System.out.println(Base64Codec.BASE64.decodeToString(split[2]));

2.3.3 解析jwt

这个token需要自己替换成你生成的token。

 String token = "eyJhbGciOiJIUzI1NiJ9." +"eyJqdGkiOiI4ODg4Iiwic3ViIjoiUm9zZSIsImlhdCI6MTY4NzIyODc0MX0." +"TiMu_sWRQxmlUtY-xh9G4G26UXYwGxID0kj6XC-iblI";// 解析token获取负载中声明的对象Claims claims = Jwts.parser()// 这里的签名秘钥.setSigningKey("12345").parseClaimsJws(token).getBody();System.out.println("id:"+claims.getId());System.out.println("subject:"+claims.getSubject());System.out.println("issuedAt:"+claims.getIssuedAt());

2.3.4 jwt过期校验

衔接上述生成和解析token代码。

我们在jwt代码中新加入,

  long now = new Date().getTime(); // ---新增long exp = now + 60 * 1000; // 设置60s后过期  // ---新增JwtBuilder jwtBuilder = Jwts.builder()// 声明的标识{"jti":"8888"} 唯一的.setId("8888")// 主体,用户{"sub":"Rose"}.setSubject("Rose")// 发行日期  {"iat":"" }.setIssuedAt(new Date())// 用的什么编码, secret 这是解密的秘钥(!).signWith(SignatureAlgorithm.HS256,"12345")// 设置token过期时间.setExpiration(new Date(exp)); // --- 新增

我们在解析token中,新加用来验证token过期时间,和生成时间。

PS:simpleDateFormat.format() 方法,内部没有校验null的逻辑,因此必须先生成jwt时,设置过期时间,否则为null,报异常。

  System.out.println("----------------------");SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println("jwt生成日期:"+simpleDateFormat.format(claims.getIssuedAt()));System.out.println("jwt过期日期:"+simpleDateFormat.format(claims.getExpiration()));System.out.println("当前日期:"+simpleDateFormat.format(new Date()));

2.3.4 自定义声明

我们可以在jwt中自定义claims,(这些信息会存入负载中)

衔接,上文。

        JwtBuilder jwtBuilder = Jwts.builder()// 声明的标识{"jti":"8888"} 唯一的.setId("8888")// 主体,用户{"sub":"Rose"}.setSubject("Rose")// 发行日期  {"iat":"" }.setIssuedAt(new Date())// 用的什么编码去签名,12345 明文秘钥(secret).signWith(SignatureAlgorithm.HS256,"12345")// 设置token过期时间.claim("role","admin");  // --- 新增// 直接传入map对象//.addClaims(new HashMap<>())

同样,我们也可以在解析token中获得到他。

        System.out.println(claims.get("role"));


http://chatgpt.dhexx.cn/article/9ATZEjDw.shtml

相关文章

Jetty

本文介绍一个使用Jetty开发的Web的小例子。 Jetty是一个开源的servlet容器&#xff0c;它为基于Java的web容器&#xff08;例如JSP和servlet&#xff09;提供运行环境。可以把它理解为和Tomcat一样&#xff0c;不过Jetty更小更轻量级。如果想更深入学习Jetty推荐看&#xff1a…

JWT入门详解

目录 一、JWT简介 1.什么是JWT&#xff1f; 2.为什么要使用JWT&#xff1f; 二、JWT的工作原理 三、JWT的组成 1.Header&#xff08;头部&#xff09; 2.Payload(载荷) Reserved claims(保留) Public claims&#xff08;公有&#xff09; Private claims(私有) 3.s…

Ubuntu系统搭建后端Websocket服务器--基于Apache Tomcat

目录 一、概述二、基本安装2.1 Java安装2.2 Apache Tomcat安装2.3 Eclipse EE安装 三、正式部署3.1 创建一个简单java web项目3.2 服务端部署3.3 运行3.4 局域网连接Websocket 一、概述 本文针对Ubuntu系统&#xff08;Win10下的虚拟机&#xff09;进行详述&#xff0c;本文测…

部署Nginx+Tomcat+Php-fpm+mariadb主主

要求 1、前端1台Nginx&#xff0c;均衡后端2台php-fpm&#xff0c;均衡后端2台Tomcat&#xff0c;2台MYSQL采用主主架构&#xff0c;用户通过域名访问前端Nginx 域名v1.jd.com v2.jd.com访问到Discuz和Jforum不同的网站。 2、将第一道题目的部署步骤和架构图画出来。架构图上要…

【JavaWeb】WEB开发概述以及Tomcat

&#x1f50e;这里是【JavaWeb】&#xff0c;关注我学习JavaWeb不迷路 &#x1f44d;如果对你有帮助&#xff0c;给博主一个免费的点赞以示鼓励 欢迎各位&#x1f50e;点赞&#x1f44d;评论收藏⭐️ &#x1f440;专栏介绍 【JavaWeb】 目前主要更新JavaWeb&#xff0c;一起…

tomcat环境搭和管理及实现jsp通过tomcat连接mysql

25.1 什么是Tomcat 官方网站&#xff1a;http:#tomcat.apache.org/ Tomcat 是 Apache 软件基金会&#xff08;Apache Software Foundation&#xff09;的 Jakarta 项目中的一个核心项目&#xff0c;由 Apache、Sun 和其他一些公司及个人共同开发而成。由于有了 Sun 的参与和支持…

Tomcat的Https设置及Http自动跳转Https (Linux环境下)

1.场景还原 近期项目中要对信息传输过程中进行安全加密&#xff0c;那么第一时间浮现笔者脑海的当然是https,接下来笔者将介绍如何在web服务器Tomcat中配置Https及Http自动跳转Https 2.Https相关介绍 Https是由NetScape公司设计的一个基于Http的加密传输协议&#xff0c;可以这…

六、Tomcat集群

TOMCAT集群 目录 TOMCAT集群 1 1 集群 1 1.1 什么是集群 1 1.2 集群的特性 1 1.3 集群的分类 1 1.4 TOMCAT集群配置的优缺点 2 1.5 APACHETOMCAT 2 1.6 环境说明 2 2 软件安装 3 2.1 安装说明 3 2.2 JDK安装 3 2.3 APACHE安装 4 2.4 TOMCAT安装 4 3 集群配置 6 3.1 APACHEMOD_J…

Mycat环境搭建和管理及实现jsp通过tomcat连接mysql

一、什么是tomcat 官方网站&#xff1a;http://tomcat.apache.org/ Tomcat 是 Apache 软件基金会&#xff08;Apache Software Foundation&#xff09;的 Jakarta 项目中的一个核心项目&#xff0c;由 Apache、Sun 和其他一些公司及个人共同开发而成。由于有了 Sun 的参与和支持…

Liunx下Tomcat中配置SSL协议(http转https)+域名配置SSL证书

问题描述 为什么http转https?什么情况下需要用到http转https?https优点!!!https缺点!!!废话不多说了上代码,阿里的产品为例(tomcat配置ssl). 准备材料:获取到证书点击上图的帮助可查看自带的配置文档个人感觉挺详细的 配置域名SSL证书对应上图进行选择配置就ok 接下来我们就配…

Tomcat通过自带的Cluster方式实现Session会话共享

一般来说,在多个tomcat集群业务中,session会话共享是必须的需求,不然前端nginx转发过来的请求不知道之前请求在哪台tomcat节点上&#xff0c;从而就找不到session以至于最终导致请求失败。要实现tomcat session共享有多种方案,今天介绍下使用tomcat自带的cluster方式&#xff0…

redhat 7.9 部署war包(二)之 环境安装 jdk,tomcat等

tomcat服务器环境搭建 redhat 7.9系统中搭建tomcat8.5.88服务器端在redhat中安装tomcat8一.传输文件到虚拟机中二.设置系统环境变量 JAVA_HOME三.启动tomcat8 部署war包 redhat 7.9系统中搭建tomcat8.5.88服务器端 本篇文章介绍&#xff0c;如何在redhat7.9环境下安装java web…

tomcat看源码

一.环境搭建 1.官网下载tomcat9 2.idea打开 新建pom文件 <!-- pom.xml --> <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-inst…

centos 6.2 mysql和tomcat的配置_基于CentOS 6.8平台的Tomcat+MySQL+JDK环境搭建

部署环境 Server&#xff1a;CentOS 6.8 x86_64 Tomcat&#xff1a;9.0.0.M9 MySQL&#xff1a;5.7.14 JDK&#xff1a;8u102 部署准备 使用浏览器访问Apache Tomcat官网 http://tomcat.apache.org/ 下载目前最新9版本 9.0.0.M9版本tar.gz安装包 下载Apache Commons Daemon&…

Windows下配置Tomcat集群

为什么要用Tomcat集群 可以提高整体web服务器性能&#xff0c;将动态页面交给tomcat处理&#xff0c;将静态文件交给apache处理&#xff0c;可以大大提高服务器的静态文件处理性能。 可以实现web服务器的负载均衡&#xff0c;服务器可采用集群的方式来响应客户端请求。Apache的…

tomcat连接mysql及JDBC详解

一、Tomcat简介 1、Tomcat简介 Tomcat 是 Apache 软件基金会&#xff08;Apache Software Foundation&#xff09;的 Jakarta 项目中的一个核心项目&#xff0c;由 Apache、Sun 和其他一些公司及个人共同开发而成。由于有了 Sun 的参与和支持&#xff0c;最新的 Servlet 和JS…

tomcat配置url跳转_web和tomcat的区别

在Web2.0的浪潮中&#xff0c;各种页面技术和框架不断涌现&#xff0c;为服务器端的基础架构提出了更高的稳定性和可扩展性的要求。近年来&#xff0c;作为开源中间件的全球领导者&#xff0c;JBoss在J2EE应用服务器领域已成为发展最为迅速的应用服务器。在市场占有率和服务满意…

Windows下安装配置Tomcat

Windows下安装配置Tomcat 下载 到官网下载目标Tomcat版本&#xff1a;https://tomcat.apache.org/ 下载完成后&#xff0c;进入目标目录下 解压到安装目录 配置 配置环境变量&#xff1a; 变量名为&#xff1a;CATALINA_HOME 变量值为&#xff1a;D:\software\tapache-t…

Linux系统安装配置tomcat详细教程

准备工作 在Xshell控制台依次安装&#xff1a; Linux服务器和window互传文件工具 yum install lrzsz解压命令 yum install unzip安装jdk1.8 yum install -y java-1.8.0-openjdk-devel.x86_64安装 下载tomcat的压缩文件&#xff0c;我以apache-tomcat-8.5.87.zip为例。 将…

Tomcat 环境搭建和管理

Tomcat 概念 Tomcat 是 Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目&#xff0c;由 Apache、Sun 和其他一些公司及个人共同开发而成&#xff0c;由于有了 Sun的参与和支持&#xff0c;最新的 Servlet 和 JSP规范总是能在Tomcat 中得到体现&a…