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

【sa-token】 sa-token非 web 上下文无法获取 HttpServletRequest。

Springboot cloud gateway集成sa-token中报错

cn.dev33.satoken.exception.NotWebContextException: 非 web 上下文无法获取 HttpServletRequestat cn.dev33.satoken.spring.SpringMVCUtil.getRequest(SpringMVCUtil.java:45) ~[sa-token-spring-boot-starter-1.38.0.jar:?]

官网解释:

在这里插入图片描述
跟着官网解释没有解决内容。

场景分析

集成了gateway,高版本得gateway是非阻塞式得,是拿不到上下文得根本原因。

特性阻塞式 Gateway非阻塞式 Gateway
底层框架Spring MVC,ServletSpring WebFlux,Netty/Undertow
线程模型每个请求一个线程,阻塞 I/O事件循环,少量线程,非阻塞 I/O
并发性能受线程池大小限制,高并发下线程耗尽风险高并发下更高效,适合 I/O 密集型任务
上下文对象HttpServletRequest, HttpServletResponseServerWebExchange
编程模型同步,命令式编程异步,反应式编程(Mono/Flux)
适用场景传统 Web 应用,I/O 操作简单高并发、微服务、I/O 密集型(如 API 网关)
生态兼容性兼容 Servlet 相关库(如 Sa-Token 默认配置)需适配 WebFlux(如 Sa-Token 的 Redis 存储)

解决方案

1:替换原有pom 为

<dependency><groupId>cn.dev33</groupId><artifactId>sa-token-reactor-spring-boot-starter</artifactId><version>1.43.0</version>
</dependency>

2:增加全局配置

/*** [Sa-Token 权限认证] 全局配置类 */
@Configuration
public class SaTokenConfigure {/*** 注册 [Sa-Token全局过滤器] */@Beanpublic SaReactorFilter getSaReactorFilter() {return new SaReactorFilter()// 指定 [拦截路由].addInclude("/**")    /* 拦截所有path */// 指定 [放行路由].addExclude("/favicon.ico")// 指定[认证函数]: 每次请求执行 .setAuth(obj -> {System.out.println("---------- sa全局认证");// SaRouter.match("/test/test", () -> StpUtil.checkLogin());
**加粗样式**                })// 指定[异常处理函数]:每次[认证函数]发生异常时执行此函数 .setError(e -> {System.out.println("---------- sa全局异常 ");return SaResult.error(e.getMessage());});}
}

3:测试

---------- sa全局认证
SA [INFO] -->: 账号 11111111 登录成功 (loginType=login), 会话凭证 token=27b235ff-efb4-4db6-9f91-b785a9884078

总结

请判断你的项目是 SpringMVC 环境还是 WebFlux 环境:
如果是 SpringMVC 环境就引入 sa-token-spring-boot-starter 依赖
如果是 WebFlux 环境就引入 sa-token-reactor-spring-boot-starter 依赖

如果你还无法分辨你是哪个环境,就看你的 pom.xml 依赖:
如果引入了spring-boot-starter-web就是 SpringMVC 环境。
如果引入了 spring-boot-starter-webflux 就是WebFlux环境。

http://www.lryc.cn/news/2394398.html

相关文章:

  • 论爱情《态度》
  • 多台电脑共用一个ip地址可以吗?会怎么样
  • 线程(上)【Linux操作系统】
  • FPGA中的“BPI“指什么
  • Splunk Validated Architecture (SVA):构建企业级可观测性与安全的基石
  • Python爬虫(40)基于Selenium与ScrapyRT构建高并发动态网页爬虫架构:原理、实现与性能优化
  • 深入解析 Python 字典:从基础到高级应用
  • 进程同步:生产者-消费者 题目
  • Linux轻量级文件传输——tftp命令
  • JavaSwing之--为组件添加背景
  • MySQL项目实战演练:搭建用户管理系统的完整数据库结构【MySQL系列】
  • 展会聚焦丨漫途科技亮相2025西北水务博览会!
  • 【数据结构初阶】顺序表的应用
  • 抽象工厂模式与策略模式结合使用小案例
  • C#数字图像处理(一)
  • 麻省理工新突破:家庭场景下机器人实现精准控制,real-to-sim-to-real学习助力
  • 从零实现本地语音识别(FunASR)
  • Vue 项目中 Sass 与 Less 的对比
  • Python爬虫实战:研究CherryPy库相关技术
  • 已解决:.NetCore控制台程序(WebAPI)假死,程序挂起接口不通
  • Excel如何分开查看工作表方便数据撰写
  • 微软技术赋能:解锁开发、交互与数据潜力,共探未来创新路
  • VR看房系统,新生代看房新体验
  • 【Linux笔记】Shell-脚本(下)|(常用命令详细版)
  • 钉钉热点实时推送助理-思路篇
  • RuoYi前后端分离框架实现前后端数据传输加密(一)之后端篇
  • 第七十篇 从餐厅后厨到电影院选座:生活场景拆解Java并发编程核心
  • 深入理解设计模式之代理模式
  • 8位单通道数据保存为JPG
  • 【Java实战】低侵入的线程池值传递