描述bug内容
使用【快速调试】功能调用方法,StpUtil.isLogin()触发异常:SaTokenContext 上下文尚未初始化
版本信息
- DebugTools版本: [e.g. 5.0.1]
- bug中间件的版本: [e.g. sa-token: 1.45.0]
日志信息
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:2847)
at cn.dev33.satoken.stp.StpLogic.getLoginIdDefaultNull(StpLogic.java:1170)
at cn.dev33.satoken.stp.StpLogic.isLogin(StpLogic.java:1070)
at cn.dev33.satoken.stp.StpUtil.isLogin(StpUtil.java:460)
at com.pj.test.TestController.test2(TestController.java:74)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at io.github.future0923.debug.tools.server.netty.handler.RunTargetMethodRequestHandler.run(RunTargetMethodRequestHandler.java:191)
at io.github.future0923.debug.tools.server.netty.handler.RunTargetMethodRequestHandler.handle(RunTargetMethodRequestHandler.java:156)
at io.github.future0923.debug.tools.server.netty.handler.RunTargetMethodRequestHandler.handle(RunTargetMethodRequestHandler.java:51)
at io.github.future0923.debug.tools.server.netty.dispatcher.ServerPacketDispatcher.dispatch(ServerPacketDispatcher.java:62)
at io.github.future0923.debug.tools.server.netty.dispatcher.ServerDispatchHandler.lambda$channelRead0$0(ServerDispatchHandler.java:61)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
如何复现
- 解压demo文件,idea打开项目
- 调用com.pj.test.TestController#test2方法
- 查看报错信息
复现demo文件
sa-token-demo-test.zip
当前解决方案
使用前置脚本初始化上下文
package io.github.future0923.debug.tools.base.around;
import cn.dev33.satoken.context.mock.SaTokenContextMockUtil;
import cn.dev33.satoken.servlet.util.SaTokenContextServletUtil;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.stp.parameter.SaLoginParameter;
import cn.dev33.satoken.util.SaFoxUtil;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.util.Date;
import java.util.List;
import java.util.Map;
public class RunMethodAround {
public void onBefore(Map<String, String> headers, String xxlJobParam, String className, String methodName, List<String> methodParameterTypes, Object[] methodParameters) {
Connector connector = new Connector();
connector.setMaxParameterCount(0);
connector.setParseBodyMethods("GET");
Request request = new Request(connector);
org.apache.coyote.Request request1 = new org.apache.coyote.Request();
request.setCoyoteRequest(request1);
Response response = new Response();
org.apache.coyote.Response response1 = new org.apache.coyote.Response();
response.setCoyoteResponse(response1);
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request, response));
// 关键点
SaTokenContextServletUtil.setContext(request,response);
// 如果是boot3 用
// SaTokenContextJakartaServletUtil.setContext(request, response);
// 调用登录方法 可通过applicationContext.getBean()获取到userService直接调用登录方法
StpUtil.login(10001, new SaLoginParameter()
.setIsConcurrent(true)
.setIsShare(false)
// .setDeviceType(dt)
.setMaxLoginCount(4)
.setMaxTryTimes(12)
.setTerminalExtra("deviceSimpleTitle", "XiaoMi 15 Ultra")
.setTerminalExtra("loginAddress", "浙江省杭州市西湖区")
.setTerminalExtra("loginIp", "127.0.0.1")
.setTerminalExtra("loginTime", SaFoxUtil.formatDate(new Date()))
);
StpUtil.getTokenSession();
}
public void onAfter(Map<String, String> headers, String xxlJobParam, String className, String methodName, List<String> methodParameterTypes, Object[] methodParameters, Object result) {
}
public void onException(Map<String, String> headers, String xxlJobParam, String className, String methodName, List<String> methodParameterTypes, Object[] methodParameters, Throwable throwable) {
}
public void onFinally(Map<String, String> headers, String xxlJobParam, String className, String methodName, List<String> methodParameterTypes, Object[] methodParameters, Object result, Throwable throwable) {
}
}
SaToken官方相关文档
https://sa-token.cc/doc.html#/fun/sa-token-context?id=%e8%87%aa%e5%ae%9a%e4%b9%89-satokencontext-%e6%8c%87%e5%8d%97
https://sa-token.cc/doc.html#/fun/async--mock
描述bug内容
使用【快速调试】功能调用方法,StpUtil.isLogin()触发异常:SaTokenContext 上下文尚未初始化
版本信息
日志信息
如何复现
复现demo文件
sa-token-demo-test.zip
当前解决方案
使用前置脚本初始化上下文
SaToken官方相关文档
https://sa-token.cc/doc.html#/fun/sa-token-context?id=%e8%87%aa%e5%ae%9a%e4%b9%89-satokencontext-%e6%8c%87%e5%8d%97
https://sa-token.cc/doc.html#/fun/async--mock