Token是首次登录时,由服务器下发,作为客户端进行请求时的一个令牌。当请求后台方法时,用于身份验证
当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码
Token完全由应用程序进行管理,所以它可以避开同源策略
Token可以避免CSRF(跨站请求访问)攻击
简单的说:后端生成token 会有一个签名(基本上后端自己设计) 避免外部攻击!
Token可以是无状态的,可以在多个服务器之间共享
使用Token减轻服务器的压力,减少频繁的查询数据库。
1.用户通过用户名和密码发送请求
2.程序进行验证
3.程序会返回一个字符串(就是token)给客户端
4.客户端进行储存token,并且用于每一次请求
5.服务器验证并且返回想要的数据
现在知道token是干什么的了,那么怎么使用token呢?
JWT,全称为JSON Web token,是用于对应用程序上的用户进行身份验证的标记。也就是说,使用JWT的应用程序不再需要保存有关其用户的cookie或session数据
* 在身份验证过程中, 当用户使用其凭据成功登录时,将返回JWT,客户端会将其保存到本地存储中,而后每次请求都会携带
* JWT本质上就是一个经过加密处理与校验处理的字符串,
它由三部分组成:头信息.有效载荷.签名
头信息: 一般由两部分组成,Token类型和散列算法(HMAC、RSASSA、RSASSA-PSS等)
- {
- "typ": "JWT",
- "alg": "HS256"
- }
有效载荷: 一般里面可以存储自定义的实体的信息
payload(载荷)信息存放的是Claims声明信息。载荷其实就是自定义的数据,一般存储用户Id,过期时间等信息。也就是JWT的核心所在,因为这些数据就是使后端知道此token是哪个用户已经登录的凭证。而且这些数据是存在token里面的,由前端携带,所以后端几乎不需要保存任何数据。
签名: 用于保证消息在传输过程中不会被篡改
signature(签名)需要使用编码后的header和payload以及一个秘钥,使用header中指定签名算法进行签名。

1.依赖
- <dependency>
- <groupId>io.jsonwebtokengroupId>
- <artifactId>jjwtartifactId>
- <version>0.9.1version>
- dependency>
2.封装工具类 创建和解析token(调用)
- import io.jsonwebtoken.Jwts;
- import io.jsonwebtoken.SignatureAlgorithm;
-
- import java.util.Map;
-
- public class JwtUtil {
- // 创建token
- public static String createToken(Long id,String secret) {
- Map
map = new HashMap(); - map.put("id", id);
- return Jwts.builder()
- .setClaims(map) //设置响应数据体
- .signWith(SignatureAlgorithm.HS256, secret) //设置加密方法和加密盐
- .compact();
- }
-
-
- // 解析token
- public static Map parseToken(String token,String secret) {
- return Jwts.parser().setSigningKey(secret)
- .parseClaimsJws(token)
- .getBody();
- }
-
- }
最后token 相当于这玩意:
"token": "eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MTI4fQ.BUsv0fc8qI2Yx02vEDLUR1JSc-FV5Sr8NuqsXIKPiNg"
生成和解析token工具类
- import io.jsonwebtoken.*;
-
- import javax.crypto.SecretKey;
- import javax.crypto.spec.SecretKeySpec;
- import java.util.*;
-
- public class AppJwtUtil {
-
- // TOKEN的有效期一天(S)
- private static final int TOKEN_TIME_OUT = 3_600;
- // 加密KEY
- private static final String TOKEN_ENCRY_KEY = "MDk4ZjZiY2Q0NjIxZDM3M2NhZGU0ZTgzMjYyN2I0ZjY";
- // 最小刷新间隔(S)
- private static final int REFRESH_TIME = 300;
-
- // 生产ID
- public static String getToken(Long id){
- Map
claimMaps = new HashMap<>(); - claimMaps.put("id",id);
- long currentTime = System.currentTimeMillis();
- return Jwts.builder()
- .setId(UUID.randomUUID().toString())
- .setIssuedAt(new Date(currentTime)) //签发时间
- .setSubject("system") //说明
- .setIssuer("heima") //签发者信息
- .setAudience("app") //接收用户
- .compressWith(CompressionCodecs.GZIP) //数据压缩方式
- .signWith(SignatureAlgorithm.HS512, generalKey()) //加密方式
- .setExpiration(new Date(currentTime + TOKEN_TIME_OUT * 1000)) //过期时间戳
- .addClaims(claimMaps) //cla信息
- .compact();
- }
-
- /**
- * 获取token中的claims信息
- *
- * @param token
- * @return
- */
- private static Jws
getJws(String token) { - return Jwts.parser()
- .setSigningKey(generalKey())
- .parseClaimsJws(token);
- }
-
- /**
- * 获取payload body信息
- *
- * @param token
- * @return
- */
- public static Claims getClaimsBody(String token) {
- try {
- return getJws(token).getBody();
- }catch (ExpiredJwtException e){
- return null;
- }
- }
-
- /**
- * 获取hearder body信息
- *
- * @param token
- * @return
- */
- public static JwsHeader getHeaderBody(String token) {
- return getJws(token).getHeader();
- }
-
- /**
- * 是否过期
- *
- * @param claims
- * @return -1:有效,0:有效,1:过期,2:过期
- */
- public static int verifyToken(Claims claims) {
- if(claims==null){
- return 1;
- }
- try {
- claims.getExpiration()
- .before(new Date());
- // 需要自动刷新TOKEN
- if((claims.getExpiration().getTime()-System.currentTimeMillis())>REFRESH_TIME*1000){
- return -1;
- }else {
- return 0;
- }
- } catch (ExpiredJwtException ex) {
- return 1;
- }catch (Exception e){
- return 2;
- }
- }
-
- /**
- * 由字符串生成加密key
- *
- * @return
- */
- public static SecretKey generalKey() {
- byte[] encodedKey = Base64.getEncoder().encode(TOKEN_ENCRY_KEY.getBytes());
- SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
- return key;
- }
-
- public static void main(String[] args) {
- /* Map map = new HashMap();
- map.put("id","11");*/
- System.out.println(AppJwtUtil.getToken(1102L));
- Jws
jws = AppJwtUtil.getJws("eyJhbGciOiJIUzUxMiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAAADWLQQqEMAwA_5KzhURNt_qb1KZYQSi0wi6Lf9942NsMw3zh6AVW2DYmDGl2WabkZgreCaM6VXzhFBfJMcMARTqsxIG9Z888QLui3e3Tup5Pb81013KKmVzJTGo11nf9n8v4nMUaEY73DzTabjmDAAAA.4SuqQ42IGqCgBai6qd4RaVpVxTlZIWC826QA9kLvt9d-yVUw82gU47HDaSfOzgAcloZedYNNpUcd18Ne8vvjQA"); - Claims claims = jws.getBody();
- System.out.println(claims.get("id"));
-
- }
-
- }