springboot和redis与jwt实现jwt的token双重拦截

添加自定义拦截器

package com.juejiu.config;import com.juejiu.utils.TokenGenerate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;//token拦截器,对拦截下的接口检查其的token是否符合只有
// 在提供一个有效的token时才能通过验证,否则给出认证失败的响应。
@Component
public class TokenInterceptor implements HandlerInterceptor {@Autowiredprivate RedisTemplate redisTemplate;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception{//Axios 发起跨域请求前,浏览器也会首先发起 OPTIONS 预检请求。检查服务器是否允许跨域访问。System.out.println("拦截的请求路径:" + request.getRequestURI());System.out.println("拦截的请求方法:" + request.getMethod());if(request.getMethod().equals("OPTIONS")){response.setStatus(HttpServletResponse.SC_OK);System.out.println("允许跨域访问");return true;}response.setCharacterEncoding("utf-8");String token = request.getHeader("token");if(token != null){boolean result = TokenGenerate.verify(token);if(result){Object o = redisTemplate.opsForValue().get("token:" + token);if(o==null){System.out.println("token过期或者在用户退出的时候已删除,redis找不到");return   false;}System.out.println("通过拦截器");return true;}}response.setCharacterEncoding("UTF-8");PrintWriter out = null;response.getWriter().write("认证失败,错误码:50000");return false;}
}

添加mvc拦截器

package com.juejiu.config;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.ArrayList;
import java.util.List;//入口拦截,设置哪些接口需要拦截或不拦截(保护后端接口 防止未经授权的访问)
//只需要拦截本身就不会携带token的接口(例如登陆注册)
//因为登陆后网页的请求头就会携带token,此时我们需要进行token的验证,防止在未登陆时就可以进行其他操作
@Configuration
public class IntercepterConfig implements WebMvcConfigurer {@Autowiredprivate final TokenInterceptor tokenInterceptor;//    构造方法public IntercepterConfig(TokenInterceptor tokenInterceptor) {this.tokenInterceptor = tokenInterceptor;}@Overridepublic void addInterceptors(InterceptorRegistry registry) {//excludePathPatterns用来配置不需要拦截的接口(或者相当于功能)List<String> excludePath = new ArrayList<>();//List用来保存所有不需要拦截的路径excludePath.add("/register"); //注册excludePath.add("/login/**"); //登录excludePath.add("/essay/**"); //登录//在登陆之后的网页中已经携带token,所以只需要放行登陆注册接口,//若放行其他接口,那么就相当于不需要登陆就可进行接口的使用registry.addInterceptor(tokenInterceptor)//添加名为tokenInterceptor的拦截器.addPathPatterns("/**") //指定拦截所有路径.excludePathPatterns(excludePath);//排除不需要拦截的路径WebMvcConfigurer.super.addInterceptors(registry);}
}

自定义的jwttoken生成器

package com.juejiu.utils;import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.springframework.stereotype.Component;import java.util.Date;
@Component
public class TokenGenerate {private static final long EXPIRE_TIME= 6*60*60*60*1000;private static final String TOKEN_SECRET="tokenqkj";  //密钥盐public String generateToken(String account){String token = null;try{Date expiresAt = new Date(System.currentTimeMillis() + EXPIRE_TIME);token = JWT.create().withIssuer("auth0").withClaim("account", account).withExpiresAt(expiresAt).sign(Algorithm.HMAC256(TOKEN_SECRET));}catch (Exception e){e.printStackTrace();}return token;}/*** 签名验证* @param token* @return*/public static boolean verify(String token){System.out.println("执行了token验证代码");System.out.println("获得Token为 :"+token);try {JWTVerifier verifier = JWT.require(Algorithm.HMAC256(TOKEN_SECRET)).withIssuer("auth0").build();DecodedJWT jwt = verifier.verify(token);System.out.println("认证通过:");System.out.println("issuer: " + jwt.getIssuer());System.out.println("account: " + jwt.getClaim("account").asString());System.out.println("过期时间:      " + jwt.getExpiresAt());return true;} catch (Exception e){System.out.println("没通过");return false;}}
}

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

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

相关文章

安装Docker(CentOS)

Docker 分为 CE 和 EE 两大版本。CE 即社区版&#xff08;免费&#xff0c;支持周期 7 个月&#xff09;&#xff0c;EE 即企业版&#xff0c;强调安全&#xff0c;付费使用&#xff0c;支持周期 24 个月。 Docker CE 分为 stable test 和 nightly 三个更新频道。 官方网站上…

PyCharm配置Python环境

在PyCharm中配置Python环境是一个相对简单的过程。下面是一步一步的指导&#xff0c;帮助你设置PyCharm以使用特定的Python解释器&#xff1a; 步骤 1: 打开PyCharm设置 打开PyCharm。点击菜单栏中的 File&#xff0c;然后选择 Settings&#xff08;Windows和Linux&#xff0…

Free MyBatis Tool插件的进阶使用指南(消灭dao层的繁琐编码)

目录 零、起因一、怎么使用Free MyBatis Tool插件&#xff1f;1 基本使用2 进阶使用&#xff08;搞清楚Options的用法&#xff09;2.1 概览2.2 详述2.2.0 Options&#xff08;一项都不勾选&#xff09;2.2.1 Use-Lombok【消除UserDO中的getter和setter代码】2.2.2 Comment&…

计算并输出1~100之间的所有带正负号交替的 2^n / n! 序列之和

#include <stdio.h> int main(){int sign1; // 记录当前项的符号&#xff0c;正负交替int n; // 循环变量&#xff0c;用于遍历1到100double sum0.0; // 记录总和 // 外层循环&#xff0c;遍历n从1到100 for(n1;n<100;n){ double nr1.0; // 记录当前项的分…

机电一体化系统设计学习笔记——检测传感技术

一、检测传感技术 1. 传感器的定义 传感器是一种用来感知、检测、测量并将环境中的物理量、化学量或生物量转换为可供人们识别或处理的电信号或其他形式的信号的器件或装置。 2.传感器的功能 感知与检测&#xff1a;传感器可以感知环境中的各种物理量、化学量或生物量&…

ChatGPT 在做什么,为什么有效?

原文&#xff1a;What Is ChatGPT Doing … and Why Does It Work? 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 序言 这本简短的书试图从第一原理解释 ChatGPT 是如何工作的。在某种程度上&#xff0c;这是关于技术的故事。但它也是关于科学的故事。以及关于哲学…

【软件架构学习】一、基本概念

【软件架构学习】一、基本概念 &#xff08;一&#xff09;系统与子系统&#xff08;二&#xff09;模块与组件*&#xff08;三&#xff09;框架与架构* &#xff08;一&#xff09;系统与子系统 系统 &#xff1a;泛指一群有关联的个体组成&#xff0c;根据某种规则运作&…

item_search-按关键字搜索淘宝商品:如何通过获取以下关键字、搜索类型、排序方式参数提升用户体验、优化营销策略、提高转化率

在淘宝购物的过程中&#xff0c;搜索功能无疑是用户与商品之间的重要桥梁。通过输入关键字&#xff0c;用户可以迅速找到所需的商品&#xff0c;而搜索结果的准确性和相关性则直接关系到用户的购物体验和满意度。因此&#xff0c;如何通过优化关键字、搜索类型和排序方式参数&a…

应急响应实战笔记04Windows实战篇(5)

第5篇&#xff1a;挖矿病毒&#xff08;一&#xff09; 0x00 前言 ​ 随着虚拟货币的疯狂炒作&#xff0c;挖矿病毒已经成为不法分子利用最为频繁的攻击方式之一。病毒传播者可以利用个人电脑或服务器进行挖矿&#xff0c;具体现象为电脑CPU占用率高&#xff0c;C盘可使用空间…

【最大正方形】

题目描述 在一个 n m n\times m nm 的只包含 0 0 0 和 1 1 1 的矩阵里找出一个不包含 0 0 0 的最大正方形&#xff0c;输出边长。 输入格式 输入文件第一行为两个整数 n , m ( 1 ≤ n , m ≤ 100 ) n,m(1\leq n,m\leq 100) n,m(1≤n,m≤100)&#xff0c;接下来 n n n…

解锁行业潜力:国内十大低代码平台全面盘点

在数字化转型的浪潮中&#xff0c;低代码开发平台以其快速开发、简化流程和降低技术门槛的优势&#xff0c;成为企业信息化建设的重要推手。 本篇文章将为您盘点十个低代码平台有&#xff1a;Zoho Creator、明道云、腾讯云低代码平台、华为云Astro、金蝶云苍穹、用友YonBuilder…

【ARM 嵌入式 C 文件操作系列 20.1 -- 从 A文件的 n 行开始 拷贝 m行到 B文件中】

请阅读【嵌入式开发学习必备专栏 】 文章目录 文件行拷贝根据行数大小设定拷贝方法拷贝每行固定字符个数的方式 文件行拷贝 从文件 a 中从第 n 行开始拷贝 m 行到文件 b 的函数&#xff0c;将需要使用标准库函数来读取和写入文件。以下是一个 file_copy_lines 函数实现&#x…

DO、DTO、BO、VO、PO、DAO、POJO

目录 一、DO、DTO、BO、VO、PO、DAO、POJO的概念 二、DO、DTO、BO、VO具体如何使用&#xff1f;代码详细说明 三、有没有其他类似的概念&#xff0c;比如POJO&#xff08;Plain Old Java Object&#xff09;&#xff1f;它们有什么区别&#xff1f; 四、在实际项目中&#…

[lesson05]引用的本质分析

引用的本质分析 引用的意义 引用作为变量别名而存在&#xff0c;因此在一些场合可以代替指针 引用相对于指针来说具有更好的可读性和实用性 注意&#xff1a; 函数中的引用形参不需要进行初始化&#xff01;&#xff01; 特殊的引用 const引用 在C中可以声明const引用 cons…

可能是最便宜的姿态传感器,国产三轴加速度计SC7A20

可能是最便宜的姿态传感器 三轴检测 批量参考价格&#xff1a;整盘单价&#xff1a;1.242&#xff0c;一个包装10K&#xff0c;希望厂家能出点数量少的包装&#xff0c;这一盘太多了&#xff1a;&#xff09; 特点 宽电压范围 1.71V-3.6V 1.8V 兼容数字 IO 口 低功耗模式下…

若依项目名、包名修改器

Updater.java import java.io.File; import java.util.*;public class Updater {public static void main(String[] args) {String projectPath"D:\\workspace\\idea\\RuoYi-Cloud-Plus-2.X";updateNames(new File(projectPath));}//需要改名的目录名称&#xff08;…

GNURadio 软件在windows环境下安装

一、软件下载 网址&#xff1a;InstallingGR - GNU Radio 我已经下载的软件安装包&#xff0c;radioconda-2024.01.26-Windows-x86_64.rar 网址&#xff1a;https://download.csdn.net/download/weixin_37728585/89082238 二、安装过程 所有用户均可以使用。 选择安装路径&a…

一文彻底搞清 Iterator(遍历器)概念及用法

目录 一、由来及意义 二、具体实现流程 三、具有默认 Iterator 接口的数据结构 四、调用 Iterator 接口的场合 五、总结 一、由来及意义 Javascript中表示“集合”的数据结构&#xff0c;主要是 Array、Object、Map、Set 这四种数据集合&#xff0c;除此之外&#xff0c;…

每日一题 --- 删除字符串中的所有相邻重复项[力扣][Go]

删除字符串中的所有相邻重复项 题目&#xff1a;1047. 删除字符串中的所有相邻重复项 给出由小写字母组成的字符串 S&#xff0c;重复项删除操作会选择两个相邻且相同的字母&#xff0c;并删除它们。 在 S 上反复执行重复项删除操作&#xff0c;直到无法继续删除。 在完成所…

JVM基础二——类的生命周期

加载阶段 &#xff1a; 连接阶段&#xff1a; 初始化阶段&#xff1a; 总结&#xff1a;