串联契机:登录校验 在服务器端接收到浏览器发送过来的请求之后,首先我们要对请求进行校验,通过校验的允许后续的业务操作,访问后续的数据, 而未通过校验的则会被提示错误. 常用相关技术有JWT(令牌)、Filter(过滤器)和interceptor(拦截器)三种.
JWT令牌
JWT是什么呢?
JWT全称(JSON Web Token),JWT基于令牌技术,令牌就是用户身份的标识,其本质就是一个字符串。
JWT主要做到了什么呢?
可以根据自身的需求在jwt令牌中存储自定义的数据内容,而且jwt将原始的json数据格式进行了安全的封装(基于Base64编码对字符串进行加密),这样就可以直接基于jwt使在通信双方安全的情况下进行信息传输了。
JWT包含什么?(组成)
JWT的组成: (JWT令牌由三个部分组成,三个部分之间使用英文的点来分割)
- 第一部分:Header(头), 记录令牌类型、签名算法等。 例如:{"alg":"HS256","type":"JWT"}
- 第二部分:Payload(有效载荷),携带一些自定义信息、默认信息等。 例如:{"id":"1","username":"Tom"}
- 第三部分:Signature(签名),防止Token被篡改、确保安全性。将header、payload,并加入指定秘钥,通过指定签名算法计算而来。
- 相关字段:自定义签名/定时 定时允许JWT的Token存活时间
在Spring中的使用:
依赖:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
传值:
//对象值
Map<String, Object> claims = new HashMap<>();
加密
public static String generateJwt(Map<String,Object> claims){
String jwt = Jwts.builder()
.addClaims(claims)
.signWith(SignatureAlgorithm.HS256, signKey)
.setExpiration(new Date(System.currentTimeMillis() + expire))
.compact();
return jwt;
}
解析
/**
* 解析JWT令牌
* @param jwt JWT令牌
* @return JWT第二部分负载 payload 中存储的内容
*/
public static Claims parseJWT(String jwt){
Claims claims = Jwts.parser()
.setSigningKey(signKey)
.parseClaimsJws(jwt)
.getBody();
return claims;
}
验证修改(修改一点字符就不能破解)
JWTUTil工具类
package com.itheima.util;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;
public class JwtUtils {
private static String signKey = "SVRIRUlNQQ==";
private static Long expire = 43200000L;
/**
* 生成JWT令牌
* @return
*/
public static String generateJwt(Map<String,Object> claims){
String jwt = Jwts.builder()
.addClaims(claims)
.signWith(SignatureAlgorithm.HS256, signKey)
.setExpiration(new Date(System.currentTimeMillis() + expire))
.compact();
return jwt;
}
/**
* 解析JWT令牌
* @param jwt JWT令牌
* @return JWT第二部分负载 payload 中存储的内容
*/
public static Claims parseJWT(String jwt){
Claims claims = Jwts.parser()
.setSigningKey(signKey)
.parseClaimsJws(jwt)
.getBody();
return claims;
}
}
JWT被携带验证过程: 后端发送请求携带令牌(token),通过后,每次在访问时都会携带token去访问前端.
JWT令牌存储在浏览器的本地存储空间 localstorage中了。 localstorage 是浏览器的本地存储,在移动端也是支持的。