【sa-token】 sa-token非 web 上下文无法获取 HttpServletRequest。_非web上下文无法获取request
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是非阻塞式得,是拿不到上下文得根本原因。
解决方案
1:替换原有pom 为
<dependency> <groupId>cn.dev33</groupId> <artifactId>sa-token-reactor-spring-boot-starter</artifactId> <version>1.43.0</version></dependency>
2:增加全局配置
/** * [Sa-Token 权限认证] 全局配置类 */@Configurationpublic 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环境。