前言
在之前进行登录验证的,主要用的是session的方式,session是由客户端首次发起请求,后端为此创建空间,返回给前端用来身份识别标识sessionId,前端基于cookie存储起来,在后面的请求中都会携带sessionId,后端就会根据这sessionId识别出身份信息。前端sessionid是基于cookie进行存储的。这种方式会存在安全问题,如果被不法分子拦截这个sessionId或cookie信息,就能跳过后端验证,从而盗取你的信息。而且seesion这种方式容易占用到服务端的内存空间。在前后端分离的方式,seesion也不适合作为身份验证方式。为了解决跨域问题,采用基于token方式解决。
一、jwt介绍?
1.1 什么是JWT
JWT (全称:Json Web Token)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为 JSON 对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。
上面说法比较文绉绉,简单点说就是一种认证机制,让后台知道该请求是来自于受信的客户端。
二、Springboot集成JWT
2.1 导入maven
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
2.2 创建工具类,配置jwt
创建Jwtutil类,用于创建jwt字符和解析jwt.
package com.sky.utils;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.Map;
public class JwtUtil {
/**
* 生成jwt
* 使用Hs256算法, 私匙使用固定秘钥
*
* @param secretKey jwt秘钥
* @param ttlMillis jwt过期时间(毫秒)
* @param claims 设置的信息
* @return
*/
public static String createJWT(String secretKey, long ttlMillis, Map<String, Object> claims) {
// 指定签名的时候使用的签名算法,也就是header那部分
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
// 生成JWT的时间
long expMillis = System.currentTimeMillis() + ttlMillis;
Date exp = new Date(expMillis);
// 设置jwt的body
JwtBuilder builder = Jwts.builder()
// 如果有私有声明,一定要先设置这个自己创建的私有的声明,这个是给builder的claim赋值,一旦写在标准的声明赋值之后,就是覆盖了那些标准的声明的
.setClaims(claims)
// 设置签名使用的签名算法和签名使用的秘钥
.signWith(signatureAlgorithm, secretKey.getBytes(StandardCharsets.UTF_8))
// 设置过期时间
.setExpiration(exp);
return builder.compact();
}
/**
* Token解密
*
* @param secretKey jwt秘钥 此秘钥一定要保留好在服务端, 不能暴露出去, 否则sign就可以被伪造, 如果对接多个客户端建议改造成多个
* @param token 加密后的token
* @return
*/
public static Claims parseJWT(String secretKey, String token) {
// 得到DefaultJwtParser
Claims claims = Jwts.parser()
// 设置签名的秘钥
.setSigningKey(secretKey.getBytes(StandardCharsets.UTF_8))
// 设置需要解析的jwt
.parseClaimsJws(token).getBody();
return claims;
}
}
testDemo.java
package com.example.jwtproject.demos;
import io.jsonwebtoken.Claims;
import java.util.HashMap;
import java.util.Map;
/**
* @author : by smomo
* @date : 2023/7/17 18:35
* @description :
*/
public class TestDemo {
private static final String secret_key="itcast";
private static final int ttl=72000;
private static final String token_name="token";
public static void main(String[] args) {
Map<String, Object> claims = new HashMap<>();
claims.put("id",1);
String token= JwtUtil.createJWT(secret_key, ttl, claims);
System.out.println("生成的jwt:"+token);
Claims claims1 = JwtUtil.parseJWT(secret_key, token);
System.out.println("解析后的token:"+claims1);
String id = claims1.getId();
System.out.println("解析后的token的id"+id);
System.out.println("解析后的token的有效期"+claims1.getExpiration());
}
}