OJ项目——使用JWT生成Token

news2024/11/26 5:38:33

目录

前言

1、项目中需要修改哪些东西?

1.1、引入依赖

1.2、编写JWT工具类

1.3、登陆成功后,把以前的session修改为token

1.4、登录拦截器的修改

1.5、展示前端部分代码


前言

        有兴趣的小伙伴,可以先看看这篇文章,如果使用session,我们在项目中是如何做的:http://t.csdnimg.cn/7hFju 

        关于session、token以及Token生成的详解在:http://t.csdnimg.cn/VSn98 ,不了解JWT的伙伴,也可以看看这个篇文章;这篇文章中,介绍的比较详细,有兴趣伙伴可以看看。下面这篇文章我就直接介绍,在我的OJ项目如果使用JWT生成token~

        我的项目在之前是使用session的,所以我们在session的基础之上进行修改就可以了~

1、项目中需要修改哪些东西?

        首先呢?使用session时在后端,我们只有三个地方使用到了session,第一个就是用户在进行登录时,获取到session,给session的Attribute属性添加一个键值对,这个键值对的值就是存储用户信息;第二个就是在实现登录拦截时验证用户信息,需要得到session后,获取Attribute中指定的的键值对中的值是否有值,有值则表示用户已登录,无则表示用户未登录;第三个就是在后续想要通过请求中的session来获取用户某些信息时,如通过请求中的session获取用户的id时,我们需要通过请求获取到session,通过session的Attribute中指定的键值对,拿到这个键值对中的值,这个值中就会存有这个用户的部分信息~

        综上,我们在将session修改为Token时,也是需要修改这几步~

1.1、引入依赖

引入jwt依赖:

        <!--  jwt依赖    -->
		<dependency>
			<groupId>io.jsonwebtoken</groupId>
			<artifactId>jjwt</artifactId>
			<version>0.9.1</version>
		</dependency>

1.2、编写JWT工具类

package com.example.demo.commom;

import io.jsonwebtoken.*;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User:龙宝
 * Date:2023-11-07
 * Time:9:23
 */
public class JWTUtils {
    private static final long EXPIERS = 1000 * 60 * 60 * 24; //设置为一天

    private static final String SECRET = "xiaolong";//设置密钥,每个公司都不一样~

    /**
     * 使用JWT生成token
     * @param id
     * @param username
     * @return
     */
    public static String getTWTToken(Integer id,String username) {
        String JWTToken = Jwts.builder()
                //JWT头
                .setHeaderParam("typ","JWT")
                .setHeaderParam("alg","HS256")

                //JWT主体
                //这三个为可选
                .setSubject("guli-user") //主题
                .setIssuedAt(new Date()) //创建时间
                .setExpiration(new Date(System.currentTimeMillis() + EXPIERS)) // 过期时间

                //主题中存储用户信息的部分
                .claim("id",id)
                .claim("username",username)

                //设置签名哈希,防伪标志
                .signWith(SignatureAlgorithm.HS256,SECRET)
                .compact();
        return JWTToken;
    }

    /**
     * 验证token是否存在  +  有效
     * @param JWTToken
     * @return
     */
    public static boolean checkToken(String JWTToken) {
        if(!StringUtils.hasLength(JWTToken)) {
            return false;
        }
        try{
            Jwts.parser().setSigningKey(SECRET).parseClaimsJws(JWTToken);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 验证token是否存在  +  有效
     * @param request
     * @return
     */
    public static boolean checkToken(HttpServletRequest request) {
        try {
            String token = request.getHeader("token");
            if(!StringUtils.hasLength(token)) {
                return false;
            }
            Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 根据token获取id
     * @param request
     * @return
     */
    public static Integer getMemberIdByJwtToekn(HttpServletRequest request) {
        String token = request.getHeader("Authorization");
        if(!StringUtils.hasLength(token)) {
            return new Integer("");
        }
        //解析token
        Jwt<Header, Claims> claimsJwt = Jwts.parser().setSigningKey(SECRET).parseClaimsJwt(token);
        //获取载荷中的有效信息【用户信息】
        Claims claims = claimsJwt.getBody();
        return new Integer(claims.getId());
    }

}

1.3、登陆成功后,把以前的session修改为token

 

1.4、登录拦截器的修改

说明:

  • 代码理解:通过请求头获取key---Authorizatio所对应的value的值,这个value就是Token,我们拿着这个Token字符串去验证就可以了。【请求头中的是按照Authorizatio:token 这样的格式来的,大家也可以按照自己的设计走】

1.5、展示前端部分代码

登陆成功后,设置token:

我们可以把他设置在cookie中,也可以设置在localStorage中~

在发送请求时,请求头需要代码Token:

或者,给所有的ajax请求都添加上:

下面的这个代码,需要放在js代码的最前面~ 公共js代码的话,记得引入js~

 当然了,如果小伙伴学习过vue的话,使用vue会更加简单~

好啦,本期就到这里啦~下期见哦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1182837.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python 之 集合的相关知识

文章目录 1. 创建集合使用花括号 {}使用 set() 函数 2. 集合的特点3. 集合操作添加元素删除元素 4. 集合运算5. 不可变集合总结 在 Python 中&#xff0c;集合&#xff08;Set&#xff09;是一种无序且不重复的数据集合。它是由一组唯一元素组成的。下面是关于集合的一些基本知…

6.判断是不是闰年

#include<stdio.h>void fun(int year){if(year%40&&year%100!0||year%4000)printf("%d 是闰年\n",year);elseprintf("%d 不是闰年\n",year);}int main(){int year;scanf("%d",&year);fun(year);return 0;}

java记一次replace替换中文双引号失败的问题

事情的起因是一个Java项目中要调用第三方接口&#xff0c;而且无法远程访问该接口进行调试&#xff0c;只能本地写完功能后现场部署测试。 其中接口文档是这样描述的&#xff1a; 实际第三方接口返回值是带中文双引号的字符串【“1”】或者带有英文双引号的字符串【"1&qu…

Python武器库开发-常用模块之subprocess模块(十九)

常用模块之subprocess模块(十九) subprocess模块介绍 subprocess 模块允许我们启动一个新进程&#xff0c;并连接到它们的输入/输出/错误管道&#xff0c;从而获取返回值。subprocess 它可以用来调用第三方工具&#xff08;例如&#xff1a;exe、另一个python文件、命令行工具…

Bun 1.0.7 版本发布,实现多个 Node.js 兼容改进

导读Bun 是一个集打包工具、转译器和包管理器于一体的 JavaScript 运行时&#xff0c;由 Jarred Sumner 发布了 1.0.7 版本。本次更新实现了对 Node.js 运行时的多项兼容性改进&#xff0c;并修复了近 60 个 bug。 根据发布说明&#xff0c;本版本对 “bun install” 命令进行…

yolov8+多算法多目标追踪+实例分割+目标检测+姿态估计(代码+教程)

多目标追踪实例分割目标检测 YOLO (You Only Look Once) 是一个流行的目标检测算法&#xff0c;它能够在图像中准确地定位和识别多个物体。 本项目是基于 YOLO 算法的目标跟踪系统&#xff0c;它将 YOLO 的目标检测功能与目标跟踪技术相结合&#xff0c;实现了实时的多目标跟…

Linux笔记——Ubuntu子系统从系统盘迁移到非系统盘

Linux笔记——Ubuntu子系统从系统盘迁移到非系统盘 一、子系统迁移1. 关闭linux子系统2. 使用move-wsl进行迁移 二、 虚拟机子系统瘦身 安了子系统还没用几天&#xff0c;C盘提示我没空间了。。。剩余0kb的那种。。。Ubuntu安装的时候默认按C盘了&#xff0c;所以还是移走腾点地…

【神经网络】【GoogleNet】

1、引言 卷积神经网络是当前最热门的技术&#xff0c;我想深入地学习这门技术&#xff0c;从他的发展历史开始&#xff0c;了解神经网络算法的兴衰起伏&#xff1b;同时了解他在发展过程中的**里程碑式算法**&#xff0c;能更好的把握神经网络发展的未来趋势&#xff0c;了解神…

第1天:Python基础语法(一)

** 1、Python简介 ** Python是一种高级、通用的编程语言&#xff0c;由Guido van Rossum于1989年创造。它被设计为易于阅读和理解&#xff0c;具有简洁而清晰的语法&#xff0c;使得初学者和专业开发人员都能够轻松上手。 Python拥有丰富的标准库&#xff0c;提供了广泛的功…

生态环境领域基于R语言piecewiseSEM结构方程模型

结构方程模型&#xff08;Sructural Equation Modeling&#xff0c;SEM&#xff09;可分析系统内变量间的相互关系&#xff0c;并通过图形化方式清晰展示系统中多变量因果关系网&#xff0c;具有强大的数据分析功能和广泛的适用性&#xff0c;是近年来生态、进化、环境、地学、…

AI 绘画 | Stable Diffusion 涂鸦功能与局部重绘

在 StableDiffusion图生图的面板里&#xff0c;除了图生图&#xff08;img2img&#xff09;选卡外&#xff0c;还有局部重绘(Inpaint)&#xff0c;涂鸦(Sketch)&#xff0c;涂鸦重绘(Inpaint Sketch),上传重绘蒙版&#xff08;Inpaint Uplaod&#xff09;、批量处理&#xff08…

图像标注工具lableImg安装出错怎么办?

我们要训练自己的图像识别模型&#xff0c;首先要进行图像的标注。labelimg就是一款可视化的图像标注工具。它是用Python编写的&#xff0c;通过Qt实现其图形界面&#xff0c;尽管它只支持矩形框标注&#xff0c;但因跨平台&#xff0c;支持Linux、Mac OS、Windows&#xff0c;…

部分iOS机型 new Date() 时间 NAN

部分 iOS 机型 new Date() 时间 NAN 解决代码 是因为部分 iOS 机型 new Date(2023-01-01 00:00:00) 时&#xff0c; 获取时间戳的时间年月日用 - 分隔&#xff0c;将 - 分隔改为 / 分隔即可 new Date(2023/01/01 00:00:00)

【java】实现自定义注解校验——方法二

自定义注解校验的实现步骤&#xff1a; 1.创建注解类&#xff0c;编写校验注解&#xff0c;即类似NotEmpty注解 2.编写自定义校验的逻辑实体类&#xff0c;编写具体的校验逻辑。(这个类可以实现ConstraintValidator这个接口&#xff0c;让注解用来校验) 3.开启使用自定义注解进…

独立开发者学习的技术栈

# 前端 语言 - HTML - CSS/Sass/PostCSS - JavaScript/TypeScriptJS框架 - Vue - NuxtJS - React - NextJS - RemixJS CSS框架 - Tailwindcss - Bulma# 设计语言 - Ant Design - Material Design#后端 语言 - JavaScript/TypeScript - Python - Java - PHP 框架 - NestJS - Exp…

github 上传代码报错 fatal: Authentication failed for ‘xxxxxx‘

问题 今天一时兴起创建了个 github 新仓库&#xff0c;首次上传本地代码时&#xff0c;遇到了一个报错。本来以为是账号密码的问题&#xff0c;搞了好几次&#xff0c;发现都没错的情况下还是上传不上去。目测判断是认证相关问题&#xff0c;具体报错信息如下&#xff1a; rem…

JavaScript基础入门03

目录 1.条件语句 1.1if 语句 1.1.1基本语法格式 1.1.2练习案例 1.2三元表达式 1.3switch 2.循环语句 2.1while 循环 2.2continue 2.3break 2.4for 循环 3.数组 3.1创建数组 3.2获取数组元素 3.3新增数组元素 3.3.1. 通过修改 length 新增 3.3.2. 通过下标新增 …

OpenShift - 利用容器的特权配置实现对OpenShift攻击,以及如何使用 PSA 和 RHACS 防范风险

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在 OpenShift 4.14 的环境中验证 本文是《容器安全 - 利用容器的特权配置实现对Kubernetes攻击》的后续篇&#xff0c;来介绍 在 OpenShift 环境中的容器特权配置和攻击过程和 Kubernetes 环境的差异&…

【Spring】Spring IOCDI(万字详解)

文章目录 1. Spring是什么&#xff1f;2. 认识IOC2.1 传统程序开发1. Main.java2. Car.java3. Framework.java4. Bottom.java5. Tire.java 2.2 分析传统开发2.3 IOC程序开发1. Main.java2. Car.java3. Framework.java4. Bottom.java5. Tire.java 2.4 分析IOC开发2.5 IOC容器优点…

零代码编程:用ChatGPT批量将Mp4视频转为Mp3音频

文件夹中有很多mp4视频文件&#xff0c;如何利用ChatGPT来全部转换为mp3音频呢&#xff1f; 在ChatGPT中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个批量将Mp4视频转为Mp3音频的任务&#xff0c;具体步骤如下&#xff1a; 打开文件夹&#xff1a;…