SSM+JWT实现前后端分离的token验证
前言
以前写的web项目都是没有前后端分离的,都是写的jsp,或者说前后端分离也没有使用token,都是使用session,后来发现这种使用session的方式非常不好,而且在前后端分离的情况下也不太适用,所以学习一下基于JWT的token验证。
什么是JWT
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
基于Token的验证流程
- 用户使用用户名、密码进行登录
- 服务器验证用户信息
- 验证通过,服务器给客户端发送一个token
- 客户端保存这个token,保存方法可以存在cookie中
- 此后客户端每次请在请求头上加上此token,后端会验证token,并根据是否验证通过而返回不同的数据
token一般是一个比较长的字符串,如下:
eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJmanoiLCJpYXQiOjE2MDgzODk3MDEsInN1YiI6IkZqeiIsImlzcyI6IkplcnNleS1TZWN1cml0eS1CYXNpYyIsImV4cCI6MTYwODM5MTUwMX0.23EogcNb-_OsQCPZqXc9Eh6OQi101XQODyw5DGqsT3Y
JWT的Token实现
后端部分
- 先创建一个基于Maven的SSM项目,不懂的小伙伴可以参考一下我以前的博客(不用Maven也行,只要导入下面说的相应的jar包就行)
附上Maven搭建SSM的博客链接: https://blog.youkuaiyun.com/weixin_44215175/article/details/108642595 - 在pom.xml加入除SSM的基本依赖外的一下json依赖以及JWT的依赖
<!--jackson依赖-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-jaxb-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.41</version>
</dependency>
<!-- Jwt -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.2.0</version>
</dependency>
<!-- slf4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
- 编写JWT工具类,网上有很多,我这里也是从网上抄了一个
原文链接:https://blog.youkuaiyun.com/qq_37380557/article/details/97375948?utm_source=app
package pers.kuroko.utils;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.security.Key;
import java.util.Date;
public class JWTUtil {
// token加密时使用的秘钥,一旦得到此秘钥也就可以伪造token了