当前位置: 首页 > article >正文

SpringBoot中集成SaToken

SpringBoot中集成SaToken

  • 1. 写一个拦截器
  • 2. 对拦截器的说明&解释
  • 2. 拦截器

1. 写一个拦截器

import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** SaToken拦截器* <p>* 该类的作用是在请求处理前进行权限认证,以确保只有登录用户可以访问受保护的资源* 它通过实现HandlerInterceptor接口,使用Spring框架提供的拦截器机制来实现功能* <p>* href:https://sa-token.cc/doc.html#/**/
@Component
public class SaTokenInterceptor implements HandlerInterceptor {/*** 一键控制权限认证开关*/@Value("${sa-token.is-auth}")private boolean isAuth;/*** 在请求处理前进行权限认证* <p>* 如果权限认证开关打开,该方法会检查用户是否已登录** @param request  用于获取请求信息* @param response 用于向客户端返回信息* @param handler  当前处理请求的处理器* @return 如果权限认证通过或未启用权限认证,返回true,继续执行后续的请求处理;否则返回false,中断请求处理*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {if (isAuth) {try {// 如果权限认证开启,校验登录状态StpUtil.checkLogin();} catch (NotLoginException e) {// 捕获未登录或 Token 过期的异常,通知前端跳转response.setContentType("application/json;charset=UTF-8");// 这里设置4001 未授权response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);response.getWriter().write("{\"code\":4001, \"message\":\"未登录或登录已过期\", \"redirect\":\"/auth/inner-login\"}");return false;}}return true;}
}

saToken的pom依赖

   <!-- Sa-Token权限认证,在线文档:https://sa-token.cc --><dependency><groupId>cn.dev33</groupId><artifactId>sa-token-spring-boot-starter</artifactId><version>1.39.0</version></dependency>

application-dev.yml的配置

# 权限认证框架
sa-token:# 一键控制权限认证开关is-auth: truetoken-name: token# Token 有效期(秒)timeout: 2592000# 是否允许同一账号多地同时登录is-concurrent: true# token风格token-style: uuid# 是否输出操作日志is-log: true# 不读取cookie,防止Cookie帮你自动提交Tokenis-read-cookie: true

2. 对拦截器的说明&解释

这段代码定义了一个 SaTokenInterceptor 类,它是一个 Spring MVC 的拦截器,用于处理权限认证。拦截器的功能是确保只有已登录的用户能够访问某些受保护的资源。下面是对代码的详细解释:
1.导入的依赖

import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
  1. NotLoginException: 这是 Sa-Token 框架中的一个异常,表示用户没有登录或登录状态已过期。
  2. StpUtil: Sa-Token 提供的工具类,包含了处理登录、权限等功能的方法。
  3. @Value: 用于注入配置文件中的属性。
  4. HandlerInterceptor: Spring Web 提供的拦截器接口,用于在请求处理之前、之后或完成时进行拦截和处理。

2.SaTokenInterceptor 类的声明

@Component
public class SaTokenInterceptor implements HandlerInterceptor
  • @Component: 该注解使得 SaTokenInterceptor 成为 Spring 容器管理的 Bean,能够自动注入到 Spring 的上下文中。
  • 实现 HandlerInterceptor 接口: 通过实现 preHandle 方法,我们可以在请求被处理前进行认证。

3.成员变量:权限开关

@Value("${sa-token.is-auth}")
private boolean isAuth;
  • @Value("${sa-token.is-auth}"): 从 application.propertiesapplication.yml 配置文件中读取 sa-token.is-auth 的值并赋给 isAuth。该配置项控制是否启用权限认证。
  • 如果 isAuth 为 true,则进行权限认证。
  • 如果 isAuth 为 false,则跳过权限认证。

4.preHandle 方法:请求前权限认证

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {if (isAuth) {try {// 如果权限认证开启,校验登录状态StpUtil.checkLogin();} catch (NotLoginException e) {// 捕获未登录或 Token 过期的异常,通知前端跳转response.setContentType("application/json;charset=UTF-8");// 这里设置4001 未授权response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);response.getWriter().write("{\"code\":4001, \"message\":\"未登录或登录已过期\", \"redirect\":\"/auth/inner-login\"}");return false;}}return true;
}
  • preHandle 方法: 这是HandlerInterceptor接口中的一个方法,它在请求处理之前被调用。它可以用来做权限认证、日志记录等操作。如果返回 true,请求会继续向下执行;如果返回 false,则请求会被中断。

2. 拦截器

当然配置了权限肯定也要配置拦截器

import cn.ac.ict.knowledge.graph.common.interceptor.SaTokenInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {/*** 自动注入SaTokenInterceptor,用于拦截请求进行权限验证等操作*/@Autowiredprivate SaTokenInterceptor saTokenInterceptor;/*** 添加拦截器配置* 此方法用于向Spring MVC框架注册拦截器,并指定拦截器的拦截路径** @param registry 拦截器注册器,用于注册自定义拦截器*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 除登陆、注册接口,拦截所有接口registry.addInterceptor(saTokenInterceptor).addPathPatterns("/**").excludePathPatterns("/auth/inner-login","/auth/inner-update","/menu/get","/swagger-ui.html","/v3/api-docs/**","/swagger-resources/**","/webjars/**","/doc.html","/v*/api-docs**");}
}

其实上面应该也要根据是否开启权限判断,是否使用拦截器

 if (isAuth) {  // 根据配置判断是否启用拦截器registry.addInterceptor(saTokenInterceptor).addPathPatterns("/**").excludePathPatterns("/auth/inner-login", "/auth/inner-update", "/menu/get", "/swagger-ui.html", "/v3/api-docs/**", "/swagger-resources/**", "/webjars/**", "/doc.html", "/v*/api-docs**");}

相关文章:

SpringBoot中集成SaToken

SpringBoot中集成SaToken 1. 写一个拦截器2. 对拦截器的说明&解释2. 拦截器 1. 写一个拦截器 import cn.dev33.satoken.exception.NotLoginException; import cn.dev33.satoken.stp.StpUtil; import org.springframework.beans.factory.annotation.Value; import org.spri…...

网络安全-攻击流程-应用层

应用层攻击针对OSI模型的第七层&#xff08;应用层&#xff09;&#xff0c;主要利用协议漏洞、业务逻辑缺陷或用户交互弱点&#xff0c;直接威胁Web应用、API、数据库等服务。以下是常见应用层攻击类型及其流程&#xff0c;以及防御措施&#xff1a; 1. SQL注入&#xff08;SQ…...

Ubuntu 24.04.1 LTS 本地部署 DeepSeek 私有化知识库

文章目录 前言工具介绍与作用工具的关联与协同工作必要性分析 1、DeepSeek 简介1.1、DeepSeek-R1 硬件要求 2、Linux 环境说明2.1、最小部署&#xff08;Ollama DeepSeek&#xff09;2.1.1、扩展&#xff08;非必须&#xff09; - Ollama 后台运行、开机自启&#xff1a; 2.2、…...

微信小程序中缓存数据全方位解惑

微信小程序中缓存数据全方位解惑 微信小程序中的数据缓存是提升用户体验和优化性能的重要手段&#xff0c;跟电脑浏览器中的Local Storage的性质一样。以下是关于微信小程序数据缓存的相关知识点和示例的详细介绍&#xff1a; 1. 数据缓存的类型 微信小程序提供了两种数据缓…...

python语言进阶之函数

目录 前言 函数的创建和调用 函数创建 调用函数 参数传递 形式参数和实际参数 位置参数 数量必须与定义时一致 位置必须与定义时一致 关键字参数 为参数设置默认值 可变参数 **parameter 返回值 变量的作用域 局部变量 全局变量 匿名函数 前言 提到函数&…...

Mybatis-扩展功能

逻辑删除乐观锁 MyBatisPlus从入门到精通-3&#xff08;含mp代码生成器&#xff09; Db静态工具类 Spring依赖循环问题 代码生成器 MybatisPlus代码生成器 枚举处理器 我们这里用int来存储状态 需要注解&#xff0c;很不灵活 希望用枚举类来代替这个Integer 这样的话我…...

青少年编程与数学 02-009 Django 5 Web 编程 16课题、权限管理

青少年编程与数学 02-009 Django 5 Web 编程 16课题、权限管理 一、授权授权的主要特点和作用授权的类型应用场景 二、权限系统使用Django内置的权限系统使用组管理权限使用第三方库在视图中应用权限 三、权限管理示例步骤 1: 创建Django项目和应用步骤 2: 定义模型和权限步骤 …...

Baklib知识中台构建企业智能运营核心架构

内容概要 在数字化转型的浪潮中&#xff0c;企业对于知识的系统化管理需求日益迫切。Baklib作为新一代的知识中台&#xff0c;通过构建智能运营核心架构&#xff0c;为企业提供了一套从知识汇聚到场景化落地的完整解决方案。其核心价值在于将分散的知识资源整合为统一的资产池…...

Java爬虫获取1688商品搜索API接口的实现指南

在电商数据分析、市场调研以及商品选品等领域&#xff0c;按关键字搜索1688商品并获取相关数据是一项重要的任务。本文将详细介绍如何使用Java爬虫技术&#xff0c;通过1688的API接口按关键字搜索商品&#xff0c;并解析返回的数据。以下是实现的完整步骤和代码示例。 一、前期…...

Ubuntu启动geteck/jetlinks实战:Docker启动

参考&#xff1a; JetLinks 物联网基础平台 安装Docker Ubuntu下载安装Docker-Desktop-CSDN博客 sudo apt install -y docker-compose 下载源码 # github亦可 git clone https://gitee.com/jetlinks/jetlinks-community.git cd jetlinks-community 启动 cd docker/run-a…...

保姆级GitHub大文件(100mb-2gb)上传教程

GLF&#xff08;Git Large File Storage&#xff09;安装使用 使用GitHub desktop上传大于100mb的文件时报错 The following files are over 100MB. lf you commit these files, you will no longer beable to push this repository to GitHub.com.term.rarWe recommend you a…...

【16届蓝桥杯寒假刷题营】第2期DAY1I

4.有向无环的路径数 - 蓝桥云课 问题描述 给定 N 个节点 M 条边的有向无环图&#xff0c;请你求解有多少条 1 到 N 的路径。 由于答案可能很大&#xff0c;你只需要输出答案对 998244353 取模后的结果。 输入格式 第一行包含 2 个正整数 N,M&#xff0c;表示有向无环图的节…...

WEB安全--SQL注入--PDO与绕过

一、PDO介绍&#xff1a; 1.1、原理&#xff1a; PDO支持使用预处理语句&#xff08;Prepared Statements&#xff09;&#xff0c;这可以有效防止SQL注入攻击。预处理语句将SQL语句与数据分开处理&#xff0c;使得用户输入的数据始终作为参数传递给数据库&#xff0c;而不会直…...

SQL与数据库程序设计

1.1986年&#xff0c;10月美国国家标准局颁布了SQL语言的美国标准&#xff0c;称为SQL86 2.SQL(Structured Query Language)又称为结构化查询语言 3.建立索引的主要目的是加快查找的速度 4.在基本表上建立一个或者多个索引 5. 一个基本表是最多只能建立一个聚簇索引 6.CAL…...

软考高级《系统架构设计师》知识点(五)

计算机网络 网络概述和模型 计算机网络是计算机技术与通信技术相结合的产物&#xff0c;它实现了远程通信、远程信息处理和资源共享。 计算机网络的功能&#xff1a;数据通信、资源共享、管理集中化、实现分布式处理、负载均衡。 网络性能指标&#xff1a;速率、带宽(频带宽度或…...

DeepSeek 助力 Vue 开发:打造丝滑的面包屑导航(Breadcrumbs)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…...

Ubuntu 系统 LVM 逻辑卷扩容教程

Ubuntu 系统 LVM 逻辑卷扩容教程 前言 在 Linux 系统中&#xff0c;LVM&#xff08;Logical Volume Manager&#xff09;是一种逻辑卷管理工具&#xff0c;允许管理员动态调整磁盘空间&#xff0c;而无需重启系统。 本文将详细介绍如何使用 LVM 扩容逻辑卷&#xff0c;以实现…...

美团一面,有点难度。

一位粉丝朋友分享了最近参与美团民宿旅游业务线的一面的经历&#xff0c;全程约1小时&#xff0c;面试官围绕高并发、分布式事务、性能优化等高频考点展开追问&#xff0c;问题密集且注重落地细节。以下是完整问题整理回答思路扩展解析&#xff0c;助你避坑&#xff01; 一、项…...

7-Zip Final绿色版:高效压缩解压缩工具

在工作与学习旅程中&#xff0c;我们时常需要与各式各样的文件和文件夹打交道。为了更有效地利用存储空间或促进文件的便捷传输&#xff0c;压缩与解压工具自然而然地成为了我们不可或缺的助手。在众多同类工具中&#xff0c;7-Zip凭借其高效能、免费及开源的特性&#xff0c;深…...

详解如何使用Pytest内置Fixture tmp_path 管理临时文件

关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理&#xff0c;构建成功的基石 在自动化测试工作之前&#xff0c;你应该知道的10条建议 在自动化测试中&#xff0c;重要的不是工具 临时目录在测试中起着至关重要的作用&#xff0c;它为执行和验证代码提供了一个可控…...

QML使用ChartView绘制饼状图

一、工程配置 首先修改CMakeLists.txt&#xff0c;按下图修改&#xff1a; find_package(Qt6 6.4 REQUIRED COMPONENTS Quick Widgets) PRIVATEtarget_link_libraries(appuntitledPRIVATE Qt6::QuickPRIVATE Qt6::Widgets )其次修改main.cpp&#xff0c;按下图修改&#xff…...

用大模型学大模型03-数学基础 概率论 最大似然估计(MLE)最大后验估计(MAP)

https://metaso.cn/s/r4kq4Ni 什么是最大似然估计&#xff08;MLE&#xff09;最大后验估计&#xff08;MAP&#xff09;&#xff1f;深度学习中如何应用&#xff0c;举例说明。 好的&#xff0c;我现在需要回答关于最大似然估计&#xff08;MLE&#xff09;和最大后验估计&…...

Rust学习总结之结构体(一)

一&#xff1a;结构体定义 定义结构体&#xff0c;需要使用 struct 关键字并为整个结构体提供一个名字。结构体的名字需要描述它所组合的数据的意义。接着&#xff0c;在大括号中&#xff0c;定义每一部分数据的名字和类型&#xff0c;我们称为 字段&#xff08;field&#xf…...

【Android开发】华为手机安装包安装失败“应用是非正式版发布版本,当前设备不支持安装”问题解决

问题描述 我们将Debug版本的安装包发送到手机上安装&#xff0c;会发现华为手机有如下情况 解决办法 在文件gradle.properties中粘贴代码&#xff1a; android.injected.testOnlyfalse 最后点击“Sync now”&#xff0c;等待重新加载gradle资源即可 后面我们重新编译Debug安装…...

Ubuntu添加桌面快捷方式

以idea为例 一. 背景 在ubuntu中&#xff0c;很多时候是自己解压的文件并没有桌面快捷方式&#xff0c;需要自己找到对应的目录的执行文件手动打开&#xff0c;很麻烦 而只需要在 /usr/share/applications 中创建自定义的desktop文件就能自动复制到桌面 二. 添加方法 创建desk…...

day09_实时类标签/指标

文章目录 day09_实时类标签/指标一、日志数据实时采集2、Flume简介2.3 项目日志数据采集Flume配置2.3.1 涉及的Flume组件和参数2.3.2 Nginx日志采集2.3.3 用户行为日志采集 二、Nginx日志数据统计1、日志格式说明2、数据ETL2.1 日志抽取2.1.1 正则表达式2.1.2 基于Spark实现Ngi…...

排序算法的魔法世界:用C语言揭开数据排列的奥秘

当数据开始跳集体舞:排序的意义 想象你面前有一群调皮的数字精灵在开派对,7和3在跳探戈,9和1在玩捉迷藏,5和2在抢蛋糕。这时候就需要排序算法这位神奇的派对管家出场了!它像音乐指挥家一样挥动魔棒,让所有数字精灵乖乖排成整齐的队伍。在计算机的世界里,排序算法就是处…...

网页模板免费HTML源码 HTML网页设计模板

在现代网站开发中&#xff0c;拥有一个美观且功能齐全的网页模板是至关重要的。对于许多开发者和设计师来说&#xff0c;获取高质量的免费HTML源码和网页设计模板可以大大简化开发流程。本文将探讨网页模板免费HTML源码的资源、优势以及如何有效利用这些模板。 什么是网页模板…...

Python实现语音识别详细教程【2025】最新教程

文章目录 前言一、环境搭建1. 下载 Python2. 安装 Python3 使用 pip 安装必要的库 二、使用 SpeechRecognition 库进行语音识别1.识别本地音频文件2.实时语音识别3. 使用其他语音识别引擎 注意事项 前言 以下是一份较为完整的 Python 语音识别教程&#xff0c;涵盖环境搭建、使…...

与传统光伏相比 城电科技的光伏太阳花有什么优势?

相比于传统光伏&#xff0c;城电科技的光伏太阳花有以下优势&#xff1a; 一、发电效率方面 智能追踪技术&#xff1a;光伏太阳花通过内置的智能追踪系统&#xff0c;采用全球定位跟踪算法&#xff0c;能够实时调整花瓣&#xff08;即光伏板&#xff09;的角度&#xff0c;确…...