【SpringBoot篇】登录校验 — JWT令牌

文章目录

  • 🌹简述JWT令牌
    • ⭐JWT特点
  • 🌺JWT使用流程
  • 🛸JWT令牌代码实现
  • 🍔JWT应用

🌹简述JWT令牌

JWT全称为JSON Web Token,是一种用于身份验证的开放标准。它是一个基于JSON格式的安全令牌,主要用于在网络上传输声明或者用户身份信息。JWT通常被用作API的认证方式,以及跨域身份验证。

JWT令牌由三部分组成,分别是头部(Header)、载荷(Payload)和签名(Signature)。头部包含了令牌使用的加密算法信息,载荷包含了所需传输的用户信息,签名用于保证令牌的完整性和真实性,防止令牌被篡改。
请添加图片描述
请添加图片描述

官网https://jwt.io/

⭐JWT特点

  • 可以跨语言、跨平台使用,因为它是基于JSON标准的。
  • 可以直接嵌入到HTTP请求头中,方便传输和验证。
  • 令牌的有效期可以通过设置过期时间来进行控制,提高了安全性。
  • 由于令牌中包含了用户信息,因此可以避免频繁查询数据库的情况出现,提高了系统的性能。

🌺JWT使用流程

用户向服务器发送登录请求,服务器进行身份验证,如果验证成功则返回一个JWT令牌给客户端。

客户端收到JWT令牌后,将其保存在本地。每次向服务器发送请求时,在请求的头部中携带该令牌,以便服务器对请求进行身份验证。

服务器收到请求后,从请求头中提取JWT令牌,并进行解析和验证。如果令牌有效,则允许请求继续执行;否则返回错误信息。

生成令牌,校验令牌
请添加图片描述
在服务端拦截所有的请求,判断算法有合法的jwt请求,如果有,直接放行,否则进行拦截

🛸JWT令牌代码实现

我把代码脚手架传到网盘里面了,大家跟着代码来学习
我用夸克网盘分享了「tlias-web-management」,点击链接即可保存。
链接:https://pan.quark.cn/s/1f4f6c129be8

添加依赖

<!--        JWT令牌-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>

生成JWT令牌

 //生成jwt
    @Test
    public void testGenJwt(){
        Map<String, Object> claims = new HashMap<>();
        claims.put("id",1);
        claims.put("name","Tom");

        String jwt = Jwts.builder()
                .signWith(SignatureAlgorithm.HS512, "itheima")  //签名算法
                .setClaims(claims)   //自定义内容
                                //有参构造方法
                .setExpiration(new Date(System.currentTimeMillis()+3600))  //令牌过期时间
               .compact();
        System.out.println(jwt);

    }


运行后发现,出现了jwt令牌

我们把这一段jwt令牌复制粘贴到jwt官网进行解析一下

https://jwt.io/


解析jwt令牌
(相当于校验令牌,只要解析令牌不报错,就相当于校验jwt令牌正确)

   //解析jwt
    @Test
    public void testParseJwt() {
        Claims claims=Jwts.parser()
                .setSigningKey("itheima")
                //写入你刚才运行出来的jwt令牌
                .parseClaimsJws("eyJhbGciOiJIUzUxMiJ9.eyJuYW1lIjoiVG9tIiwiaWQiOjEsImV4cCI6MTcwMDcyMzQ1M30.GMp1Z-osnaOJ08nM3uswPKRFIaKS4e6_UvZXq2Q4QjYBFRcJNk7WgQRkFJHXIUrZfKovXUZhd8-OOKtXYDyrbg")
                .getBody();
        System.out.println(claims);
    }


解析出来了

可能会发生这种报错,是因为jwt令牌过期了,重新生成一个即可

🍔JWT应用

我们接着上面的代码写,引入jwt工具类

package com.itheima.utils;

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 = "itheima";	//签名密钥
    private static Long expire = 43200000L;		//过期时间

    /**
     * 生成JWT令牌
     * @param claims JWT第二部分负载 payload 中存储的内容
     * @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;
    }
}

创建LoginController,里面包含了生成jwt令牌的代码

package com.itheima.controller;

import com.itheima.pojo.Emp;
import com.itheima.pojo.Result;
import com.itheima.service.EmpService;
import com.itheima.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@Slf4j
@RestController
public class LoginController {

    @Autowired
    private EmpService empService;

    @PostMapping("/login")
    public Result login(@RequestBody Emp emp){
        log.info("员工登录: {}", emp);
        Emp e = empService.login(emp);

        //登录成功,生成令牌,下发令牌
        if (e != null){
            Map<String, Object> claims = new HashMap<>();
            claims.put("id", e.getId());
            claims.put("name", e.getName());
            claims.put("username", e.getUsername());

            String jwt = JwtUtils.generateJwt(claims); //jwt包含了当前登录的员工信息
            return Result.success(jwt);
        }

        //登录失败, 返回错误信息
        return Result.error("用户名或密码错误");
    }

}

在技术的道路上,我们不断探索、不断前行,不断面对挑战、不断突破自我。科技的发展改变着世界,而我们作为技术人员,也在这个过程中书写着自己的篇章。让我们携手并进,共同努力,开创美好的未来!愿我们在科技的征途上不断奋进,创造出更加美好、更加智能的明天!

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2023年12月5日
下一篇 2023年12月5日

相关推荐