springboot sse显示 SaTokenContext 上下文尚未初始化
使用版本:
1.42.0
报错信息:
2025-04-27 15:21:19 [http-nio-8083-exec-21] ERROR org.apache.catalina.core.ContainerBase.[Tomcat].[localhost] - Exception Processing [ErrorPage[errorCode=0, location=/error]] jakarta.servlet.ServletException: Request processing failed: cn.dev33.satoken.exception.SaTokenContextException: SaTokenContext 上下文尚未初始化 at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1022) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:633) at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:511) at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:454) at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:361) at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:208) at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:285) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:149) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:239) at org.apache.coyote.AbstractProcessor.dispatch(AbstractProcessor.java:243) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:57) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:905) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1743) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) at java.base/java.lang.Thread.run(Thread.java:1583) Caused by: cn.dev33.satoken.exception.SaTokenContextException: SaTokenContext 上下文尚未初始化 at cn.dev33.satoken.context.SaTokenContextForThreadLocalStaff.getModelBox(SaTokenContextForThreadLocalStaff.java:73) at cn.dev33.satoken.context.SaTokenContextForThreadLocal.getModelBox(SaTokenContextForThreadLocal.java:55) at cn.dev33.satoken.context.SaTokenContext.getStorage(SaTokenContext.java:86) at cn.dev33.satoken.context.SaHolder.getStorage(SaHolder.java:69) at cn.dev33.satoken.stp.StpLogic.isSwitch(StpLogic.java:2786) at cn.dev33.satoken.stp.StpLogic.getLoginId(StpLogic.java:1078) at cn.dev33.satoken.stp.StpLogic.checkLogin(StpLogic.java:1067) at cn.dev33.satoken.stp.StpUtil.checkLogin(StpUtil.java:476) at com.cst.auth.config.SaTokenConfigure.lambda$addInterceptors$0(SaTokenConfigure.java:22) at cn.dev33.satoken.interceptor.SaInterceptor.preHandle(SaInterceptor.java:102) at org.springframework.web.servlet.HandlerExecutionChain.applyPreHandle(HandlerExecutionChain.java:146) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1084) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ... 35 common frames omitted
希望结果:
没有异常
复现步骤:
sse消息导致的问题,在前面的版本中没有这个问题,只有此版本有这个问题
< 备注:如果复现步骤比较复杂,请将 demo 上传到 gitee 并留下地址 >
参考一下:https://github.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sse/
我的websocket 也出出问题了,@MessageMapping("/reader/{id}") 方法里调用远程dubbo服务就报错cn.dev33.satoken.exception.SaTokenContextException: SaTokenContext 上下文尚未初始化
直接在 @MessageMapping 方法里调用 SaHolder.getContext().request 就过不去
@click33 按照你的示例检查了,还是会出现问题,一样显示上下文未初始化
+1 我也需要了。我是springboot的项目。返回使用sse。版本是1.42的还是会出现这个。虽然不影响功能。但是会报错。
已解决 参考如下:https://gitee.com/dromara/sa-token/issues/IC4XFE
spring 的 sse 会进入两次拦截器 请求时候进入一次是REQUEST,sse关闭的时候还会在进入一次ASYNC,报错就是在第二次ASYNC进入拦截器的时候。 主要是sa token自动注册的filter默认不拦截 ASYNC 的请求。
修改思路:要么拦截器排除ASYNC请求,要么fitler拦截ASYNC请求。
/// 拦截器排除
registry.addInterceptor(new SaInterceptor(handle -> {
if (request.getDispatcherType() == DispatcherType.REQUEST) {
StpUtil.checkLogin();
}
}))
.addPathPatterns("/**")