gitextract_sl8kal2d/ ├── .agents/ │ └── skills/ │ ├── README.md │ ├── commit-message/ │ │ ├── SKILL.md │ │ ├── examples.md │ │ └── reference.md │ ├── organize-update-log/ │ │ ├── SKILL.md │ │ └── format-reference.md │ ├── remove-redundancy-import/ │ │ ├── SKILL.md │ │ ├── reference.md │ │ └── scan_redundant_imports.py │ └── upgrade-version/ │ └── SKILL.md ├── .gitee/ │ └── ISSUE_TEMPLATE.md ├── .github/ │ └── ISSUE_TEMPLATE/ │ ├── bug反馈.md │ ├── 功能提问.md │ ├── 建议增加新功能.md │ └── 预期不符.md ├── .gitignore ├── LICENSE ├── MEMO/ │ ├── 1--统一定义properties尝试失败.md │ ├── 2--2026-3-1_诡异调试记录.txt │ └── 3--sa-token_最新版所有依赖.txt ├── README.md ├── mvn clean.bat ├── mvn test.bat ├── pom.xml ├── preview-doc.bat ├── sa-token-bom/ │ └── pom.xml ├── sa-token-core/ │ ├── pom.xml │ └── src/ │ └── main/ │ └── java/ │ └── cn/ │ └── dev33/ │ └── satoken/ │ ├── SaManager.java │ ├── annotation/ │ │ ├── SaCheckDisable.java │ │ ├── SaCheckHttpBasic.java │ │ ├── SaCheckHttpDigest.java │ │ ├── SaCheckLogin.java │ │ ├── SaCheckOr.java │ │ ├── SaCheckPermission.java │ │ ├── SaCheckRole.java │ │ ├── SaCheckSafe.java │ │ ├── SaIgnore.java │ │ ├── SaMode.java │ │ └── handler/ │ │ ├── SaAnnotationHandlerInterface.java │ │ ├── SaCheckDisableHandler.java │ │ ├── SaCheckHttpBasicHandler.java │ │ ├── SaCheckHttpDigestHandler.java │ │ ├── SaCheckLoginHandler.java │ │ ├── SaCheckOrHandler.java │ │ ├── SaCheckPermissionHandler.java │ │ ├── SaCheckRoleHandler.java │ │ ├── SaCheckSafeHandler.java │ │ └── SaIgnoreHandler.java │ ├── application/ │ │ ├── ApplicationInfo.java │ │ ├── SaApplication.java │ │ ├── SaGetValueInterface.java │ │ └── SaSetValueInterface.java │ ├── config/ │ │ ├── SaCookieConfig.java │ │ ├── SaTokenConfig.java │ │ └── SaTokenConfigFactory.java │ ├── context/ │ │ ├── SaHolder.java │ │ ├── SaTokenContext.java │ │ ├── SaTokenContextDefaultImpl.java │ │ ├── SaTokenContextForReadOnly.java │ │ ├── SaTokenContextForThreadLocal.java │ │ ├── SaTokenContextForThreadLocalStaff.java │ │ ├── mock/ │ │ │ ├── SaRequestForMock.java │ │ │ ├── SaResponseForMock.java │ │ │ ├── SaStorageForMock.java │ │ │ └── SaTokenContextMockUtil.java │ │ └── model/ │ │ ├── SaCookie.java │ │ ├── SaRequest.java │ │ ├── SaResponse.java │ │ ├── SaStorage.java │ │ ├── SaTokenContextModelBox.java │ │ └── package-info.java │ ├── dao/ │ │ ├── SaTokenDao.java │ │ ├── SaTokenDaoDefaultImpl.java │ │ ├── auto/ │ │ │ ├── SaTokenDaoByObjectFollowString.java │ │ │ ├── SaTokenDaoBySessionFollowObject.java │ │ │ └── SaTokenDaoByStringFollowObject.java │ │ └── timedcache/ │ │ ├── SaMapPackage.java │ │ ├── SaMapPackageForConcurrentHashMap.java │ │ └── SaTimedCache.java │ ├── error/ │ │ └── SaErrorCode.java │ ├── exception/ │ │ ├── ApiDisabledException.java │ │ ├── BackResultException.java │ │ ├── DisableServiceException.java │ │ ├── FirewallCheckException.java │ │ ├── InvalidContextException.java │ │ ├── NotHttpBasicAuthException.java │ │ ├── NotHttpDigestAuthException.java │ │ ├── NotImplException.java │ │ ├── NotLoginException.java │ │ ├── NotPermissionException.java │ │ ├── NotRoleException.java │ │ ├── NotSafeException.java │ │ ├── NotWebContextException.java │ │ ├── RequestPathInvalidException.java │ │ ├── SaJsonConvertException.java │ │ ├── SaTokenContextException.java │ │ ├── SaTokenException.java │ │ ├── SaTokenPluginException.java │ │ ├── SameTokenInvalidException.java │ │ ├── StopMatchException.java │ │ └── TotpAuthException.java │ ├── filter/ │ │ ├── SaFilter.java │ │ ├── SaFilterAuthStrategy.java │ │ └── SaFilterErrorStrategy.java │ ├── fun/ │ │ ├── IsRunFunction.java │ │ ├── SaFunction.java │ │ ├── SaParamFunction.java │ │ ├── SaParamRetFunction.java │ │ ├── SaRetFunction.java │ │ ├── SaRetGenericFunction.java │ │ ├── SaRouteFunction.java │ │ ├── SaTwoParamFunction.java │ │ ├── hooks/ │ │ │ └── SaTokenPluginHookFunction.java │ │ └── strategy/ │ │ ├── SaAutoRenewFunction.java │ │ ├── SaCheckELRootMapExtendFunction.java │ │ ├── SaCheckElementAnnotationFunction.java │ │ ├── SaCheckMethodAnnotationFunction.java │ │ ├── SaCheckOrAnnotationFunction.java │ │ ├── SaCorsHandleFunction.java │ │ ├── SaCreateSessionFunction.java │ │ ├── SaCreateStpLogicFunction.java │ │ ├── SaCreateTokenFunction.java │ │ ├── SaFirewallCheckFailHandleFunction.java │ │ ├── SaFirewallCheckFunction.java │ │ ├── SaGenerateUniqueTokenFunction.java │ │ ├── SaGetAnnotationFunction.java │ │ ├── SaHasElementFunction.java │ │ ├── SaIsAnnotationPresentFunction.java │ │ └── SaRouteMatchFunction.java │ ├── http/ │ │ ├── SaHttpTemplate.java │ │ ├── SaHttpTemplateDefaultImpl.java │ │ └── SaHttpUtil.java │ ├── httpauth/ │ │ ├── basic/ │ │ │ ├── SaHttpBasicAccount.java │ │ │ ├── SaHttpBasicTemplate.java │ │ │ └── SaHttpBasicUtil.java │ │ └── digest/ │ │ ├── SaHttpDigestModel.java │ │ ├── SaHttpDigestTemplate.java │ │ └── SaHttpDigestUtil.java │ ├── json/ │ │ ├── SaJsonTemplate.java │ │ └── SaJsonTemplateDefaultImpl.java │ ├── listener/ │ │ ├── SaTokenEventCenter.java │ │ ├── SaTokenListener.java │ │ ├── SaTokenListenerForLog.java │ │ └── SaTokenListenerForSimple.java │ ├── log/ │ │ ├── SaLog.java │ │ └── SaLogForConsole.java │ ├── model/ │ │ └── wrapperInfo/ │ │ └── SaDisableWrapperInfo.java │ ├── plugin/ │ │ ├── SaTokenPlugin.java │ │ ├── SaTokenPluginHolder.java │ │ └── SaTokenPluginHookModel.java │ ├── router/ │ │ ├── SaHttpMethod.java │ │ ├── SaRouter.java │ │ └── SaRouterStaff.java │ ├── same/ │ │ ├── SaSameTemplate.java │ │ └── SaSameUtil.java │ ├── secure/ │ │ ├── BCrypt.java │ │ ├── SaBase32Util.java │ │ ├── SaBase64Util.java │ │ ├── SaSecureUtil.java │ │ └── totp/ │ │ ├── SaTotpTemplate.java │ │ └── SaTotpUtil.java │ ├── serializer/ │ │ ├── SaSerializerTemplate.java │ │ └── impl/ │ │ ├── SaSerializerTemplateForJdk.java │ │ ├── SaSerializerTemplateForJdkUseBase64.java │ │ ├── SaSerializerTemplateForJdkUseHex.java │ │ ├── SaSerializerTemplateForJdkUseISO_8859_1.java │ │ └── SaSerializerTemplateForJson.java │ ├── session/ │ │ ├── SaSession.java │ │ ├── SaSessionCustomUtil.java │ │ ├── SaTerminalInfo.java │ │ └── raw/ │ │ ├── SaRawSessionDelegator.java │ │ └── SaRawSessionUtil.java │ ├── stp/ │ │ ├── SaLoginConfig.java │ │ ├── SaLoginModel.java │ │ ├── SaTokenInfo.java │ │ ├── StpInterface.java │ │ ├── StpInterfaceDefaultImpl.java │ │ ├── StpLogic.java │ │ ├── StpUtil.java │ │ └── parameter/ │ │ ├── SaLoginParameter.java │ │ ├── SaLogoutParameter.java │ │ └── enums/ │ │ ├── SaLogoutMode.java │ │ ├── SaLogoutRange.java │ │ ├── SaReplacedLoginExitMode.java │ │ └── SaReplacedRange.java │ ├── strategy/ │ │ ├── SaAnnotationStrategy.java │ │ ├── SaFirewallStrategy.java │ │ ├── SaStrategy.java │ │ └── hooks/ │ │ ├── SaFirewallCheckHook.java │ │ ├── SaFirewallCheckHookForBlackPath.java │ │ ├── SaFirewallCheckHookForDirectoryTraversal.java │ │ ├── SaFirewallCheckHookForHeader.java │ │ ├── SaFirewallCheckHookForHost.java │ │ ├── SaFirewallCheckHookForHttpMethod.java │ │ ├── SaFirewallCheckHookForParameter.java │ │ ├── SaFirewallCheckHookForPathBannedCharacter.java │ │ ├── SaFirewallCheckHookForPathDangerCharacter.java │ │ └── SaFirewallCheckHookForWhitePath.java │ ├── temp/ │ │ ├── SaTempTemplate.java │ │ └── SaTempUtil.java │ └── util/ │ ├── SaFoxUtil.java │ ├── SaHexUtil.java │ ├── SaResult.java │ ├── SaSugar.java │ ├── SaTokenConsts.java │ ├── SaTtlMethods.java │ ├── SaValue2Box.java │ └── StrFormatter.java ├── sa-token-demo/ │ ├── pom.xml │ ├── sa-token-demo-alone-redis/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaTokenAloneRedisApplication.java │ │ │ └── test/ │ │ │ ├── AjaxJson.java │ │ │ └── TestController.java │ │ └── resources/ │ │ └── application.yml │ ├── sa-token-demo-alone-redis-cluster/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaTokenAloneRedisClusterApplication.java │ │ │ └── test/ │ │ │ ├── AjaxJson.java │ │ │ └── TestController.java │ │ └── resources/ │ │ ├── application.yml │ │ └── application_sentinel.yml │ ├── sa-token-demo-alone-redis-sb4/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaTokenAloneRedisSb4Application.java │ │ │ └── test/ │ │ │ └── TestController.java │ │ └── resources/ │ │ └── application.yml │ ├── sa-token-demo-apikey/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaTokenApiKeyApplication.java │ │ │ ├── mock/ │ │ │ │ ├── SaApiKeyDataLoaderImpl.java │ │ │ │ └── SaApiKeyMockMapper.java │ │ │ ├── satoken/ │ │ │ │ ├── GlobalException.java │ │ │ │ └── SaTokenConfigure.java │ │ │ └── test/ │ │ │ ├── ApiKeyController.java │ │ │ ├── ApiKeyResourcesController.java │ │ │ └── LoginController.java │ │ └── resources/ │ │ ├── application.yml │ │ └── static/ │ │ ├── common.js │ │ └── index.html │ ├── sa-token-demo-async/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaTokenAsyncApplication.java │ │ │ ├── current/ │ │ │ │ └── GlobalException.java │ │ │ ├── satoken/ │ │ │ │ └── SaTokenConfigure.java │ │ │ └── test/ │ │ │ └── TestController.java │ │ └── resources/ │ │ └── application.yml │ ├── sa-token-demo-beetl/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaTokenBeetlDemoApplication.java │ │ │ ├── satoken/ │ │ │ │ ├── SaTokenConfigure.java │ │ │ │ └── StpInterfaceImpl.java │ │ │ └── test/ │ │ │ ├── GlobalException.java │ │ │ └── TestController.java │ │ └── resources/ │ │ ├── application.yml │ │ └── templates/ │ │ └── index.btl │ ├── sa-token-demo-bom-import/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaTokenDemoApplication.java │ │ │ ├── current/ │ │ │ │ └── GlobalException.java │ │ │ └── test/ │ │ │ └── TestController.java │ │ └── resources/ │ │ └── application.yml │ ├── sa-token-demo-caffeine/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaTokenDemoApplication.java │ │ │ ├── current/ │ │ │ │ └── GlobalException.java │ │ │ └── test/ │ │ │ └── LoginController.java │ │ └── resources/ │ │ └── application.yml │ ├── sa-token-demo-case/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaTokenCaseApplication.java │ │ │ ├── cases/ │ │ │ │ ├── more/ │ │ │ │ │ └── SaCheckELController.java │ │ │ │ ├── plugin/ │ │ │ │ │ └── TempTokenController.java │ │ │ │ ├── test/ │ │ │ │ │ └── TestController.java │ │ │ │ ├── up/ │ │ │ │ │ ├── DisableController.java │ │ │ │ │ ├── HttpBasicController.java │ │ │ │ │ ├── MutexLoginController.java │ │ │ │ │ ├── NotCookieController.java │ │ │ │ │ ├── RememberMeController.java │ │ │ │ │ ├── SafeAuthController.java │ │ │ │ │ ├── SearchSessionController.java │ │ │ │ │ ├── SecureController.java │ │ │ │ │ └── SwitchToController.java │ │ │ │ └── use/ │ │ │ │ ├── AtCheckController.java │ │ │ │ ├── JurAuthController.java │ │ │ │ ├── KickoutController.java │ │ │ │ ├── LoginAuthController.java │ │ │ │ ├── RouterCheckController.java │ │ │ │ └── SaSessionController.java │ │ │ ├── current/ │ │ │ │ ├── GlobalException.java │ │ │ │ └── NotFoundHandle.java │ │ │ ├── model/ │ │ │ │ └── SysUser.java │ │ │ └── satoken/ │ │ │ ├── MySaTempTemplate.java │ │ │ ├── MySaTokenListener.java │ │ │ ├── SaLogForSlf4j.java │ │ │ ├── SaTokenConfigure.java │ │ │ ├── StpInterfaceImpl.java │ │ │ ├── StpUserUtil.java │ │ │ ├── custom_annotation/ │ │ │ │ ├── CheckAccount.java │ │ │ │ ├── SaUserCheckLogin.java │ │ │ │ ├── SaUserCheckPermission.java │ │ │ │ ├── SaUserCheckRole.java │ │ │ │ ├── SaUserCheckSafe.java │ │ │ │ └── handler/ │ │ │ │ ├── CheckAccountHandler.java │ │ │ │ ├── SaUserCheckLoginHandler.java │ │ │ │ ├── SaUserCheckPermissionHandler.java │ │ │ │ ├── SaUserCheckRoleHandler.java │ │ │ │ └── SaUserCheckSafeHandler.java │ │ │ └── merge_annotation/ │ │ │ ├── SaUserCheckLogin.java │ │ │ ├── SaUserCheckPermission.java │ │ │ ├── SaUserCheckRole.java │ │ │ └── SaUserCheckSafe.java │ │ └── resources/ │ │ └── application.yml │ ├── sa-token-demo-device-lock/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaTokenDeviceLockApplication.java │ │ │ ├── current/ │ │ │ │ ├── GlobalException.java │ │ │ │ └── NotFoundHandle.java │ │ │ ├── satoken/ │ │ │ │ └── SaTokenConfigure.java │ │ │ ├── test/ │ │ │ │ ├── LoginController.java │ │ │ │ └── SysUserMockDao.java │ │ │ └── util/ │ │ │ ├── DeviceLockCheckUtil.java │ │ │ └── PhoneCodeUtil.java │ │ └── resources/ │ │ └── application.yml │ ├── sa-token-demo-device-lock-h5/ │ │ ├── common.js │ │ ├── device-lock-auth.html │ │ ├── index.html │ │ └── login.html │ ├── sa-token-demo-dubbo/ │ │ ├── sa-token-demo-dubbo-consumer/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── pj/ │ │ │ │ ├── DubboConsumerApplication.java │ │ │ │ ├── controller/ │ │ │ │ │ └── TestController.java │ │ │ │ └── service/ │ │ │ │ └── DemoService.java │ │ │ └── resources/ │ │ │ └── application.yml │ │ ├── sa-token-demo-dubbo-provider/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── pj/ │ │ │ │ ├── DubboProviderApplication.java │ │ │ │ ├── controller/ │ │ │ │ │ └── TestController.java │ │ │ │ └── service/ │ │ │ │ ├── DemoService.java │ │ │ │ └── DemoServiceImpl.java │ │ │ └── resources/ │ │ │ └── application.yml │ │ ├── sa-token-demo-dubbo3-consumer/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── pj/ │ │ │ │ ├── Dubbo3ConsumerApplication.java │ │ │ │ ├── controller/ │ │ │ │ │ └── TestController.java │ │ │ │ └── service/ │ │ │ │ └── DemoService.java │ │ │ └── resources/ │ │ │ └── application.yml │ │ └── sa-token-demo-dubbo3-provider/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── Dubbo3ProviderApplication.java │ │ │ ├── controller/ │ │ │ │ └── TestController.java │ │ │ └── service/ │ │ │ ├── DemoService.java │ │ │ └── DemoServiceImpl.java │ │ └── resources/ │ │ └── application.yml │ ├── sa-token-demo-freemarker/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaTokenFreemarkerDemoApplication.java │ │ │ ├── satoken/ │ │ │ │ ├── SaTokenConfigure.java │ │ │ │ └── StpInterfaceImpl.java │ │ │ └── test/ │ │ │ ├── GlobalException.java │ │ │ └── TestController.java │ │ └── resources/ │ │ ├── application.yml │ │ └── templates/ │ │ └── index.ftl │ ├── sa-token-demo-grpc/ │ │ ├── client/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── lym/ │ │ │ │ ├── Client.java │ │ │ │ ├── controller/ │ │ │ │ │ └── TestController.java │ │ │ │ └── grpc/ │ │ │ │ └── client/ │ │ │ │ └── GrpcAuthService.java │ │ │ ├── proto/ │ │ │ │ └── auth.proto │ │ │ └── resources/ │ │ │ └── application.yml │ │ ├── pom.xml │ │ └── server/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── lym/ │ │ │ ├── Server.java │ │ │ ├── grpc/ │ │ │ │ └── server/ │ │ │ │ └── GrpcAuthService.java │ │ │ └── service/ │ │ │ └── AuthService.java │ │ ├── proto/ │ │ │ └── auth.proto │ │ └── resources/ │ │ └── application.yml │ ├── sa-token-demo-hutool-timed-cache/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaTokenDemoApplication.java │ │ │ ├── current/ │ │ │ │ ├── GlobalException.java │ │ │ │ └── NotFoundHandle.java │ │ │ ├── satoken/ │ │ │ │ ├── SaTokenConfigure.java │ │ │ │ └── StpInterfaceImpl.java │ │ │ ├── test/ │ │ │ │ ├── LoginController.java │ │ │ │ ├── StressTestController.java │ │ │ │ └── TestController.java │ │ │ └── util/ │ │ │ ├── AjaxJson.java │ │ │ └── Ttime.java │ │ └── resources/ │ │ └── application.yml │ ├── sa-token-demo-jwt/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaTokenJwtDemoApplication.java │ │ │ ├── satoken/ │ │ │ │ └── SaTokenConfigure.java │ │ │ ├── test/ │ │ │ │ ├── GlobalException.java │ │ │ │ └── TestJwtController.java │ │ │ └── util/ │ │ │ └── AjaxJson.java │ │ └── resources/ │ │ └── application.yml │ ├── sa-token-demo-loveqq-boot/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaTokenLoveqqApplication.java │ │ │ ├── satoken/ │ │ │ │ ├── MyFilter.java │ │ │ │ ├── SaTokenConfigure.java │ │ │ │ └── StpInterfaceImpl.java │ │ │ └── test/ │ │ │ ├── GlobalException.java │ │ │ ├── TestController.java │ │ │ └── UserService.java │ │ └── resources/ │ │ └── application.yml │ ├── sa-token-demo-oauth2/ │ │ ├── sa-token-demo-oauth2-client/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── pj/ │ │ │ │ ├── SaOAuth2ClientApplication.java │ │ │ │ ├── oauth2/ │ │ │ │ │ └── SaOAuthClientController.java │ │ │ │ └── utils/ │ │ │ │ └── SoMap.java │ │ │ └── resources/ │ │ │ ├── application.yml │ │ │ └── templates/ │ │ │ └── index.html │ │ ├── sa-token-demo-oauth2-client-h5/ │ │ │ └── index.html │ │ ├── sa-token-demo-oauth2-server/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── pj/ │ │ │ │ ├── SaOAuth2ServerApplication.java │ │ │ │ ├── mock/ │ │ │ │ │ └── SaClientMockDao.java │ │ │ │ ├── oauth2/ │ │ │ │ │ ├── SaOAuth2DataLoaderImpl.java │ │ │ │ │ ├── SaOAuth2ResourcesController.java │ │ │ │ │ ├── SaOAuth2ServerController.java │ │ │ │ │ ├── custom_grant_type/ │ │ │ │ │ │ ├── CustomPasswordGrantTypeHandler.java │ │ │ │ │ │ ├── PhoneCodeGrantTypeHandler.java │ │ │ │ │ │ └── PhoneLoginController.java │ │ │ │ │ ├── custom_scope/ │ │ │ │ │ │ ├── CustomOidcScopeHandler.java │ │ │ │ │ │ └── UserinfoScopeHandler.java │ │ │ │ │ └── h5/ │ │ │ │ │ └── SaOAuth2ServerH5Controller.java │ │ │ │ ├── satoken/ │ │ │ │ │ ├── GlobalExceptionHandler.java │ │ │ │ │ └── SaTokenConfigure.java │ │ │ │ └── test/ │ │ │ │ ├── Test2Controller.java │ │ │ │ └── TestController.java │ │ │ └── resources/ │ │ │ ├── application.yml │ │ │ └── templates/ │ │ │ ├── confirm.html │ │ │ └── login.html │ │ └── sa-token-demo-oauth2-server-h5/ │ │ ├── login.css │ │ ├── login.js │ │ └── oauth2-authorize.html │ ├── sa-token-demo-quick-login/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaQuicikStartup.java │ │ │ ├── SaTokenQuickDemoApplication.java │ │ │ └── test/ │ │ │ └── TestController.java │ │ └── resources/ │ │ └── application.yml │ ├── sa-token-demo-quick-login-sb3/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaQuicikStartup.java │ │ │ ├── SaTokenQuickSb3DemoApplication.java │ │ │ └── test/ │ │ │ └── TestController.java │ │ └── resources/ │ │ └── application.yml │ ├── sa-token-demo-remember-me/ │ │ ├── page_project/ │ │ │ ├── .gitignore │ │ │ ├── README.md │ │ │ ├── index.html │ │ │ ├── package.json │ │ │ ├── src/ │ │ │ │ ├── App.vue │ │ │ │ └── main.js │ │ │ └── vite.config.js │ │ └── sa-token-demo-remember-me-server/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cc/ │ │ │ └── sa_token/ │ │ │ ├── RememberMeApplication.java │ │ │ └── controller/ │ │ │ └── UserLoginController.java │ │ └── resources/ │ │ └── application.yml │ ├── sa-token-demo-solon/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaTokenDemoApp.java │ │ │ ├── satoken/ │ │ │ │ ├── SaLogForSlf4j.java │ │ │ │ ├── SaLogForSolon.java │ │ │ │ ├── SaTokenConfigure.java │ │ │ │ ├── StpInterfaceImpl.java │ │ │ │ └── custom_annotation/ │ │ │ │ ├── CheckAccount.java │ │ │ │ └── handler/ │ │ │ │ └── CheckAccountHandler.java │ │ │ ├── test/ │ │ │ │ ├── GlobalExceptionFilter.java │ │ │ │ ├── StressTestController.java │ │ │ │ ├── TestController.java │ │ │ │ └── UserController.java │ │ │ └── util/ │ │ │ ├── AjaxJson.java │ │ │ └── Ttime.java │ │ └── resources/ │ │ └── app.yml │ ├── sa-token-demo-solon-redisson/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaTokenDemoApp.java │ │ │ ├── satoken/ │ │ │ │ ├── SaLogForSlf4j.java │ │ │ │ ├── SaLogForSolon.java │ │ │ │ ├── SaTokenConfigure.java │ │ │ │ └── StpInterfaceImpl.java │ │ │ ├── test/ │ │ │ │ ├── GlobalExceptionFilter.java │ │ │ │ ├── SSOController.java │ │ │ │ ├── StressTestController.java │ │ │ │ ├── TestController.java │ │ │ │ └── UserController.java │ │ │ └── util/ │ │ │ ├── AjaxJson.java │ │ │ └── Ttime.java │ │ └── resources/ │ │ └── app.yml │ ├── sa-token-demo-springboot/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaTokenDemoApplication.java │ │ │ ├── current/ │ │ │ │ ├── GlobalException.java │ │ │ │ └── NotFoundHandle.java │ │ │ ├── satoken/ │ │ │ │ ├── SaTokenConfigure.java │ │ │ │ └── StpInterfaceImpl.java │ │ │ ├── test/ │ │ │ │ ├── AtController.java │ │ │ │ ├── LoginController.java │ │ │ │ ├── StressTestController.java │ │ │ │ └── TestController.java │ │ │ └── util/ │ │ │ ├── AjaxJson.java │ │ │ └── Ttime.java │ │ └── resources/ │ │ └── application.yml │ ├── sa-token-demo-springboot-low-version/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaTokenApplication.java │ │ │ ├── current/ │ │ │ │ └── GlobalException.java │ │ │ ├── satoken/ │ │ │ │ └── SaTokenConfigure.java │ │ │ └── test/ │ │ │ └── LoginController.java │ │ └── resources/ │ │ └── application.yml │ ├── sa-token-demo-springboot-redis/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaTokenDemoApplication.java │ │ │ ├── current/ │ │ │ │ ├── GlobalException.java │ │ │ │ └── NotFoundHandle.java │ │ │ ├── satoken/ │ │ │ │ ├── SaTokenConfigure.java │ │ │ │ └── StpInterfaceImpl.java │ │ │ ├── test/ │ │ │ │ ├── AtController.java │ │ │ │ ├── LoginController.java │ │ │ │ ├── StressTestController.java │ │ │ │ └── TestController.java │ │ │ └── util/ │ │ │ ├── AjaxJson.java │ │ │ └── Ttime.java │ │ └── resources/ │ │ └── application.yml │ ├── sa-token-demo-springboot-redisson/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaTokenDemoApplication.java │ │ │ ├── current/ │ │ │ │ ├── GlobalException.java │ │ │ │ └── NotFoundHandle.java │ │ │ ├── redisson/ │ │ │ │ ├── RedissonConfig.java │ │ │ │ └── RedissonProperties.java │ │ │ ├── satoken/ │ │ │ │ ├── SaTokenConfigure.java │ │ │ │ └── StpInterfaceImpl.java │ │ │ ├── test/ │ │ │ │ ├── AtController.java │ │ │ │ ├── LoginController.java │ │ │ │ ├── StressTestController.java │ │ │ │ └── TestController.java │ │ │ └── util/ │ │ │ ├── AjaxJson.java │ │ │ └── Ttime.java │ │ └── resources/ │ │ └── application.yml │ ├── sa-token-demo-springboot3-redis/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaTokenSpringBoot3Application.java │ │ │ ├── current/ │ │ │ │ ├── GlobalException.java │ │ │ │ └── NotFoundHandle.java │ │ │ ├── satoken/ │ │ │ │ ├── SaTokenConfigure.java │ │ │ │ └── StpInterfaceImpl.java │ │ │ ├── test/ │ │ │ │ ├── AtController.java │ │ │ │ ├── LoginController.java │ │ │ │ ├── StressTestController.java │ │ │ │ └── TestController.java │ │ │ └── util/ │ │ │ ├── AjaxJson.java │ │ │ └── Ttime.java │ │ └── resources/ │ │ └── application.yml │ ├── sa-token-demo-springboot4-redis/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaTokenSpringBoot4Application.java │ │ │ ├── current/ │ │ │ │ ├── GlobalException.java │ │ │ │ └── NotFoundHandle.java │ │ │ ├── satoken/ │ │ │ │ ├── SaTokenConfigure.java │ │ │ │ └── StpInterfaceImpl.java │ │ │ ├── test/ │ │ │ │ ├── AtController.java │ │ │ │ ├── FaviconController.java │ │ │ │ ├── LoginController.java │ │ │ │ ├── StressTestController.java │ │ │ │ └── TestController.java │ │ │ └── util/ │ │ │ ├── AjaxJson.java │ │ │ └── Ttime.java │ │ └── resources/ │ │ └── application.yml │ ├── sa-token-demo-sse/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaTokenSseApplication.java │ │ │ ├── current/ │ │ │ │ └── GlobalException.java │ │ │ ├── satoken/ │ │ │ │ └── SaTokenConfigure.java │ │ │ ├── test/ │ │ │ │ ├── LoginController.java │ │ │ │ ├── SseAdminController.java │ │ │ │ └── SseController.java │ │ │ └── util/ │ │ │ └── SseEmitterHolder.java │ │ └── resources/ │ │ └── application.yml │ ├── sa-token-demo-ssm/ │ │ ├── README.md │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── controller/ │ │ │ │ ├── AtController.java │ │ │ │ ├── LoginController.java │ │ │ │ ├── PageController.java │ │ │ │ └── TestController.java │ │ │ ├── current/ │ │ │ │ ├── GlobalException.java │ │ │ │ └── NotFoundHandle.java │ │ │ ├── model/ │ │ │ │ └── SysUser.java │ │ │ └── satoken/ │ │ │ ├── SaInterceptorImpl.java │ │ │ ├── SaTokenBeanInjection.java │ │ │ └── StpInterfaceImpl.java │ │ ├── resources/ │ │ │ ├── application.yml │ │ │ ├── applicationContext.xml │ │ │ ├── spring-mvc.xml │ │ │ ├── spring-redis.xml │ │ │ └── spring-sa-token.xml │ │ └── webapp/ │ │ ├── WEB-INF/ │ │ │ ├── jsp/ │ │ │ │ ├── admin.jsp │ │ │ │ ├── home.jsp │ │ │ │ └── user.jsp │ │ │ └── web.xml │ │ └── index.jsp │ ├── sa-token-demo-sso/ │ │ ├── sa-token-demo-sso-client-h5/ │ │ │ ├── index.html │ │ │ ├── sso-common.js │ │ │ └── sso-login.html │ │ ├── sa-token-demo-sso-client-vue2/ │ │ │ ├── .gitignore │ │ │ ├── README.md │ │ │ ├── babel.config.js │ │ │ ├── jsconfig.json │ │ │ ├── package.json │ │ │ ├── public/ │ │ │ │ └── index.html │ │ │ ├── src/ │ │ │ │ ├── App.vue │ │ │ │ ├── main.js │ │ │ │ ├── router/ │ │ │ │ │ └── index.js │ │ │ │ └── views/ │ │ │ │ ├── sso-common.js │ │ │ │ ├── sso-index.vue │ │ │ │ └── sso-login.vue │ │ │ └── vue.config.js │ │ ├── sa-token-demo-sso-client-vue3/ │ │ │ ├── .gitignore │ │ │ ├── README.md │ │ │ ├── index.html │ │ │ ├── package.json │ │ │ ├── src/ │ │ │ │ ├── App.vue │ │ │ │ ├── main.js │ │ │ │ ├── router/ │ │ │ │ │ └── index.js │ │ │ │ └── views/ │ │ │ │ ├── sso-common.js │ │ │ │ ├── sso-index.vue │ │ │ │ └── sso-login.vue │ │ │ └── vite.config.js │ │ ├── sa-token-demo-sso-server/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── pj/ │ │ │ │ ├── SaSsoServerApplication.java │ │ │ │ ├── h5/ │ │ │ │ │ ├── H5Controller.java │ │ │ │ │ └── SaTokenConfigure.java │ │ │ │ └── sso/ │ │ │ │ ├── GlobalExceptionHandler.java │ │ │ │ ├── HomeController.java │ │ │ │ └── SsoServerController.java │ │ │ └── resources/ │ │ │ ├── application.yml │ │ │ ├── static/ │ │ │ │ └── sa-res/ │ │ │ │ ├── layer/ │ │ │ │ │ ├── layer.js │ │ │ │ │ ├── mobile/ │ │ │ │ │ │ ├── layer.js │ │ │ │ │ │ └── need/ │ │ │ │ │ │ └── layer.css │ │ │ │ │ └── theme/ │ │ │ │ │ └── default/ │ │ │ │ │ └── layer.css │ │ │ │ ├── login.css │ │ │ │ └── login.js │ │ │ └── templates/ │ │ │ └── sa-login.html │ │ ├── sa-token-demo-sso-server-h5/ │ │ │ ├── common.js │ │ │ ├── home.html │ │ │ ├── sso-auth.css │ │ │ ├── sso-auth.html │ │ │ └── sso-auth.js │ │ ├── sa-token-demo-sso1-client/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── pj/ │ │ │ │ ├── SaSso1ClientApplication.java │ │ │ │ └── sso/ │ │ │ │ └── SsoClientController.java │ │ │ └── resources/ │ │ │ └── application.yml │ │ ├── sa-token-demo-sso2-client/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── pj/ │ │ │ │ ├── SaSso2ClientApplication.java │ │ │ │ ├── h5/ │ │ │ │ │ ├── H5Controller.java │ │ │ │ │ └── SaTokenConfigure.java │ │ │ │ └── sso/ │ │ │ │ ├── GlobalExceptionHandler.java │ │ │ │ └── SsoClientController.java │ │ │ └── resources/ │ │ │ └── application.yml │ │ ├── sa-token-demo-sso3-client/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── pj/ │ │ │ │ ├── SaSso3ClientApplication.java │ │ │ │ ├── h5/ │ │ │ │ │ ├── H5Controller.java │ │ │ │ │ └── SaTokenConfigure.java │ │ │ │ └── sso/ │ │ │ │ ├── GlobalExceptionHandler.java │ │ │ │ └── SsoClientController.java │ │ │ └── resources/ │ │ │ └── application.yml │ │ ├── sa-token-demo-sso3-client-anon/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── pj/ │ │ │ │ ├── SaSso3ClientAnonApplication.java │ │ │ │ └── sso/ │ │ │ │ ├── GlobalExceptionHandler.java │ │ │ │ └── SsoClientController.java │ │ │ └── resources/ │ │ │ └── application.yml │ │ ├── sa-token-demo-sso3-client-nosdk/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── pj/ │ │ │ │ ├── SaSsoClientNoSdkApplication.java │ │ │ │ └── sso/ │ │ │ │ ├── SsoClientController.java │ │ │ │ ├── SsoRequestUtil.java │ │ │ │ └── util/ │ │ │ │ ├── AjaxJson.java │ │ │ │ └── MyHttpSessionHolder.java │ │ │ └── resources/ │ │ │ └── application.yml │ │ └── sa-token-demo-sso3-client-resdk/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaSsoClientReSdkApplication.java │ │ │ ├── resdk/ │ │ │ │ ├── MyHttpSessionHolder.java │ │ │ │ └── StpLogicForHttpSession.java │ │ │ └── sso/ │ │ │ ├── GlobalExceptionHandler.java │ │ │ └── SsoClientController.java │ │ └── resources/ │ │ └── application.yml │ ├── sa-token-demo-sso-for-solon/ │ │ ├── sa-token-demo-sso-server-solon/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── pj/ │ │ │ │ ├── SaConfig.java │ │ │ │ ├── SaSsoServerApp.java │ │ │ │ ├── h5/ │ │ │ │ │ ├── H5Controller.java │ │ │ │ │ └── SaTokenConfigure.java │ │ │ │ └── sso/ │ │ │ │ ├── GlobalExceptionFilter.java │ │ │ │ ├── HomeController.java │ │ │ │ └── SsoServerController.java │ │ │ └── resources/ │ │ │ ├── WEB-INF/ │ │ │ │ ├── static/ │ │ │ │ │ └── sa-res/ │ │ │ │ │ ├── layer/ │ │ │ │ │ │ ├── layer.js │ │ │ │ │ │ ├── mobile/ │ │ │ │ │ │ │ ├── layer.js │ │ │ │ │ │ │ └── need/ │ │ │ │ │ │ │ └── layer.css │ │ │ │ │ │ └── theme/ │ │ │ │ │ │ └── default/ │ │ │ │ │ │ └── layer.css │ │ │ │ │ ├── login.css │ │ │ │ │ └── login.js │ │ │ │ └── view/ │ │ │ │ └── sa-login.html │ │ │ └── app.yml │ │ ├── sa-token-demo-sso1-client-solon/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── pj/ │ │ │ │ ├── SaConfig.java │ │ │ │ ├── SaSso1ClientApp.java │ │ │ │ └── sso/ │ │ │ │ └── SsoClientController.java │ │ │ └── resources/ │ │ │ └── app.yml │ │ ├── sa-token-demo-sso2-client-solon/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── pj/ │ │ │ │ ├── SaConfig.java │ │ │ │ ├── SaSso2ClientApp.java │ │ │ │ ├── h5/ │ │ │ │ │ ├── H5Controller.java │ │ │ │ │ └── SaTokenConfigure.java │ │ │ │ └── sso/ │ │ │ │ ├── GlobalExceptionFilter.java │ │ │ │ └── SsoClientController.java │ │ │ └── resources/ │ │ │ └── app.yml │ │ └── sa-token-demo-sso3-client-solon/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaConfig.java │ │ │ ├── SaSso3ClientApp.java │ │ │ ├── h5/ │ │ │ │ ├── H5Controller.java │ │ │ │ └── SaTokenConfigure.java │ │ │ └── sso/ │ │ │ ├── GlobalExceptionFilter.java │ │ │ └── SsoClientController.java │ │ └── resources/ │ │ └── app.yml │ ├── sa-token-demo-test/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaTokenApplication.java │ │ │ ├── current/ │ │ │ │ ├── GlobalException.java │ │ │ │ └── NotFoundHandle.java │ │ │ ├── model/ │ │ │ │ ├── SysRole.java │ │ │ │ └── SysUser.java │ │ │ ├── satoken/ │ │ │ │ ├── SaLogForSlf4j.java │ │ │ │ ├── SaTokenConfigure.java │ │ │ │ ├── StpInterfaceImpl.java │ │ │ │ └── StpUserUtil.java │ │ │ ├── test/ │ │ │ │ ├── AtController.java │ │ │ │ ├── LoginController.java │ │ │ │ ├── StressTestController.java │ │ │ │ ├── Test2Controller.java │ │ │ │ └── TestController.java │ │ │ └── util/ │ │ │ ├── AjaxJson.java │ │ │ └── Ttime.java │ │ └── resources/ │ │ └── application.yml │ ├── sa-token-demo-thymeleaf/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaTokenThymeleafDemoApplication.java │ │ │ ├── satoken/ │ │ │ │ ├── SaTokenConfigure.java │ │ │ │ └── StpInterfaceImpl.java │ │ │ └── test/ │ │ │ ├── GlobalException.java │ │ │ └── TestController.java │ │ └── resources/ │ │ ├── application.yml │ │ └── templates/ │ │ └── index.html │ ├── sa-token-demo-webflux/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaTokenWebfluxApplication.java │ │ │ ├── satoken/ │ │ │ │ ├── MyFilter.java │ │ │ │ ├── SaTokenConfigure.java │ │ │ │ └── StpInterfaceImpl.java │ │ │ └── test/ │ │ │ ├── DefineRoutes.java │ │ │ ├── GlobalException.java │ │ │ ├── TestController.java │ │ │ └── UserService.java │ │ └── resources/ │ │ └── application.yml │ ├── sa-token-demo-webflux-springboot3/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaTokenWebfluxSpringboot3Application.java │ │ │ ├── satoken/ │ │ │ │ ├── MyFilter.java │ │ │ │ ├── SaTokenConfigure.java │ │ │ │ └── StpInterfaceImpl.java │ │ │ └── test/ │ │ │ ├── DefineRoutes.java │ │ │ ├── GlobalException.java │ │ │ ├── TestController.java │ │ │ └── UserService.java │ │ └── resources/ │ │ └── application.yml │ ├── sa-token-demo-webflux-springboot4/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaTokenWebfluxSpringboot4Application.java │ │ │ ├── satoken/ │ │ │ │ ├── MyFilter.java │ │ │ │ ├── SaTokenConfigure.java │ │ │ │ └── StpInterfaceImpl.java │ │ │ └── test/ │ │ │ ├── DefineRoutes.java │ │ │ ├── GlobalException.java │ │ │ ├── TestController.java │ │ │ └── UserService.java │ │ └── resources/ │ │ └── application.yml │ ├── sa-token-demo-websocket/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── pj/ │ │ │ ├── SaTokenWebSocketApplication.java │ │ │ ├── test/ │ │ │ │ └── LoginController.java │ │ │ └── ws/ │ │ │ ├── WebSocketConfig.java │ │ │ └── WebSocketConnect.java │ │ └── resources/ │ │ └── application.yml │ └── sa-token-demo-websocket-spring/ │ ├── pom.xml │ └── src/ │ └── main/ │ ├── java/ │ │ └── com/ │ │ └── pj/ │ │ ├── SaTokenWebSocketSpringApplication.java │ │ ├── test/ │ │ │ └── LoginController.java │ │ └── ws/ │ │ ├── MyWebSocketHandler.java │ │ ├── WebSocketConfig.java │ │ └── WebSocketInterceptor.java │ └── resources/ │ └── application.yml ├── sa-token-dependencies/ │ └── pom.xml ├── sa-token-doc/ │ ├── README.md │ ├── _sidebar.md │ ├── api/ │ │ ├── sa-session.md │ │ ├── sa-strategy.md │ │ ├── sa-token-dao.md │ │ └── stp-util.md │ ├── arch/ │ │ ├── data-structure.md │ │ └── dir-intro.md │ ├── doc/ │ │ ├── index-backup.html │ │ └── index.html │ ├── doc.html │ ├── fun/ │ │ ├── async--mock.md │ │ ├── auth-flow.md │ │ ├── auth-framework-function-test.md │ │ ├── cors-filter.md │ │ ├── curr-domain.md │ │ ├── custom-annotations.md │ │ ├── dynamic-router-check.md │ │ ├── exception-code.md │ │ ├── firewall.md │ │ ├── git-pr.md │ │ ├── issue-template.md │ │ ├── jur-cache.md │ │ ├── log.md │ │ ├── not-login-scene.md │ │ ├── plugin-dev.md │ │ ├── refer-info.md │ │ ├── sa-token-context--backup.md │ │ ├── sa-token-context.md │ │ ├── sa-token-test.md │ │ ├── session-model.md │ │ ├── sso-vs-oauth2.md │ │ ├── team.md │ │ ├── tech-stack.md │ │ ├── three-scope.md │ │ ├── timeline.md │ │ ├── token-info.md │ │ └── token-timeout.md │ ├── include/ │ │ └── include-qa.md │ ├── index.html │ ├── micro/ │ │ ├── dcs-session.md │ │ ├── gateway-auth.md │ │ ├── import-intro.md │ │ └── same-token.md │ ├── more/ │ │ ├── blog.md │ │ ├── common-action.md │ │ ├── common-questions.md │ │ ├── content-cooperation.md │ │ ├── demand-commit.md │ │ ├── join-group.md │ │ ├── link.md │ │ ├── noun-intro.md │ │ ├── sa-token-donate-old.md │ │ ├── sa-token-donate.md │ │ ├── tj-gzh-hz.md │ │ ├── tj-gzh.md │ │ ├── update-log.md │ │ └── wenjuan.md │ ├── oauth2/ │ │ ├── oauth2-apidoc.md │ │ ├── oauth2-at-check.md │ │ ├── oauth2-check-domain.md │ │ ├── oauth2-custom-api.md │ │ ├── oauth2-custom-grant_type.md │ │ ├── oauth2-custom-login.md │ │ ├── oauth2-custom-scope.md │ │ ├── oauth2-data-loader.md │ │ ├── oauth2-dev.md │ │ ├── oauth2-h5.md │ │ ├── oauth2-interworking.md │ │ ├── oauth2-oidc.md │ │ ├── oauth2-openid.md │ │ ├── oauth2-questions.md │ │ ├── oauth2-scope-level.md │ │ ├── oauth2-server.md │ │ └── readme.md │ ├── plugin/ │ │ ├── alone-redis.md │ │ ├── aop-at.md │ │ ├── api-key.md │ │ ├── api-sign.md │ │ ├── custom-serializer.md │ │ ├── dao-extend.md │ │ ├── dubbo-extend.md │ │ ├── freemarker-extend.md │ │ ├── grpc-extend.md │ │ ├── json-extend.md │ │ ├── jwt-extend.md │ │ ├── plugin-dev.md │ │ ├── quick-login.md │ │ ├── spel-at.md │ │ ├── temp-token.md │ │ └── thymeleaf-extend.md │ ├── pro/ │ │ ├── st_doc_top.md │ │ ├── st_index_top.md │ │ ├── st_oauth2.md │ │ └── st_sso.md │ ├── sso/ │ │ ├── anon-client.md │ │ ├── message-push.md │ │ ├── readme.md │ │ ├── signout.md │ │ ├── sso-apidoc.md │ │ ├── sso-check-domain.md │ │ ├── sso-custom-api.md │ │ ├── sso-custom-login.md │ │ ├── sso-dev.md │ │ ├── sso-diff-key.md │ │ ├── sso-h5.md │ │ ├── sso-home-jump.md │ │ ├── sso-nosdk.md │ │ ├── sso-pro.md │ │ ├── sso-questions.md │ │ ├── sso-server.md │ │ ├── sso-type1.md │ │ ├── sso-type2.md │ │ ├── sso-type3.md │ │ └── user-data-sync.md │ ├── start/ │ │ ├── download.md │ │ ├── example.md │ │ ├── maven-pull.md │ │ ├── new-version.md │ │ ├── solon-example.md │ │ └── webflux-example.md │ ├── static/ │ │ ├── custom-docsify-plugins/ │ │ │ ├── doc-lock-by-gzh-plugin.js │ │ │ ├── doc-lock-plugin.css │ │ │ └── doc-lock-plugin.js │ │ ├── doc.css │ │ ├── docsify-plugin.js │ │ ├── docsify-plugins/ │ │ │ ├── docsify-betterembed-1.1.1.js │ │ │ ├── docsify-plugin-flexible-alerts.min-1.1.1.js │ │ │ ├── progress.update.js │ │ │ └── sub-nav-draw.js │ │ ├── donate/ │ │ │ ├── donate-fun.js │ │ │ └── donate-list.js │ │ ├── index.css │ │ ├── is-fill-in-wj-plugin.js │ │ ├── is-star-plugin.js │ │ ├── jquery.lazyload-1.9.3.js │ │ ├── layer-v3.1.1/ │ │ │ ├── layer.js │ │ │ ├── mobile/ │ │ │ │ ├── layer.js │ │ │ │ └── need/ │ │ │ │ └── layer.css │ │ │ └── theme/ │ │ │ └── default/ │ │ │ └── layer.css │ │ ├── page-com/ │ │ │ └── github-stars-vs/ │ │ │ ├── echarts.min-5.4.3.js │ │ │ └── github-stars-vs.html │ │ ├── swiper/ │ │ │ ├── index-swiper.css │ │ │ └── index-swiper.js │ │ ├── vue.css │ │ └── water-change-theme/ │ │ ├── water-change-theme.css │ │ └── water-change-theme.js │ ├── up/ │ │ ├── basic-auth.md │ │ ├── disable.md │ │ ├── global-filter.md │ │ ├── global-listener.md │ │ ├── integ-redis.md │ │ ├── integ-spring-mongod-1.md │ │ ├── integ-spring-mongod-2.md │ │ ├── login-parameter.md │ │ ├── many-account.md │ │ ├── mock-person.md │ │ ├── mutex-login.md │ │ ├── not-cookie.md │ │ ├── password-secure.md │ │ ├── remember-me.md │ │ ├── safe-auth.md │ │ ├── search-session.md │ │ ├── token-prefix.md │ │ └── token-style.md │ └── use/ │ ├── at-check.md │ ├── config.md │ ├── dao-extend.md │ ├── jur-auth.md │ ├── kick.md │ ├── login-auth.md │ ├── route-check.md │ └── session.md ├── sa-token-plugin/ │ ├── pom.xml │ ├── sa-token-alone-redis/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ └── dao/ │ │ │ └── alone/ │ │ │ └── SaAloneRedisInject.java │ │ └── resources/ │ │ └── META-INF/ │ │ ├── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── spring.factories │ ├── sa-token-alone-redis-by-spring-boot4/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ └── dao/ │ │ │ └── alone/ │ │ │ └── SaAloneRedisInject.java │ │ └── resources/ │ │ └── META-INF/ │ │ └── spring/ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ ├── sa-token-apikey/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ ├── apikey/ │ │ │ │ ├── SaApiKeyManager.java │ │ │ │ ├── annotation/ │ │ │ │ │ ├── SaCheckApiKey.java │ │ │ │ │ └── handle/ │ │ │ │ │ └── SaCheckApiKeyHandler.java │ │ │ │ ├── config/ │ │ │ │ │ └── SaApiKeyConfig.java │ │ │ │ ├── error/ │ │ │ │ │ └── SaApiKeyErrorCode.java │ │ │ │ ├── exception/ │ │ │ │ │ ├── ApiKeyException.java │ │ │ │ │ └── ApiKeyScopeException.java │ │ │ │ ├── loader/ │ │ │ │ │ ├── SaApiKeyDataLoader.java │ │ │ │ │ └── SaApiKeyDataLoaderDefaultImpl.java │ │ │ │ ├── model/ │ │ │ │ │ └── ApiKeyModel.java │ │ │ │ └── template/ │ │ │ │ ├── SaApiKeyTemplate.java │ │ │ │ └── SaApiKeyUtil.java │ │ │ └── plugin/ │ │ │ └── SaTokenPluginForApiKey.java │ │ └── resources/ │ │ └── META-INF/ │ │ └── satoken/ │ │ └── cn.dev33.satoken.plugin.SaTokenPlugin │ ├── sa-token-caffeine/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ ├── dao/ │ │ │ │ ├── SaMapPackageForCaffeine.java │ │ │ │ └── SaTokenDaoForCaffeine.java │ │ │ └── plugin/ │ │ │ └── SaTokenPluginForCaffeine.java │ │ └── resources/ │ │ └── META-INF/ │ │ └── satoken/ │ │ └── cn.dev33.satoken.plugin.SaTokenPlugin │ ├── sa-token-dubbo/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ └── context/ │ │ │ └── dubbo/ │ │ │ ├── filter/ │ │ │ │ ├── SaTokenDubboConsumerFilter.java │ │ │ │ ├── SaTokenDubboContextFilter.java │ │ │ │ └── SaTokenDubboProviderFilter.java │ │ │ ├── model/ │ │ │ │ ├── SaRequestForDubbo.java │ │ │ │ ├── SaResponseForDubbo.java │ │ │ │ └── SaStorageForDubbo.java │ │ │ └── util/ │ │ │ └── SaTokenContextDubboUtil.java │ │ └── resources/ │ │ └── META-INF/ │ │ └── dubbo/ │ │ └── org.apache.dubbo.rpc.Filter │ ├── sa-token-dubbo3/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ └── context/ │ │ │ └── dubbo3/ │ │ │ ├── filter/ │ │ │ │ ├── SaTokenDubbo3ConsumerFilter.java │ │ │ │ ├── SaTokenDubbo3ContextFilter.java │ │ │ │ └── SaTokenDubbo3ProviderFilter.java │ │ │ ├── model/ │ │ │ │ ├── SaRequestForDubbo3.java │ │ │ │ ├── SaResponseForDubbo3.java │ │ │ │ └── SaStorageForDubbo3.java │ │ │ └── util/ │ │ │ └── SaTokenContextDubbo3Util.java │ │ └── resources/ │ │ └── META-INF/ │ │ └── dubbo/ │ │ └── org.apache.dubbo.rpc.Filter │ ├── sa-token-fastjson/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ ├── json/ │ │ │ │ └── SaJsonTemplateForFastjson.java │ │ │ ├── plugin/ │ │ │ │ └── SaTokenPluginForFastjson.java │ │ │ └── session/ │ │ │ └── SaSessionForFastjsonCustomized.java │ │ └── resources/ │ │ └── META-INF/ │ │ └── satoken/ │ │ └── cn.dev33.satoken.plugin.SaTokenPlugin │ ├── sa-token-fastjson2/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ ├── json/ │ │ │ │ └── SaJsonTemplateForFastjson2.java │ │ │ ├── plugin/ │ │ │ │ └── SaTokenPluginForFastjson2.java │ │ │ └── session/ │ │ │ └── SaSessionForFastjson2Customized.java │ │ └── resources/ │ │ └── META-INF/ │ │ └── satoken/ │ │ └── cn.dev33.satoken.plugin.SaTokenPlugin │ ├── sa-token-forest/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ ├── http/ │ │ │ │ └── SaHttpTemplateForForest.java │ │ │ └── plugin/ │ │ │ └── SaTokenPluginForForest.java │ │ └── resources/ │ │ └── META-INF/ │ │ └── satoken/ │ │ └── cn.dev33.satoken.plugin.SaTokenPlugin │ ├── sa-token-freemarker/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── cn/ │ │ └── dev33/ │ │ └── satoken/ │ │ └── freemarker/ │ │ └── dialect/ │ │ ├── SaTokenTemplateDirectiveModel.java │ │ └── SaTokenTemplateModel.java │ ├── sa-token-grpc/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ └── context/ │ │ │ └── grpc/ │ │ │ ├── constants/ │ │ │ │ └── GrpcContextConstants.java │ │ │ ├── context/ │ │ │ │ └── SaTokenGrpcContext.java │ │ │ ├── interceptor/ │ │ │ │ ├── SaTokenContextGrpcServerInterceptor.java │ │ │ │ ├── SaTokenGrpcClientInterceptor.java │ │ │ │ └── SaTokenGrpcServerInterceptor.java │ │ │ ├── model/ │ │ │ │ ├── SaRequestForGrpc.java │ │ │ │ ├── SaResponseForGrpc.java │ │ │ │ └── SaStorageForGrpc.java │ │ │ └── util/ │ │ │ └── SaTokenContextGrpcUtil.java │ │ └── resources/ │ │ └── META-INF/ │ │ ├── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── spring.factories │ ├── sa-token-hutool-timed-cache/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ ├── dao/ │ │ │ │ └── SaTokenDaoForHutoolTimedCache.java │ │ │ └── plugin/ │ │ │ └── SaTokenPluginForHutoolCache.java │ │ └── resources/ │ │ └── META-INF/ │ │ └── satoken/ │ │ └── cn.dev33.satoken.plugin.SaTokenPlugin │ ├── sa-token-jackson/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ ├── json/ │ │ │ │ └── SaJsonTemplateForJackson.java │ │ │ └── plugin/ │ │ │ └── SaTokenPluginForJackson.java │ │ └── resources/ │ │ └── META-INF/ │ │ └── satoken/ │ │ └── cn.dev33.satoken.plugin.SaTokenPlugin │ ├── sa-token-jackson3/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ ├── json/ │ │ │ │ └── SaJsonTemplateForJackson3.java │ │ │ └── plugin/ │ │ │ └── SaTokenPluginForJackson3.java │ │ └── resources/ │ │ └── META-INF/ │ │ └── satoken/ │ │ └── cn.dev33.satoken.plugin.SaTokenPlugin │ ├── sa-token-jwt/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── cn/ │ │ └── dev33/ │ │ └── satoken/ │ │ └── jwt/ │ │ ├── SaJwtTemplate.java │ │ ├── SaJwtUtil.java │ │ ├── StpLogicJwtForMixin.java │ │ ├── StpLogicJwtForSimple.java │ │ ├── StpLogicJwtForStateless.java │ │ ├── error/ │ │ │ └── SaJwtErrorCode.java │ │ └── exception/ │ │ └── SaJwtException.java │ ├── sa-token-oauth2/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ ├── oauth2/ │ │ │ │ ├── SaOAuth2Manager.java │ │ │ │ ├── annotation/ │ │ │ │ │ ├── SaCheckAccessToken.java │ │ │ │ │ ├── SaCheckClientIdSecret.java │ │ │ │ │ ├── SaCheckClientToken.java │ │ │ │ │ └── handler/ │ │ │ │ │ ├── SaCheckAccessTokenHandler.java │ │ │ │ │ ├── SaCheckClientIdSecretHandler.java │ │ │ │ │ └── SaCheckClientTokenHandler.java │ │ │ │ ├── config/ │ │ │ │ │ ├── SaOAuth2OidcConfig.java │ │ │ │ │ └── SaOAuth2ServerConfig.java │ │ │ │ ├── consts/ │ │ │ │ │ ├── GrantType.java │ │ │ │ │ └── SaOAuth2Consts.java │ │ │ │ ├── dao/ │ │ │ │ │ └── SaOAuth2Dao.java │ │ │ │ ├── data/ │ │ │ │ │ ├── convert/ │ │ │ │ │ │ ├── SaOAuth2DataConverter.java │ │ │ │ │ │ └── SaOAuth2DataConverterDefaultImpl.java │ │ │ │ │ ├── generate/ │ │ │ │ │ │ ├── SaOAuth2DataGenerate.java │ │ │ │ │ │ └── SaOAuth2DataGenerateDefaultImpl.java │ │ │ │ │ ├── loader/ │ │ │ │ │ │ ├── SaOAuth2DataLoader.java │ │ │ │ │ │ └── SaOAuth2DataLoaderDefaultImpl.java │ │ │ │ │ ├── model/ │ │ │ │ │ │ ├── AccessTokenModel.java │ │ │ │ │ │ ├── ClientTokenModel.java │ │ │ │ │ │ ├── CodeModel.java │ │ │ │ │ │ ├── RefreshTokenModel.java │ │ │ │ │ │ ├── loader/ │ │ │ │ │ │ │ └── SaClientModel.java │ │ │ │ │ │ ├── oidc/ │ │ │ │ │ │ │ └── IdTokenModel.java │ │ │ │ │ │ └── request/ │ │ │ │ │ │ ├── ClientIdAndSecretModel.java │ │ │ │ │ │ └── RequestAuthModel.java │ │ │ │ │ └── resolver/ │ │ │ │ │ ├── SaOAuth2DataResolver.java │ │ │ │ │ └── SaOAuth2DataResolverDefaultImpl.java │ │ │ │ ├── error/ │ │ │ │ │ └── SaOAuth2ErrorCode.java │ │ │ │ ├── exception/ │ │ │ │ │ ├── SaOAuth2AccessTokenException.java │ │ │ │ │ ├── SaOAuth2AccessTokenScopeException.java │ │ │ │ │ ├── SaOAuth2AuthorizationCodeException.java │ │ │ │ │ ├── SaOAuth2ClientModelException.java │ │ │ │ │ ├── SaOAuth2ClientModelScopeException.java │ │ │ │ │ ├── SaOAuth2ClientTokenException.java │ │ │ │ │ ├── SaOAuth2ClientTokenScopeException.java │ │ │ │ │ ├── SaOAuth2Exception.java │ │ │ │ │ └── SaOAuth2RefreshTokenException.java │ │ │ │ ├── function/ │ │ │ │ │ ├── SaOAuth2ConfirmViewFunction.java │ │ │ │ │ ├── SaOAuth2DoLoginHandleFunction.java │ │ │ │ │ ├── SaOAuth2NotLoginViewFunction.java │ │ │ │ │ └── strategy/ │ │ │ │ │ ├── SaOAuth2CreateAccessTokenValueFunction.java │ │ │ │ │ ├── SaOAuth2CreateClientTokenValueFunction.java │ │ │ │ │ ├── SaOAuth2CreateCodeValueFunction.java │ │ │ │ │ ├── SaOAuth2CreateRefreshTokenValueFunction.java │ │ │ │ │ ├── SaOAuth2GrantTypeAuthFunction.java │ │ │ │ │ ├── SaOAuth2ScopeWorkAccessTokenFunction.java │ │ │ │ │ └── SaOAuth2ScopeWorkClientTokenFunction.java │ │ │ │ ├── granttype/ │ │ │ │ │ └── handler/ │ │ │ │ │ ├── AuthorizationCodeGrantTypeHandler.java │ │ │ │ │ ├── PasswordGrantTypeHandler.java │ │ │ │ │ ├── RefreshTokenGrantTypeHandler.java │ │ │ │ │ ├── SaOAuth2GrantTypeHandlerInterface.java │ │ │ │ │ └── model/ │ │ │ │ │ └── PasswordAuthResult.java │ │ │ │ ├── processor/ │ │ │ │ │ └── SaOAuth2ServerProcessor.java │ │ │ │ ├── scope/ │ │ │ │ │ ├── CommonScope.java │ │ │ │ │ └── handler/ │ │ │ │ │ ├── OidcScopeHandler.java │ │ │ │ │ ├── OpenIdScopeHandler.java │ │ │ │ │ ├── SaOAuth2ScopeHandlerInterface.java │ │ │ │ │ ├── UnionIdScopeHandler.java │ │ │ │ │ └── UserIdScopeHandler.java │ │ │ │ ├── strategy/ │ │ │ │ │ └── SaOAuth2Strategy.java │ │ │ │ └── template/ │ │ │ │ ├── SaOAuth2Template.java │ │ │ │ └── SaOAuth2Util.java │ │ │ └── plugin/ │ │ │ └── SaTokenPluginForOAuth2.java │ │ └── resources/ │ │ └── META-INF/ │ │ └── satoken/ │ │ └── cn.dev33.satoken.plugin.SaTokenPlugin │ ├── sa-token-okhttps/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ ├── http/ │ │ │ │ └── SaHttpTemplateForOkHttps.java │ │ │ └── plugin/ │ │ │ └── SaTokenPluginForOkHttps.java │ │ └── resources/ │ │ └── META-INF/ │ │ └── satoken/ │ │ └── cn.dev33.satoken.plugin.SaTokenPlugin │ ├── sa-token-quick-login/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ └── quick/ │ │ │ ├── SaQuickInject.java │ │ │ ├── SaQuickManager.java │ │ │ ├── SaQuickRegister.java │ │ │ ├── config/ │ │ │ │ └── SaQuickConfig.java │ │ │ ├── function/ │ │ │ │ └── DoLoginHandleFunction.java │ │ │ └── web/ │ │ │ └── SaQuickController.java │ │ └── resources/ │ │ ├── META-INF/ │ │ │ ├── spring/ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── spring.factories │ │ ├── static/ │ │ │ └── sa-res/ │ │ │ ├── layer/ │ │ │ │ ├── layer.js │ │ │ │ ├── mobile/ │ │ │ │ │ ├── layer.js │ │ │ │ │ └── need/ │ │ │ │ │ └── layer.css │ │ │ │ └── theme/ │ │ │ │ └── default/ │ │ │ │ └── layer.css │ │ │ ├── login.css │ │ │ └── login.js │ │ └── templates/ │ │ └── sa-login.html │ ├── sa-token-redis-jackson/ │ │ └── pom.xml │ ├── sa-token-redis-template/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ └── dao/ │ │ │ └── SaTokenDaoForRedisTemplate.java │ │ └── resources/ │ │ └── META-INF/ │ │ ├── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── spring.factories │ ├── sa-token-redis-template-jdk-serializer/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ └── dao/ │ │ │ ├── SaTokenDaoForRedisTemplate.java │ │ │ └── SaTokenDaoForRedisTemplateUseJdkSerializer.java │ │ └── resources/ │ │ └── META-INF/ │ │ ├── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── spring.factories │ ├── sa-token-redisson/ │ │ ├── README.md │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── cn/ │ │ └── dev33/ │ │ └── satoken/ │ │ └── dao/ │ │ └── SaTokenDaoForRedisson.java │ ├── sa-token-redisson-spring-boot-starter/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ └── spring/ │ │ │ └── SaTokenDaoForRedissonBeanRegister.java │ │ └── resources/ │ │ └── META-INF/ │ │ ├── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── spring.factories │ ├── sa-token-redisx/ │ │ ├── README.md │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ └── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ └── dao/ │ │ │ └── SaTokenDaoForRedisx.java │ │ └── test/ │ │ ├── java/ │ │ │ └── demo/ │ │ │ ├── App.java │ │ │ └── Config.java │ │ └── resources/ │ │ └── app.yml │ ├── sa-token-serializer-features/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ ├── plugin/ │ │ │ │ └── SaTokenPluginForSerializerFeatures.java │ │ │ └── serializer/ │ │ │ ├── SaSerializerForBase64UseCustomCharacters.java │ │ │ ├── SaSerializerForBase64UseEmoji.java │ │ │ ├── SaSerializerForBase64UsePeriodicTable.java │ │ │ ├── SaSerializerForBase64UseSpecialSymbols.java │ │ │ └── SaSerializerForBase64UseTianGan.java │ │ └── resources/ │ │ └── META-INF/ │ │ └── satoken/ │ │ └── cn.dev33.satoken.plugin.SaTokenPlugin │ ├── sa-token-sign/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ ├── plugin/ │ │ │ │ └── SaTokenPluginForSign.java │ │ │ └── sign/ │ │ │ ├── SaSignManager.java │ │ │ ├── annotation/ │ │ │ │ ├── SaCheckSign.java │ │ │ │ └── handle/ │ │ │ │ └── SaCheckSignHandler.java │ │ │ ├── config/ │ │ │ │ ├── SaSignConfig.java │ │ │ │ └── SaSignManyConfigWrapper.java │ │ │ ├── error/ │ │ │ │ └── SaSignErrorCode.java │ │ │ ├── exception/ │ │ │ │ └── SaSignException.java │ │ │ └── template/ │ │ │ ├── SaSignMany.java │ │ │ ├── SaSignTemplate.java │ │ │ └── SaSignUtil.java │ │ └── resources/ │ │ └── META-INF/ │ │ └── satoken/ │ │ └── cn.dev33.satoken.plugin.SaTokenPlugin │ ├── sa-token-snack3/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ ├── json/ │ │ │ │ └── SaJsonTemplateForSnack3.java │ │ │ ├── plugin/ │ │ │ │ └── SaTokenPluginForSnack3.java │ │ │ └── session/ │ │ │ └── SaSessionForSnack3Customized.java │ │ └── resources/ │ │ └── META-INF/ │ │ └── satoken/ │ │ └── cn.dev33.satoken.plugin.SaTokenPlugin │ ├── sa-token-snack4/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ ├── json/ │ │ │ │ └── SaJsonTemplateForSnack4.java │ │ │ ├── plugin/ │ │ │ │ └── SaTokenPluginForSnack4.java │ │ │ └── session/ │ │ │ └── SaSessionForSnack4Customized.java │ │ └── resources/ │ │ └── META-INF/ │ │ └── satoken/ │ │ └── cn.dev33.satoken.plugin.SaTokenPlugin │ ├── sa-token-spring-aop/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ └── aop/ │ │ │ ├── SaAopPointcutAdvisorBeanRegister.java │ │ │ ├── SaAroundAnnotationMethodInterceptor.java │ │ │ └── SaAroundAnnotationPointcutAdvisor.java │ │ └── resources/ │ │ └── META-INF/ │ │ ├── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── spring.factories │ ├── sa-token-spring-el/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ ├── annotation/ │ │ │ │ └── SaCheckEL.java │ │ │ └── aop/ │ │ │ ├── SaCheckELAspect.java │ │ │ └── SaCheckELRootMap.java │ │ └── resources/ │ │ ├── META-INF/ │ │ │ ├── spring/ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── spring.factories │ │ └── spel-extension.json │ ├── sa-token-sso/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── cn/ │ │ └── dev33/ │ │ └── satoken/ │ │ └── sso/ │ │ ├── SaSsoManager.java │ │ ├── config/ │ │ │ ├── SaSsoClientConfig.java │ │ │ ├── SaSsoClientModel.java │ │ │ └── SaSsoServerConfig.java │ │ ├── error/ │ │ │ └── SaSsoErrorCode.java │ │ ├── exception/ │ │ │ └── SaSsoException.java │ │ ├── function/ │ │ │ ├── CheckTicketAppendDataFunction.java │ │ │ ├── DoLoginHandleFunction.java │ │ │ ├── NotLoginViewFunction.java │ │ │ ├── SaSsoMessageHandleFunction.java │ │ │ ├── SendRequestFunction.java │ │ │ └── TicketResultHandleFunction.java │ │ ├── message/ │ │ │ ├── SaSsoMessage.java │ │ │ ├── SaSsoMessageHolder.java │ │ │ └── handle/ │ │ │ ├── SaSsoMessageHandle.java │ │ │ ├── SaSsoMessageSimpleHandle.java │ │ │ ├── client/ │ │ │ │ └── SaSsoMessageLogoutCallHandle.java │ │ │ └── server/ │ │ │ ├── SaSsoMessageCheckTicketHandle.java │ │ │ └── SaSsoMessageSignoutHandle.java │ │ ├── model/ │ │ │ ├── SaCheckTicketResult.java │ │ │ ├── SaSsoClientInfo.java │ │ │ ├── SaSsoClientModel.java │ │ │ └── TicketModel.java │ │ ├── name/ │ │ │ ├── ApiName.java │ │ │ └── ParamName.java │ │ ├── processor/ │ │ │ ├── SaSsoClientProcessor.java │ │ │ ├── SaSsoProcessorHelper.java │ │ │ └── SaSsoServerProcessor.java │ │ ├── strategy/ │ │ │ ├── SaSsoClientStrategy.java │ │ │ └── SaSsoServerStrategy.java │ │ ├── template/ │ │ │ ├── SaSsoClientTemplate.java │ │ │ ├── SaSsoClientUtil.java │ │ │ ├── SaSsoServerTemplate.java │ │ │ ├── SaSsoServerUtil.java │ │ │ ├── SaSsoTemplate.java │ │ │ └── SaSsoUtil.java │ │ └── util/ │ │ └── SaSsoConsts.java │ ├── sa-token-temp-jwt/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ ├── plugin/ │ │ │ │ └── SaTokenPluginForTempForJwt.java │ │ │ └── temp/ │ │ │ └── jwt/ │ │ │ ├── SaJwtUtil.java │ │ │ ├── SaTempTemplateForJwt.java │ │ │ └── error/ │ │ │ └── SaTempJwtErrorCode.java │ │ └── resources/ │ │ └── META-INF/ │ │ └── satoken/ │ │ └── cn.dev33.satoken.plugin.SaTokenPlugin │ └── sa-token-thymeleaf/ │ ├── pom.xml │ └── src/ │ └── main/ │ └── java/ │ └── cn/ │ └── dev33/ │ └── satoken/ │ └── thymeleaf/ │ └── dialect/ │ ├── Sa-Token-Dialect.xml │ ├── SaTokenDialect.java │ └── SaTokenTagProcessor.java ├── sa-token-special-dependencies/ │ ├── pom.xml │ ├── sa-token-spring-boot2-dependencies/ │ │ └── pom.xml │ ├── sa-token-spring-boot3-dependencies/ │ │ └── pom.xml │ └── sa-token-spring-boot4-dependencies/ │ └── pom.xml ├── sa-token-starter/ │ ├── pom.xml │ ├── sa-token-jakarta-servlet/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── cn/ │ │ └── dev33/ │ │ └── satoken/ │ │ └── servlet/ │ │ ├── error/ │ │ │ └── SaServletErrorCode.java │ │ ├── model/ │ │ │ ├── SaRequestForServlet.java │ │ │ ├── SaResponseForServlet.java │ │ │ └── SaStorageForServlet.java │ │ ├── package-info.java │ │ └── util/ │ │ ├── SaJakartaServletOperateUtil.java │ │ └── SaTokenContextJakartaServletUtil.java │ ├── sa-token-jboot-plugin/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ └── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ └── jboot/ │ │ │ ├── PathAnalyzer.java │ │ │ ├── SaAnnotationInterceptor.java │ │ │ ├── SaJdkSerializer.java │ │ │ ├── SaRedisCache.java │ │ │ ├── SaTokenCacheDao.java │ │ │ ├── SaTokenContextForJboot.java │ │ │ └── SaTokenPathFilter.java │ │ └── test/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ └── jboot/ │ │ │ └── test/ │ │ │ ├── AppRun.java │ │ │ ├── AtteStartListener.java │ │ │ └── StpInterfaceImpl.java │ │ └── resources/ │ │ └── jboot.properties │ ├── sa-token-jfinal-plugin/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ └── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ └── jfinal/ │ │ │ ├── PathAnalyzer.java │ │ │ ├── SaAnnotationInterceptor.java │ │ │ ├── SaControllerContext.java │ │ │ ├── SaJdkSerializer.java │ │ │ ├── SaTokenActionHandler.java │ │ │ ├── SaTokenContextForJfinal.java │ │ │ ├── SaTokenDaoRedis.java │ │ │ └── SaTokenPathFilter.java │ │ └── test/ │ │ └── java/ │ │ └── cn/ │ │ └── dev33/ │ │ └── satoken/ │ │ └── jfinal/ │ │ └── test/ │ │ ├── AppRun.java │ │ ├── Config.java │ │ └── StpInterfaceImpl.java │ ├── sa-token-loveqq-boot-starter/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ └── loveqq/ │ │ │ └── boot/ │ │ │ ├── SaBeanInject.java │ │ │ ├── SaBeanRegister.java │ │ │ ├── apiKey/ │ │ │ │ ├── SaApiKeyBeanInject.java │ │ │ │ └── SaApiKeyBeanRegister.java │ │ │ ├── context/ │ │ │ │ ├── SaReactorHolder.java │ │ │ │ └── path/ │ │ │ │ └── ApplicationContextPathLoading.java │ │ │ ├── filter/ │ │ │ │ ├── SaFirewallCheckFilter.java │ │ │ │ ├── SaRequestFilter.java │ │ │ │ ├── SaTokenContextFilter.java │ │ │ │ └── SaTokenCorsFilter.java │ │ │ ├── interceptor/ │ │ │ │ └── SaInterceptor.java │ │ │ ├── model/ │ │ │ │ ├── LoveqqSaRequest.java │ │ │ │ ├── LoveqqSaResponse.java │ │ │ │ └── LoveqqSaStorage.java │ │ │ ├── oauth2/ │ │ │ │ ├── SaOAuth2BeanInject.java │ │ │ │ └── SaOAuth2BeanRegister.java │ │ │ ├── package-info.java │ │ │ ├── sign/ │ │ │ │ ├── SaSignBeanInject.java │ │ │ │ └── SaSignBeanRegister.java │ │ │ ├── sso/ │ │ │ │ ├── SaSsoBeanInject.java │ │ │ │ └── SaSsoBeanRegister.java │ │ │ ├── support/ │ │ │ │ └── SaPathMatcherHolder.java │ │ │ └── utils/ │ │ │ ├── SaTokenContextUtil.java │ │ │ └── SaTokenOperateUtil.java │ │ └── resources/ │ │ └── META-INF/ │ │ └── k.factories │ ├── sa-token-reactor-spring-boot-starter/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ └── reactor/ │ │ │ ├── package-info.java │ │ │ └── spring/ │ │ │ └── SpringBootVersionCompatibilityChecker.java │ │ └── resources/ │ │ └── META-INF/ │ │ ├── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── spring.factories │ ├── sa-token-reactor-spring-boot3-starter/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ └── reactor/ │ │ │ └── Placeholder.java │ │ └── resources/ │ │ └── META-INF/ │ │ └── spring/ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ ├── sa-token-reactor-spring-boot4-starter/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ └── reactor/ │ │ │ └── Placeholder.java │ │ └── resources/ │ │ └── META-INF/ │ │ └── spring/ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ ├── sa-token-servlet/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── cn/ │ │ └── dev33/ │ │ └── satoken/ │ │ └── servlet/ │ │ ├── error/ │ │ │ └── SaServletErrorCode.java │ │ ├── model/ │ │ │ ├── SaRequestForServlet.java │ │ │ ├── SaResponseForServlet.java │ │ │ └── SaStorageForServlet.java │ │ ├── package-info.java │ │ └── util/ │ │ ├── SaServletOperateUtil.java │ │ └── SaTokenContextServletUtil.java │ ├── sa-token-solon-plugin/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── cn/ │ │ │ │ └── dev33/ │ │ │ │ └── satoken/ │ │ │ │ └── solon/ │ │ │ │ ├── SaBeanInject.java │ │ │ │ ├── SaBeanRegister.java │ │ │ │ ├── SaSolonPlugin.java │ │ │ │ ├── apikey/ │ │ │ │ │ ├── SaApiKeyBeanInject.java │ │ │ │ │ └── SaApiKeyBeanRegister.java │ │ │ │ ├── error/ │ │ │ │ │ └── SaSolonErrorCode.java │ │ │ │ ├── integration/ │ │ │ │ │ ├── SaFirewallCheckFilterForSolon.java │ │ │ │ │ ├── SaTokenContextFilterForSolon.java │ │ │ │ │ ├── SaTokenCorsFilterForSolon.java │ │ │ │ │ ├── SaTokenFilter.java │ │ │ │ │ └── SaTokenInterceptor.java │ │ │ │ ├── model/ │ │ │ │ │ ├── SaContextForSolon.java │ │ │ │ │ ├── SaRequestForSolon.java │ │ │ │ │ ├── SaResponseForSolon.java │ │ │ │ │ └── SaStorageForSolon.java │ │ │ │ ├── oauth2/ │ │ │ │ │ ├── SaOAuth2BeanInject.java │ │ │ │ │ └── SaOAuth2BeanRegister.java │ │ │ │ ├── package-info.java │ │ │ │ ├── sign/ │ │ │ │ │ ├── SaSignBeanInject.java │ │ │ │ │ └── SaSignBeanRegister.java │ │ │ │ ├── sso/ │ │ │ │ │ ├── SaSsoBeanInject.java │ │ │ │ │ └── SaSsoBeanRegister.java │ │ │ │ └── util/ │ │ │ │ ├── SaSolonOperateUtil.java │ │ │ │ └── SaTokenContextSolonUtil.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── solon/ │ │ │ └── cn.dev33.satoken.solon.properties │ │ └── test/ │ │ ├── java/ │ │ │ ├── demo/ │ │ │ │ ├── App.java │ │ │ │ └── Config.java │ │ │ └── demo2/ │ │ │ ├── App.java │ │ │ └── Config.java │ │ └── resources/ │ │ └── app.yml │ ├── sa-token-spring-boot-reactor-v2v3v4-common/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── cn/ │ │ └── dev33/ │ │ └── satoken/ │ │ └── reactor/ │ │ ├── context/ │ │ │ ├── SaReactorHolder.java │ │ │ └── SaReactorSyncHolder.java │ │ ├── filter/ │ │ │ ├── SaFirewallCheckFilterForReactor.java │ │ │ ├── SaReactorFilter.java │ │ │ ├── SaTokenContextFilterForReactor.java │ │ │ └── SaTokenCorsFilterForReactor.java │ │ ├── model/ │ │ │ ├── SaRequestForReactor.java │ │ │ ├── SaResponseForReactor.java │ │ │ └── SaStorageForReactor.java │ │ ├── package-info.java │ │ ├── spring/ │ │ │ ├── SaTokenContextForSpringReactor.java │ │ │ └── SaTokenContextRegister.java │ │ └── util/ │ │ └── SaReactorOperateUtil.java │ ├── sa-token-spring-boot-starter/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ ├── filter/ │ │ │ │ ├── SaFirewallCheckFilterForServlet.java │ │ │ │ ├── SaServletFilter.java │ │ │ │ ├── SaTokenContextFilterForServlet.java │ │ │ │ └── SaTokenCorsFilterForServlet.java │ │ │ ├── interceptor/ │ │ │ │ └── SaInterceptor.java │ │ │ ├── package-info.java │ │ │ └── spring/ │ │ │ ├── SaTokenContextForSpring.java │ │ │ ├── SaTokenContextRegister.java │ │ │ ├── SpringBootVersionCompatibilityChecker.java │ │ │ └── SpringMVCUtil.java │ │ └── resources/ │ │ └── META-INF/ │ │ ├── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── spring.factories │ ├── sa-token-spring-boot-webmvc-reactor-v2v3v4-common/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ ├── package-info.java │ │ │ └── spring/ │ │ │ ├── SaBeanInject.java │ │ │ ├── SaBeanRegister.java │ │ │ ├── apikey/ │ │ │ │ ├── SaApiKeyBeanInject.java │ │ │ │ ├── SaApiKeyBeanRegister.java │ │ │ │ └── package-info.java │ │ │ ├── context/ │ │ │ │ └── path/ │ │ │ │ └── ApplicationContextPathLoading.java │ │ │ ├── oauth2/ │ │ │ │ ├── SaOAuth2BeanInject.java │ │ │ │ ├── SaOAuth2BeanRegister.java │ │ │ │ └── package-info.java │ │ │ ├── pathmatch/ │ │ │ │ ├── SaPathMatcherHolder.java │ │ │ │ ├── SaPathPatternParserUtil.java │ │ │ │ └── SaPatternsRequestConditionHolder.java │ │ │ ├── sign/ │ │ │ │ ├── SaSignBeanInject.java │ │ │ │ ├── SaSignBeanRegister.java │ │ │ │ └── package-info.java │ │ │ └── sso/ │ │ │ ├── SaSsoBeanInject.java │ │ │ ├── SaSsoBeanRegister.java │ │ │ └── package-info.java │ │ └── resources/ │ │ └── META-INF/ │ │ ├── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── spring.factories │ ├── sa-token-spring-boot-webmvc-v3v4-common/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── cn/ │ │ │ └── dev33/ │ │ │ └── satoken/ │ │ │ ├── filter/ │ │ │ │ ├── SaFirewallCheckFilterForJakartaServlet.java │ │ │ │ ├── SaServletFilter.java │ │ │ │ ├── SaTokenContextFilterForJakartaServlet.java │ │ │ │ └── SaTokenCorsFilterForJakartaServlet.java │ │ │ ├── interceptor/ │ │ │ │ └── SaInterceptor.java │ │ │ ├── package-info.java │ │ │ └── spring/ │ │ │ ├── SaTokenContextForSpringInJakartaServlet.java │ │ │ ├── SaTokenContextRegister.java │ │ │ └── SpringMVCUtil.java │ │ └── resources/ │ │ └── META-INF/ │ │ └── spring/ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ ├── sa-token-spring-boot3-starter/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── cn/ │ │ └── dev33/ │ │ └── satoken/ │ │ └── Placeholder.java │ └── sa-token-spring-boot4-starter/ │ ├── pom.xml │ └── src/ │ └── main/ │ └── java/ │ └── cn/ │ └── dev33/ │ └── satoken/ │ └── Placeholder.java └── sa-token-test/ ├── pom.xml ├── sa-token-easy-test/ │ ├── pom.xml │ └── src/ │ └── test/ │ └── java/ │ └── com/ │ └── pj/ │ └── test/ │ ├── SaJsonTemplateTest.java │ └── model/ │ ├── SysRole.java │ └── SysUser.java ├── sa-token-jackson3-test/ │ ├── pom.xml │ └── src/ │ └── test/ │ └── java/ │ └── com/ │ └── pj/ │ └── test/ │ ├── SaJsonTemplateForJackson3Test.java │ └── model/ │ ├── SysRole.java │ └── SysUser.java ├── sa-token-json-test/ │ ├── pom.xml │ └── src/ │ └── test/ │ └── java/ │ └── com/ │ └── pj/ │ └── test/ │ ├── SaJsonTemplateTest.java │ └── model/ │ ├── SysRole.java │ └── SysUser.java ├── sa-token-jwt-test/ │ ├── pom.xml │ └── src/ │ └── test/ │ ├── java/ │ │ └── com/ │ │ └── pj/ │ │ └── test/ │ │ ├── JwtForMixinTest.java │ │ ├── JwtForSimpleTest.java │ │ ├── JwtForStatelessTest.java │ │ ├── StartUpApplication.java │ │ └── satoken/ │ │ └── StpInterfaceImpl.java │ └── resources/ │ └── application.yml ├── sa-token-serializer-test/ │ ├── pom.xml │ └── src/ │ └── test/ │ └── java/ │ └── com/ │ └── pj/ │ └── test/ │ ├── SaSerializerTemplateTest.java │ └── model/ │ ├── SysRole.java │ └── SysUser.java ├── sa-token-springboot-test/ │ ├── pom.xml │ └── src/ │ └── test/ │ ├── java/ │ │ └── cn/ │ │ └── dev33/ │ │ └── satoken/ │ │ ├── core/ │ │ │ ├── application/ │ │ │ │ └── SaApplicationTest.java │ │ │ ├── config/ │ │ │ │ └── SaTokenConfigTest.java │ │ │ ├── context/ │ │ │ │ └── model/ │ │ │ │ ├── SaCookieTest.java │ │ │ │ └── SaTokenContextDefaultImplTest.java │ │ │ ├── dao/ │ │ │ │ └── SaTokenDaoTest.java │ │ │ ├── fun/ │ │ │ │ └── IsRunFunctionTest.java │ │ │ ├── json/ │ │ │ │ └── SaJsonTemplateDefaultImplTest.java │ │ │ ├── package-info.java │ │ │ ├── secure/ │ │ │ │ ├── BCryptTest.java │ │ │ │ ├── SaBase64UtilTest.java │ │ │ │ └── SaSecureUtilTest.java │ │ │ ├── session/ │ │ │ │ ├── SaSessionCustomUtilTest.java │ │ │ │ ├── SaSessionTest.java │ │ │ │ └── SaTerminalInfoTest.java │ │ │ ├── sign/ │ │ │ │ └── SaSignTemplateTest.java │ │ │ ├── stp/ │ │ │ │ └── TokenInfoTest.java │ │ │ ├── temp/ │ │ │ │ └── SaTempTokenTest.java │ │ │ └── util/ │ │ │ ├── SaFoxUtilTest.java │ │ │ └── SaResultTest.java │ │ ├── integrate/ │ │ │ ├── StartUpApplication.java │ │ │ ├── annotation/ │ │ │ │ ├── SaAnnotationController.java │ │ │ │ ├── SaAnnotationControllerTest.java │ │ │ │ └── SaAnnotationIgnoreController.java │ │ │ ├── configure/ │ │ │ │ ├── HandlerException.java │ │ │ │ ├── SaTokenConfigure.java │ │ │ │ ├── StpInterfaceImpl.java │ │ │ │ └── inject/ │ │ │ │ ├── MySaBasicTemplate.java │ │ │ │ ├── MySaOAuth2Template.java │ │ │ │ ├── MySaSameTemplate.java │ │ │ │ ├── MySaSignTemplate.java │ │ │ │ ├── MySaSsoTemplate.java │ │ │ │ ├── MySaTempTemplate.java │ │ │ │ ├── MySaTokenDao.java │ │ │ │ ├── MySaTokenListener.java │ │ │ │ └── MyStpLogic.java │ │ │ ├── login/ │ │ │ │ ├── LoginController.java │ │ │ │ └── LoginControllerTest.java │ │ │ ├── more/ │ │ │ │ ├── MoreController.java │ │ │ │ └── MoreControllerTest.java │ │ │ ├── router/ │ │ │ │ ├── RouterController.java │ │ │ │ ├── RouterControllerTest.java │ │ │ │ └── SaTokenConfigure2.java │ │ │ └── same/ │ │ │ ├── SaSameTokenController.java │ │ │ └── SaSameTokenControllerTest.java │ │ ├── springboot/ │ │ │ ├── BasicsTest.java │ │ │ ├── ManyLoginTest.java │ │ │ ├── SaPathMatcherTest.java │ │ │ ├── SpringMVCUtilTest.java │ │ │ ├── StartUpApplication.java │ │ │ └── satoken/ │ │ │ └── StpInterfaceImpl.java │ │ └── util/ │ │ └── SoMap.java │ └── resources/ │ ├── application.yml │ └── sa-token2.properties └── sa-token-temp-jwt-test/ ├── pom.xml └── src/ └── test/ ├── java/ │ └── com/ │ └── pj/ │ └── test/ │ ├── SaTempTemplateForJwtTest.java │ └── StartUpApplication.java └── resources/ └── application.yml