Skip to content

使用【快速调试】功能调用方法,StpUtil.isLogin()触发异常:SaTokenContext 上下文尚未初始化 #292

Description

@SongRenShuo

描述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)
Image

如何复现

  1. 解压demo文件,idea打开项目
  2. 调用com.pj.test.TestController#test2方法
  3. 查看报错信息

复现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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions