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

发布于:2025-05-31 ⋅ 阅读:(25) ⋅ 点赞:(0)

Springboot cloud gateway集成sa-token中报错

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

官网解释:

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

场景分析

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

特性 阻塞式 Gateway 非阻塞式 Gateway
底层框架 Spring MVC,Servlet Spring WebFlux,Netty/Undertow
线程模型 每个请求一个线程,阻塞 I/O 事件循环,少量线程,非阻塞 I/O
并发性能 受线程池大小限制,高并发下线程耗尽风险 高并发下更高效,适合 I/O 密集型任务
上下文对象 HttpServletRequest, HttpServletResponse ServerWebExchange
编程模型 同步,命令式编程 异步,反应式编程(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全局过滤器] 
     */
    @Bean
    public 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环境。