Showing preview only (5,491K chars total). Download the full file or copy to clipboard to get everything.
Repository: dromara/Sa-Token
Branch: dev
Commit: 47dff7059dab
Files: 1492
Total size: 4.8 MB
Directory structure:
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
================================================
FILE CONTENTS
================================================
================================================
FILE: .agents/skills/README.md
================================================
# Agent Skills
本目录存放用于辅助 Sa-Token 项目开发的 Agent Skills。这些 skills 封装了项目特定的知识和操作规范,可在对话中直接调用。
## Skill 列表
| Skill 名称 | 功能描述 | 使用场景 | 入口文件 |
|-----------|---------|---------|---------|
| `commit-message` | 根据 git 变更生成符合 Sa-Token 项目风格的 commit message | 生成提交信息、写 commit message | [SKILL.md](commit-message/SKILL.md) |
| `organize-update-log` | 根据 git 提交记录生成符合项目规范的更新日志内容 | 整理更新日志、分析版本变更 | [SKILL.md](organize-update-log/SKILL.md) |
| `remove-redundancy-import` | 检查并移除 Java 类中未被引用的冗余 import | 清理冗余导包、优化 import | [SKILL.md](remove-redundancy-import/SKILL.md) |
| `upgrade-version` | 将项目版本号从旧版本升级到新版本,批量修改 pom、常量、Demo 及文档 | 升级版本、修改版本号、version bump | [SKILL.md](upgrade-version/SKILL.md) |
### 详细说明
#### commit-message
根据当前 git 变更(staged 或 unstaged),生成符合 [Conventional Commits](https://www.conventionalcommits.org/) 格式、以中文为主的 commit message。支持识别新增文件、修复 bug、重构等多种变更类型。
#### organize-update-log
根据 git 提交记录,生成符合 `sa-token-doc/more/update-log.md` 格式的更新日志内容。自动分类到插件、starter、重构、Solon、示例、文档等版块。
#### remove-redundancy-import
扫描项目中所有 Java 类,检测未被引用的冗余 import,生成清理计划供审阅,确认后执行移除。支持通过内置 Python 脚本快速扫描。
#### upgrade-version
将 Sa-Token 项目版本号从旧版本升级到新版本。批量修改根 POM、BOM、SaTokenConsts、所有 Demo 子项目 pom.xml 及文档(README、index.html、doc.html、new-version.md 等)中的版本引用。明确排除历史记录、@since 标注、更新日志等不应修改的文件。
## 快速使用
在 AI 对话中,直接描述你的需求即可自动触发相应 skill:
```
用户:帮我生成 commit message
→ 自动使用 commit-message skill 分析 git 变更并生成提交信息
用户:整理一下更新日志
→ 自动使用 organize-update-log skill 生成更新日志
用户:清理一下冗余 import
→ 自动使用 remove-redundancy-import skill 扫描并清理未使用的 import
用户:把版本从 v1.44.0 升级到 v1.45.0
→ 自动使用 upgrade-version skill 批量修改版本号
```
## 新增 Skill 维护指南
当新增 skill 时,请同步更新本 README 文件,保持 skill 列表的完整性。
### Skill 目录结构规范
每个 skill 应创建独立的子目录,结构如下:
```
.agents/skills/
├── README.md # 本文件
└── skill-name/ # skill 目录(小写,短横线分隔)
├── SKILL.md # skill 主文件(必须包含 YAML 元数据和使用说明)
├── examples.md # 使用示例(可选)
├── reference.md # 参考文档(可选)
└── scan_redundant_imports.py # 辅助脚本(如需要)
```
### SKILL.md 文件格式
每个 `SKILL.md` 必须包含 YAML Front Matter:
```yaml
---
name: skill-name
description: 简要描述 skill 的功能和使用场景
---
```
### 更新 README 清单
新增 skill 后,请在本文件中:
1. 在 **Skill 列表** 表格中添加新行
2. 在 **详细说明** 小节添加对应的描述段落
3. (可选)在 **快速使用** 中添加使用示例
## 注意事项
- 所有 skill 遵循 Sa-Token 项目特定的规范和风格
- 部分 skill(如 `remove-redundancy-import`)在执行前需要用户确认
- 可参考每个 skill 目录下的 `examples.md` 或 `reference.md` 获取更多使用帮助
================================================
FILE: .agents/skills/commit-message/SKILL.md
================================================
---
name: commit-message
description: 根据 git 变更生成符合 Sa-Token 项目风格的 commit message。遵循 Conventional Commits 格式,以中文为主。当用户要求生成提交信息、写 commit message、或根据变更生成提交说明时使用。
---
# 生成 Commit Message
根据当前 git 变更(staged 或 unstaged),生成符合 Sa-Token 项目规范的 commit message。
## 使用时机
- 用户要求生成 commit message
- 用户要求根据变更写提交说明
- 用户说「帮我写个 commit」「生成提交信息」等
## 工作流程
### 第一步:获取变更内容
```bash
git status
git diff --staged
git diff
```
**必须包含的变更范围**:
- **staged 变更**:`git diff --staged`
- **unstaged 变更**:若无 staged,则用 `git diff` 查看工作区修改
- **未跟踪文件**:`git status` 中的 Untracked files 也要纳入分析,生成 commit message 时需一并考虑
若存在未跟踪的新增文件(如新 skill、新配置等),应在 message 中体现,或给出「包含全部变更」与「仅已修改文件」两种方案供用户选择。
### 第二步:分析变更类型
根据变更内容选择 type 前缀:
| type | 适用场景 |
|------|----------|
| feat | 新增功能、新模块、新插件 |
| fix | 修复 bug、修正错误 |
| refactor | 重构、优化结构、重命名、移除冗余 |
| perf | 性能优化(与 refactor 区分:侧重性能) |
| docs | 文档更新、README、错别字、同步链接 |
| style | 代码格式调整(缩进、空格等,不影响逻辑) |
| chore | 构建配置、.gitignore、注释修复、依赖更新 |
| test | 单元测试、测试用例 |
| demo | 示例项目、demo 相关 |
| memo | 备忘录、内部记录 |
| revert | 回滚某次提交 |
| AI | AI 创建的 skill、规则等 |
### 第三步:撰写描述
**基础格式**:`type: 简短描述` 或 `type(scope): 简短描述`
**scope 可选**:涉及特定模块时使用,如 `feat(sign)`、`fix(oauth2)`、`refactor(dependencies)`。
**规范**:
- **50 字规则**:subject 不超过 50 字符,保证在 git log 中完整显示
- **命令式语气**:用「修复」「新增」「优化」,不用「修复了」「新增了」
- **说明「做了什么」**:清晰表达变更内容,必要时说明「为什么」
- **以中文为主**:技术术语可保留英文(如 `StrFormatter`、`sa-token-jackson3`)
- **动词开头**:新增、修复、优化、重构、移除、同步、订正 等
**可选 Body/Footer**(重要变更时):
- Body:详细说明变更背景、动机,每行不超过 72 字符
- Footer:关联 Issue,如 `Fixes #123` 或 `merge: [pr N](url)`
### 第四步:输出
直接输出可复制的 commit message。若有多条合理方案,可给出 1~2 个备选。
## 格式示例
**简单提交**(常用):
```
feat: 添加 sa-token-jackson3 插件
fix(sign): 修复签名校验在空参数时的空指针
```
**带 scope**:
```
refactor(dependencies): 重构模块依赖层级
perf(oauth2): 优化 Client 信息读取算法
```
**带 body**(复杂变更):
```
feat: 新增重复登录处理策略
当同一账号不允许多客户端同时登录时,支持选择踢人下线或拦截本次登录。
```
## 参考资源
- 示例:详见 [examples.md](examples.md)
- 规范详解:详见 [reference.md](reference.md)
## 快速对照
| 变更内容 | 示例输出 |
|----------|----------|
| 新增插件 | `feat: 添加 sa-token-jackson3 插件` |
| 修复 bug | `fix: 修复 StpUtil.getLoginIdByTokenNotThinkFreeze 方法缺少 static 的问题` |
| 性能优化 | `perf: 优化 StrFormatter 常量封装` |
| 重构模块 | `refactor: 重构模块依赖层级` |
| 移除冗余 | `refactor: 移除冗余导包` |
| 文档更新 | `docs: 同步最新文章列表、赞助者名单` |
| 注释修复 | `chore: 修复注释错别字` |
| 新增 skill | `AI: 新增 skills/commit-message/SKILL.md,用于根据 git 变更生成符合项目风格的 commit message` |
================================================
FILE: .agents/skills/commit-message/examples.md
================================================
# Commit Message 示例
基于 Sa-Token 项目近期提交整理,遵循 Conventional Commits + 50/72 规则。
## feat - 新增功能
```
feat: 添加 sa-token-jackson3 插件
feat: 新增 sa-token-spring-boot4-starter 集成包
feat: 新增 sa-token-reactor-spring-boot4-starter 集成包
feat(sign): 新增签名模板自定义能力
```
## fix - 修复问题
```
fix: 修复 StpUtil.getLoginIdByTokenNotThinkFreeze 方法缺少 static 的问题
fix: 修正一处代码注释错误:SaTokenDao 注释中 数据有效期 应为 小于等于-2 (掉了等于)
fix: Bearer 全局统一大小写
fix: SaOAuth2Strategy中removeGrantTypeHandler的引用有误
```
## refactor - 重构/优化
```
refactor: 移除冗余导包
refactor: 重命名 SaRepeatLoginsMode -> SaReplacedLoginExitMode
refactor: 优化项目构建配置
refactor: 优化 OAuth2 模块在请求中读取 Client 信息算法
refactor: 优化模块依赖关系
refactor: 重构模块依赖层级
refactor: sa-token-dependencies 重构为 sa-token-basic-dependencies
refactor: SaTokenDubboContextFilter 改为使用 SaTokenContextDubboUtil 清理上下文
```
## perf - 性能优化
```
perf: 优化 StrFormatter 常量规范与封装
perf: 优化 pattern 缓存,消除魔法值
```
## docs - 文档
```
docs: 订正文档错别字
docs: 同步最新文章列表、赞助者名单
docs: 为 sa-token-sso 模块定义 STS 协议
docs: 优化 readme
docs: 同步最新博客链接
```
## chore - 杂项
```
chore: 修复注释错别字
chore: 增加忽略 .vscode 目录
```
## demo - 示例
```
demo: 新增 sa-token-demo-webflux-springboot4 示例
demo: 新增 SpringBoot4 整合 demo 示例
```
## test - 测试
```
test: 新增 sa-token-jackson3 单元测试
```
## memo - 备忘录
```
memo: 备忘录重构为专门的文件夹
```
## style - 代码格式
```
style: 统一代码缩进与空格
style: 修复 ESLint 警告
```
## revert - 回滚
```
revert: feat(sign): 新增签名模板自定义能力
```
## AI - AI 相关
```
AI: 新增 skills/remove-redundancy-import/SKILL.md,用于检查项目中的java类无效冗余导包信息并移除
AI: 新增 SKILL: organize-update-log ,用于格式化整理版本更新日志信息
```
================================================
FILE: .agents/skills/commit-message/reference.md
================================================
# Commit Message 规范参考
基于 Conventional Commits 与业界最佳实践整理。
## 核心规则
| 规则 | 说明 |
|------|------|
| 50 字规则 | subject 不超过 50 字符,便于 git log 完整显示 |
| 72 字规则 | body 每行不超过 72 字符,便于阅读与 diff |
| 命令式语气 | 用「修复」「新增」而非「修复了」「新增了」 |
| 说明动机 | 重要变更在 body 中说明「为什么」而不仅是「做了什么」 |
## 格式结构
```
<type>[(<scope>)]: <subject>
[optional body]
[optional footer(s)]
```
- **subject**:必填,简明扼要
- **body**:可选,详细说明
- **footer**:可选,如 `Fixes #123`、`BREAKING CHANGE: xxx`
## 类型速查
- **feat**:新功能
- **fix**:修复 bug
- **refactor**:重构(结构、逻辑)
- **perf**:性能优化
- **docs**:文档
- **style**:格式(不影响逻辑)
- **chore**:构建、配置、杂项
- **test**:测试
- **revert**:回滚
================================================
FILE: .agents/skills/organize-update-log/SKILL.md
================================================
---
name: organize-update-log
description: 根据 git 提交记录生成符合 Sa-Token 项目规范的更新日志内容。适用于分析指定版本之后的提交、提取变更并格式化为 update-log.md 风格。当用户需要生成更新日志、整理版本变更、或分析 release 之后的提交时使用。
---
# 整理更新日志
根据 git 提交记录,生成符合 `sa-token-doc/more/update-log.md` 格式的更新日志内容。
## 使用时机
- 用户要求生成/整理更新日志
- 用户要求分析「某版本之后」的提交变更
- 用户要求将 git 提交格式化为更新日志风格
- 准备发布新版本前整理 changelog
## 工作流程
### 第一步:确定基准版本
1. 询问用户基准版本(如 `v1.44.0`),或从上下文推断
2. 查找该版本的发布提交:
- 在 `SaTokenConsts.java` 或 `pom.xml` 中搜索版本号
- 或执行:`git log --oneline --all -- sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenConsts.java` 查找含 `release vX.X.X` 的提交
3. 记录基准提交 hash(如 `7bde74bc`)
### 第二步:获取提交列表
执行:
```bash
git log <基准提交>..HEAD --oneline --format="%h %s"
```
可选,获取更详细的变更文件:
```bash
git log <基准提交>..HEAD --stat --format="=== %h %s ==="
```
### 第三步:分类与映射
将每条提交按以下规则归类到对应板块:
| 提交关键词/内容 | 归属板块 |
|----------------|----------|
| feat.*jackson、plugin、插件 | 插件 |
| feat.*starter、spring-boot、reactor | starter |
| refactor.*依赖、dependencies、模块 | 重构 |
| refactor.*solon、gateway | Solon(单独列出) |
| fix.*dubbo、dubbo3 | 插件 |
| demo.*、示例 | 示例 或 starter |
| docs.*、文档 | 文档 |
| chore、.gitignore、.vscode | 其它 |
| merge.*loveqq、maven-pull | 其它(含 PR 链接) |
### 第四步:动作词映射
根据提交类型选择正确的动作词:
| 提交类型 | 动作词 | 示例 |
|----------|--------|------|
| feat、新增 | 新增 | 新增 `sa-token-jackson3` 插件 |
| fix、修复 | 修复 | 修复 Maven 父子项目依赖下载问题 |
| refactor、重构 | 重构 / 移除 | 重构模块依赖层级;移除 xxx 模块 |
| 优化、perf | 优化 | 优化 Gateway 接口处理 |
| 拆分 | 拆分 | (少见) |
| 文档更新 | 同步/新增/优化/修复 | 按具体内容选择 |
### 第五步:按格式输出
使用下方模板生成最终内容。详见 [format-reference.md](format-reference.md)。
## 输出模板
```markdown
### vX.X.X @YYYY-M-D(或:开发中 / 未发布)
- 插件:
- 新增:xxx。 **[重要]**(如适用)
- 修复:xxx。merge: [pr N](https://gitee.com/dromara/sa-token/pulls/N)(如适用)
- starter:
- 新增:xxx。
- 重构:
- 重构:xxx。
- 移除:xxx。
- Solon:(如有)
- 优化:xxx。merge: [pr N](url)
- 示例:(如有)
- 新增:xxx。
- 文档:
- 同步:xxx。
- 新增:xxx。
- 优化:xxx。
- 修复:xxx。
- 其它:
- 新增/修复/优化:xxx。
```
## 格式规则
1. **层级**:一级用 `-`,二级用 ` -`(Tab + 短横线)
2. **动作词**:每条以「新增」「修复」「重构」「优化」「移除」「同步」等开头
3. **重要标记**:对用户影响大的变更加 `**[重要]**`
4. **PR/Issue 链接**:提交信息含 `!358`、`pr 340` 等时,补充 `merge: [pr N](https://gitee.com/dromara/sa-token/pulls/N)`
5. **代码/模块名**:用反引号包裹,如 `` `sa-token-jackson3` ``
6. **合并同类**:多条相似文档类提交可合并为一条(如「同步公众号、博客、赞助者名单」)
## 常见板块
- **core**:核心逻辑、API、配置变更
- **SSO**:单点登录相关
- **OAuth2**:OAuth2 相关
- **插件**:插件包(jackson、dubbo、redis 等)
- **starter**:Spring Boot / Reactor 等 starter
- **示例**:demo 项目
- **文档**:文档、README、错别字
- **其它**:其它杂项
## 注意事项
- 合并提交(Merge branch)可忽略,只保留实际变更的提交
- 纯文档/错别字可适度合并,避免条目过多
- 版本号未发布时,可写 `v1.45.0(开发中)` 或 `未发布`
- 输出为可直接粘贴到 `update-log.md` 的 Markdown 片段
================================================
FILE: .agents/skills/organize-update-log/format-reference.md
================================================
# 更新日志格式参考
本文档提供 `sa-token-doc/more/update-log.md` 的格式细节与示例,供生成更新日志时参考。
## 版本标题格式
```markdown
### v1.44.0 @2025-6-7
```
- 版本号:`v` + 主.次.修订
- 日期:`@YYYY-M-D` 或 `@YYYY-M-DD`
- 未发布时:`v1.45.0(开发中)` 或 `v1.45.0(未发布)`
## 板块结构
```
- 板块名:
- 动作词:具体描述。 **[重要]**(可选) merge: [pr N](url)(可选)
```
- 一级:`- 板块名:`
- 二级:` - 动作词:描述。`(Tab 缩进)
## 动作词
| 动作词 | 含义 | 使用场景 |
|--------|------|----------|
| 新增 | 新功能、新模块 | feat、新增插件、新 starter |
| 修复 | Bug 修复 | fix |
| 重构 | 结构调整 | refactor |
| 优化 | 改进、优化 | 优化、perf |
| 移除 | 删除模块/功能 | 删除、移除 |
| 拆分 | 模块拆分 | 拆分 |
| 同步 | 内容同步 | 文档、赞助者、博客列表 |
| 补全 | 补充内容 | 补全文档、测试 |
| 升级 | 升级、变更 | 升级 API、模块 |
## 链接格式
**PR:**
```markdown
merge: [pr 340](https://gitee.com/dromara/sa-token/pulls/340)
```
**Issue:**
```markdown
fix: [#IA6ZK0](https://gitee.com/dromara/sa-token/issues/IA6ZK0)
```
## 重要标记
对用户影响较大的变更加 `**[重要]**`,通常放在句末、链接前:
```markdown
- 新增:新增 `sa-token-spring-boot4-starter` 集成包。 **[重要]**
- 新增:loveqq-framework 启动器集成。merge: [pr 340](url)
```
## 完整示例
```markdown
### v1.45.0(开发中)
- 插件:
- 新增:新增 `sa-token-jackson3` 插件,用于 Jackson 3 的 JSON 解析。 **[重要]**
- 新增:新增 `sa-token-jackson3` 单元测试。
- starter:
- 新增:新增 `sa-token-spring-boot4-starter` 集成包,支持 Spring Boot 4。 **[重要]**
- 新增:新增 `sa-token-reactor-spring-boot4-starter` 集成包,支持 WebFlux + Spring Boot 4。 **[重要]**
- 新增:新增 `sa-token-demo-webflux-springboot4` 示例。
- 新增:新增 Spring Boot 4 整合 demo 示例。
- 重构:
- 重构:`sa-token-dependencies` 重构为 `sa-token-basic-dependencies`。 **[重要]**
- 重构:重构 Spring Boot 相关集成包,优化依赖关系。
- 移除:移除 `sa-token-spring-boot-autoconfig` 模块,相关逻辑迁移至各 starter 内。 **[重要]**
- 重构:重构模块依赖层级,新增 `sa-token-special-dependencies`。
- Solon:
- 优化:`sa-token-solon-plugin` 优化 Gateway 接口的处理,避免使用路由接口。merge: [pr 348](https://gitee.com/dromara/sa-token/pulls/348)
- 其它:
- 新增:loveqq-framework 启动器集成。merge: [pr 340](https://gitee.com/dromara/sa-token/pulls/340)
- 修复:修复 Maven 父子项目无法下载依赖的问题。merge: [pr 358](https://gitee.com/dromara/sa-token/pulls/358)
- 文档:
- 同步:同步公众号文章列表、博客列表、赞助者名单。
- 新增:新增《Gitee 2025年度开源项目 Web应用开发 Top 2》证书展示。
- 优化:优化框架 Slogan、README、案例库展示。
- 修复:错别字修复;文档图片地址更换为本地文件。
- 其它:
- 新增:增加忽略 .vscode 目录。
- 优化:注释优化。
```
## 提交信息到条目的映射示例
| 提交信息 | 生成条目 |
|----------|----------|
| `feat: 添加 sa-token-jackson3 插件` | 新增:新增 `sa-token-jackson3` 插件,用于 Jackson 3 的 JSON 解析。 **[重要]** |
| `refactor: 移除 sa-token-spring-boot-autoconfig 模块` | 移除:移除 `sa-token-spring-boot-autoconfig` 模块,相关逻辑迁移至各 starter 内。 **[重要]** |
| `docs: 同步最新赞助者名单` | 同步:同步赞助者名单。 |
| `!358 update maven-pull.md` | 修复:修复 Maven 父子项目无法下载依赖的问题。merge: [pr 358](url) |
## 文档类合并建议
以下类型可合并为一条:
- 同步公众号、博客、赞助者名单 → 「同步:同步公众号文章列表、博客列表、赞助者名单。」
- 多条例错别字修复 → 「修复:错别字修复。」
- 多篇文档图片本地化 → 「修复:文档图片地址更换为本地文件(基础篇、深入篇、SSO篇等)。」
================================================
FILE: .agents/skills/remove-redundancy-import/SKILL.md
================================================
---
name: remove-redundancy-import
description: 检查 Java 类中未被引用的冗余 import 并移除。先输出待审阅计划,用户确认后执行。适用于用户要求清理冗余导包、优化 import、或执行 remove-redundancy-import 时使用。
---
# 移除冗余 import
检查项目中所有 Java 类的未使用 import,生成清理计划供用户审阅,确认后执行移除。
## 使用时机
- 用户要求清理冗余导包
- 用户要求优化 Java import
- 用户明确执行 `remove-redundancy-import` 或提及本 Skill 名称
## 强制流程
**必须先输出计划,用户确认后再执行移除。** 不得在未审阅的情况下直接修改文件。
## 工作流程
### 第一步:扫描与解析
**优先使用内置脚本**:在 Skill 目录下的 [scan_redundant_imports.py](scan_redundant_imports.py) 已实现完整扫描逻辑,可直接复用。
```bash
# 在项目根目录执行
python .agents/skills/remove-redundancy-import/scan_redundant_imports.py
# 或指定扫描根路径
python .agents/skills/remove-redundancy-import/scan_redundant_imports.py .
```
脚本输出格式:`文件路径 | 冗余import1; import2 | 数量`,末尾两行为 `TOTAL_FILES:N` 和 `TOTAL_IMPORTS:M`。
**若无 Python 环境**,可手动执行:
1. 使用 `Glob` 查找项目内所有 `**/*.java` 文件
2. 对每个文件:提取 `package`、`import`,按 [reference.md](reference.md) 判定是否被使用
3. 汇总存在冗余 import 的文件及列表
### 第二步:输出计划
使用下方模板生成计划报告,等待用户确认:
```markdown
## 冗余 import 清理计划
| 文件 | 待移除 import | 数量 |
|------|---------------|------|
| path/to/Foo.java | `java.util.Date`, `java.sql.Timestamp` | 2 |
| ... | ... | ... |
**共 N 个文件,M 处冗余 import。确认后执行移除。**
```
### 第三步:执行移除
用户确认后,对计划中的每个文件使用 `StrReplace` 移除对应 import 行:
- 逐行移除,每行格式为 `import ...;` 或 `import static ...;`
- 若某 import 后紧跟空行,可一并移除空行以保持格式整洁
- 移除后确认文件无语法错误
## 检测规则概要
- **普通 import**:取最后一段类名(如 `java.util.List` → `List`),在类体中搜索 `\bList\b`
- **static import**:取方法/字段名,在类体中搜索
- **同包冗余**:import 的包与当前文件 `package` 相同则视为冗余
- **通配符**:`import pkg.*` 跳过,不自动处理
详见 [reference.md](reference.md)。
## 注意事项
- 通配符 import 无法可靠判断,一律跳过
- 注解中的类型引用采用保守策略,宁可漏检不误删
- 移除后建议用户运行 `mvn compile` 验证
================================================
FILE: .agents/skills/remove-redundancy-import/reference.md
================================================
# 冗余 import 检测规则
## 解析步骤
### 1. 提取 package
匹配 `package\s+([\w.]+)\s*;`,得到当前文件所在包。
### 2. 提取 import
匹配以下模式(每行一条):
- `import\s+([\w.]+)\s*;` — 普通 import
- `import\s+static\s+([\w.]+)\s*;` — static 导入类
- `import\s+static\s+([\w.]+)\.(\w+)\s*;` — static 导入成员(方法/字段)
- `import\s+[\w.]+\s*\.\s*\*\s*;` — 通配符,**跳过不处理**
### 3. 确定简单名(Simple Name)
| import 类型 | 示例 | 简单名 |
|-------------|------|--------|
| 普通类 | `import java.util.List;` | `List` |
| 内部类 | `import pkg.Outer.Inner;` | `Inner` |
| static 类 | `import static pkg.Utils;` | `Utils` |
| static 成员 | `import static pkg.Utils.foo;` | `foo` |
### 4. 同包冗余
若 `import x.y.Z` 的包 `x.y` 与当前文件 `package x.y` 相同,则该 import 冗余(同包无需导入)。
### 5. 使用检测
在**类体**(`package` 和所有 `import` 之后)中搜索:
- 使用正则 `\bSimpleName\b` 匹配整词,避免误匹配子串
- 排除:注释、字符串字面量中的出现
- 若未找到匹配,则该 import 视为未使用
## 边界情况
| 情况 | 处理方式 |
|------|----------|
| `import pkg.*;` | 跳过,不自动移除 |
| 注解中的类型 `@Foo` | 若 `Foo` 为 import 的简单名,视为已使用 |
| 泛型 `List<String>` | `List` 会匹配,视为已使用 |
| 同名类(如 `java.util.Date` 与 `java.sql.Date`) | 两 import 都保留;若仅一个被使用,只移除未使用的 |
| Javadoc `@param` 中的类型 | 保守:若不确定则保留 |
## 正则参考
```
// package
package\s+([\w.]+)\s*;
// 普通 import(非通配符)
import\s+(?!static)([\w.]+)\s*;
// static import 成员
import\s+static\s+[\w.]+\.(\w+)\s*;
// static import 类
import\s+static\s+([\w.]+)\s*;
```
================================================
FILE: .agents/skills/remove-redundancy-import/scan_redundant_imports.py
================================================
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
冗余 import 扫描脚本
按 reference.md 规则扫描项目内 Java 文件,输出待移除的冗余 import 列表。
用法:在项目根目录执行 python scan_redundant_imports.py
"""
import os
import re
import sys
def get_simple_name(imp: str) -> str | None:
"""从 import 行提取简单名(用于类体搜索)"""
m = re.match(r'import\s+static\s+[\w.]+\.(\w+)\s*;', imp)
if m:
return m.group(1)
m = re.match(r'import\s+(?:static\s+)?([\w.]+)\s*;', imp)
if m:
return m.group(1).split('.')[-1]
return None
def get_import_full(imp: str) -> str:
"""提取 import 的完整限定名"""
m = re.match(r'import\s+(?:static\s+)?([\w.]+)\s*;', imp)
return m.group(1).strip() if m else ''
def get_import_package(imp: str) -> str:
"""提取 import 所在包(用于同包冗余判断)"""
m = re.match(r'import\s+(?:static\s+)?([\w.]+)\s*;', imp)
if m:
parts = m.group(1).split('.')
return '.'.join(parts[:-1]) if len(parts) > 1 else ''
return ''
def find_class_body_start(content: str) -> int:
"""找到类体起始位置(最后一个 import 之后)"""
last = 0
for m in re.finditer(r'import\s+(?:static\s+)?[\w.]+\s*;', content):
last = m.end()
return last
def main() -> None:
root = sys.argv[1] if len(sys.argv) > 1 else '.'
skip_dirs = {'target', 'build', '.git', 'node_modules'}
results = []
for dirpath, dirnames, filenames in os.walk(root):
dirnames[:] = [d for d in dirnames if d not in skip_dirs]
for f in filenames:
if not f.endswith('.java'):
continue
path = os.path.join(dirpath, f).replace('\\', '/')
try:
with open(path, 'r', encoding='utf-8', errors='ignore') as fp:
content = fp.read()
except OSError:
continue
pkg_match = re.search(r'package\s+([\w.]+)\s*;', content)
file_pkg = pkg_match.group(1) if pkg_match else ''
imports = re.findall(r'import\s+(?:static\s+)?[\w.]+\s*;', content)
imports = [i for i in imports if '*;' not in i and '.*' not in i]
body_start = find_class_body_start(content)
body = content[body_start:]
redundant = []
for imp in imports:
simple = get_simple_name(imp)
if not simple:
continue
imp_full = get_import_full(imp)
imp_pkg = get_import_package(imp)
if imp_pkg and imp_pkg == file_pkg:
redundant.append(imp_full)
continue
if not re.search(r'\b' + re.escape(simple) + r'\b', body):
redundant.append(imp_full)
if redundant:
results.append((path, redundant))
for path, red in results:
print(f"{path} | {'; '.join(red)} | {len(red)}")
print("TOTAL_FILES:" + str(len(results)))
print("TOTAL_IMPORTS:" + str(sum(len(r[1]) for r in results)))
if __name__ == '__main__':
main()
================================================
FILE: .agents/skills/upgrade-version/SKILL.md
================================================
---
name: upgrade-version
description: 将 Sa-Token 项目版本号升级到指定新版本。每次调用时先读取当前版本并提示用户,待用户输入目标版本后再执行批量修改。修改范围:pom.xml、核心常量、Demo 子项目及文档。当用户要求升级版本、修改版本号、或 version bump 时使用。
---
# Sa-Token 版本升级
将项目版本号升级到用户指定的新版本。每次调用时**先读取当前版本并询问目标版本**,用户确认后再批量修改核心构建、Demo 项目及文档中的版本引用。
## 使用时机
- 用户要求升级项目版本、修改版本号
- 用户说「版本从 vX.Y.Z 升级到 vX.Y.Z」「bump version」等
## 工作流程
### 第零步:询问目标版本(必须执行,不得跳过)
1. **读取当前版本**:从 `pom.xml` 的 `<revision>` 或 `SaTokenConsts.java` 的 `VERSION_NO` 中读取当前版本号
2. **提示用户**:明确告知「当前版本号是:xxx」
3. **等待输入**:询问「请输入要升级到的目标版本号(如 1.46.0):」
4. **确认后再执行**:**必须**等用户明确回复目标版本号后,才能执行后续修改步骤。若用户仅说「升级版本」而未给出目标版本,先完成本步骤再继续
### 第一步:核心构建配置(3 个文件)
使用「当前版本」「目标版本」进行替换:
| 文件 | 修改内容 |
|------|----------|
| `pom.xml` | `<revision>当前版本</revision>` → 目标版本 |
| `sa-token-bom/pom.xml` | `<revision>当前版本</revision>` → 目标版本 |
| `sa-token-core/.../SaTokenConsts.java` | `VERSION_NO = "v当前版本"` → `"v目标版本"` |
### 第二步:Demo 项目(sa-token-demo 下所有 pom.xml)
- 将 `<sa-token.version>当前版本</sa-token.version>` 改为目标版本
- **sa-token-demo-bom-import** 额外修改:`<dependencyManagement>` 内 `sa-token-bom` 的 `<version>当前版本</version>` → 目标版本
**查找方式**:`grep "当前版本" sa-token-demo --output-mode files_with_matches` 定位所有需修改的 pom.xml。
### 第三步:文档(6 个文件)
| 文件 | 修改内容 |
|------|----------|
| `README.md` | 标题 `v当前版本` → `v目标版本`;Maven 依赖 `<version>当前版本</version>` → 目标版本 |
| `sa-token-doc/README.md` | 标题 `v当前版本` → `v目标版本` |
| `sa-token-doc/index.html` | `<small>v当前版本</small>` → `v目标版本` |
| `sa-token-doc/doc.html` | `<sub>v当前版本</sub>` 和 `saTokenTopVersion = '当前版本'` → 目标版本 |
| `sa-token-doc/start/new-version.md` | 文案及 Maven 示例中的当前版本 → 目标版本 |
### 第四步:不修改的文件
以下为历史记录或示例,**保持原样**:
- `.agents/skills/` 下的示例(format-reference.md、SKILL.md 等)
- `MEMO/` 下的历史备忘录
- `sa-token-core/.../*.java` 中的 `@since X.Y.Z`(表示 API 引入版本,不随发布升级)
- `sa-token-doc/more/update-log.md`:更新日志应**新增**新版本条目,而非修改旧条目
- `sa-token-doc/more/blog.md`:历史博客链接
## 替换规则
- **pom.xml**:`当前版本` → `目标版本`
- **Java**:`"v当前版本"` → `"v目标版本"`
- **HTML/MD**:`v当前版本` 和 `当前版本` 按上下文分别替换为目标版本
## 执行顺序建议
1. 第零步:读取当前版本 → 提示用户 → 等待用户输入目标版本
2. 根 POM、sa-token-bom
3. SaTokenConsts.java
4. 批量修改 Demo pom.xml
5. 修改文档
## 验证
执行完成后,用 `grep "被替换的版本号"` 在项目根目录搜索,确认仅剩「不修改」列表中的文件仍含该版本(即修改已生效)。
================================================
FILE: .gitee/ISSUE_TEMPLATE.md
================================================
请在以下地址复制 issue 模板进行提交:
https://sa-token.cc/doc.html#/fun/issue-template
================================================
FILE: .github/ISSUE_TEMPLATE/bug反馈.md
================================================
---
name: bug反馈
about: 当你明确框架存在 bug 时,选择这个模板提交
title: ''
labels: ''
assignees: ''
---
### 使用版本:
### 报错信息:
### 希望结果:
### 复现步骤:
< 备注:如果复现步骤比较复杂,请将 demo 上传到 gitee 并留下地址 >
================================================
FILE: .github/ISSUE_TEMPLATE/功能提问.md
================================================
---
name: 功能提问
about: 对框架的某个功能看不明白时,选择这个模板提交
title: ''
labels: ''
assignees: ''
---
### 对以下问题有疑问:
< 备注:请尽量详细描述问题所在 >
================================================
FILE: .github/ISSUE_TEMPLATE/建议增加新功能.md
================================================
---
name: 建议增加新功能
about: 当你有一个好 idea 时,选择这个模板提交
title: ''
labels: ''
assignees: ''
---
### 建议增加的新功能:
### 应用场景阐述:
< 备注:请尽量详细描述功能应用场景 >
================================================
FILE: .github/ISSUE_TEMPLATE/预期不符.md
================================================
---
name: 预期不符
about: 当框架的运行结果和你的预期不一致时,选择这个模板提交
title: ''
labels: ''
assignees: ''
---
### 使用版本:
### 涉及的功能模块:
### 测试步骤:
+ 我经过以下步骤测试:
+ 得出以下结果:
+ 其中第 xx 行的代码输出表现 和文档上描述的不一致:
+ 我的理解是:
请问,是我的理解不对,还是文档出了问题?
================================================
FILE: .gitignore
================================================
target/
node_modules/
bin/
.settings/
unpackage/
.classpath
.project
*.iml
.factorypath
/.factorypath
.idea/
.vscode/
sa-token-three-plugin/
sa-token-doc/big-file/
.flattened-pom.xml
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
https://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2011-Present hubin.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: MEMO/1--统一定义properties尝试失败.md
================================================
## 未完成目标
### 1、尝试将所有 `<properties>` 依赖版本号定义在同一个 pom.xml 里。 **[❌失败]**
**尝试1:将所有 `<properties>` 定义在 `sa-token-dependencies` 里:**
结果: 无法在 `sa-token-spring-boot2/3/4-dependencies` 中引用这些 `<properties>`,因为 `<dependencyManagement> <dependencies> <scope>import</scope>` 只会导入目标的 `<dependencyManagement>` 版本号定义,不会导入目标的 `<properties>` 属性。
`<properties>` 只会在 父子结构中向下传递,不会在 `<dependencyManagement> <dependencies> <scope>import</scope>` 中传递。
**尝试2:将所有 `<properties>` 定义在 `sa-token-parent` 里:**
结果:在 `sa-token-dependencies` 里无法引用这些 `<properties>`,因为 `sa-token-parent` 不是 `sa-token-dependencies` 的父模块。
将 `sa-token-parent` 定义为 `sa-token-dependencies` 的父模块行吗?
不行,因为在 `sa-token-parent` 通过 `<dependencyManagement> <dependencies> <scope>import</scope>` 导入了 `sa-token-dependencies`,如果再把 `sa-token-parent` 定义为 `sa-token-dependencies` 的父模块,会造成循环依赖。
执行 `mvn package` 打包时,maven 会直接报错:
```
[ERROR] [ERROR] Some problems were encountered while processing the POMs:
[ERROR] The dependencies of type=pom and with scope=import form a cycle: cn.dev33:sa-token-parent:1.44.0 -> cn.dev33:sa-token-basic-dependencies:1.44.0 -> cn.dev33:sa-token-basic-dependencies:1.44.0 @ cn.dev33:sa-token-basic-dependencies:1.44.0
@
[ERROR] The build could not read 1 project -> [Help 1]
[ERROR]
[ERROR] The project cn.dev33:sa-token-parent:1.44.0 (E:\work\project-yun\sa-token\pom.xml) has 1 error
[ERROR] The dependencies of type=pom and with scope=import form a cycle: cn.dev33:sa-token-parent:1.44.0 -> cn.dev33:sa-token-basic-dependencies:1.44.0 -> cn.dev33:sa-token-basic-dependencies:1.44.0 @ cn.dev33:sa-token-basic-dependencies:1.44.0
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException
```
================================================
FILE: MEMO/2--2026-3-1_诡异调试记录.txt
================================================
2026-3-1 调试记录
启动 SaOAuth2ServerApplication,报错空指针:SaOAuth2ServerController 文件的 SaOAuth2Strategy.instance.notLoginView 空指针,SaOAuth2Strategy.instance 为 null
SaOAuth2Strategy.instance 的定义为:
public static final SaOAuth2Strategy instance = new SaOAuth2Strategy();
看代码是无论如何也不可能空指针的,诡异。
在 main 方法第一句加上测试
@SpringBootApplication
public class SaOAuth2ServerApplication {
public static void main(String[] args) {
System.out.println(SaOAuth2Strategy.instance);
SpringApplication.run(SaOAuth2ServerApplication.class, args);
System.out.println("\nSa-Token-OAuth2 Server端启动成功,配置如下:");
System.out.println(SaOAuth2Manager.getServerConfig());
}
}
打印居然为 null。
询问 AI,解释的乱七八糟,没有参考价值。
然后在根目录执行 mvn clean,居然无法成功。sa-token-test 模块无法 clean 。
报错 test 依赖不存在
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
最后必须在 dependencyManagement 加上这个才行
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.7.18</version>
</dependency>
可是就算不加,我也已经在 sa-token-spring-boot2-dependencies 中定义这个依赖了呀,为什么 在 sa-token-test 中无法 import spring-boot-starter-test ?
加了后,mvn clean 执行成功了
但是 mvn package 又开始无法打包。
可以昨天我明明能打包成功的啊?今天好像就变动了一下 sa-token-test 中的依赖配置。这有什么影响吗?
而且打包报错信息居然是:sa-token-jboot-plugin 插件中 javax.servlet.http.HttpServletRequest 无法转换为 HttpServletRequest
什么东西啊。
抓头挠腮解决不了。
这个插件已经十几个版本没有变动过代码了,代码不变,打包环境不变,命令不变,今天就突然报这种莫名其妙的错误,无奈,只能先去除这个插件,不让它参与打包。
继续打包,又开始报错:
sa-token-jfinal-plugin 中 cn.dev33.satoken.context.SaTokenContext 无法转换为 SaTokenContext。
这一瞬间我怀疑自己正处于梦中。
纠结了半分钟,继续去除此插件,继续打包。
打包成功了。
启动 SaOAuth2ServerApplication,启动成功,SaOAuth2ServerController 文件的 SaOAuth2Strategy.instance.notLoginView 空指针问题,消失了。
请问中间的这几个报错和这个空指针有任何关联吗?我请问呢?
注:以上所有叙述均为最后打包成功后进行回忆,可能细节上略有偏差。
两小时后:
本来可以运行成功的代码,只要一改子模块的代码就无法再运行成功,报错:java: 无法访问SaRequest。
试了好多解决方案,不行。
---
吃了两份炉盖香酥鸡饼,原来人在压力大的时候真的需要补充能量。
---
继续报错:
Maven 资源编译器: 模块 'sa-token-oauth2' 所需的 Maven 项目配置不可用。仅当从 IDE 启动外部构建时,才支持 Maven 项目编译。
sa-token-jwt、sso、sign 等模块均出现此问题
最后:
把项目删掉,重新下载一份,导入
项目可以运行成功了,但是每次修改子模块,在 demo 示例里无法实时起作用。需要 mvn clean install 才能看到效果。
最后:
取消勾选 maven 配置项:Delegate IDE build/run actions to Maven
一切问题解决,包括最上面的诡异调试现象也消失了。
idea,你给老子爬
================================================
FILE: MEMO/3--sa-token_最新版所有依赖.txt
================================================
<!-- sa-token-bom -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-bom</artifactId>
<version>1.45.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- sa-token-core -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-core</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-spring-boot-starter -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-spring-boot3-starter -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot3-starter</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-spring-boot4-starter -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot4-starter</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-reactor-spring-boot-starter -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-reactor-spring-boot-starter</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-reactor-spring-boot3-starter -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-reactor-spring-boot3-starter</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-reactor-spring-boot4-starter -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-reactor-spring-boot4-starter</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-jboot-plugin -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-jboot-plugin</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-jfinal-plugin -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-jfinal-plugin</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-loveqq-boot-starter -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-loveqq-boot-starter</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-servlet -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-servlet</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-jakarta-servlet -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-jakarta-servlet</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-plugin -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-plugin</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-alone-redis -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-alone-redis</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-redis-template -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-redis-template</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-redis-template-jdk-serializer -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-redis-template-jdk-serializer</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-redis-jackson -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-redis-jackson</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-redisson -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-redisson</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-redisson-spring-boot-starter -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-redisson-spring-boot-starter</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-redisx -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-redisx</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-hutool-timed-cache -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-hutool-timed-cache</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-caffeine -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-caffeine</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-jackson -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-jackson</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-jackson3 -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-jackson3</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-fastjson -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-fastjson</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-fastjson2 -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-fastjson2</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-snack3 -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-snack3</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-snack4 -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-snack4</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-serializer-features -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-serializer-features</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-thymeleaf -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-thymeleaf</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-freemarker -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-freemarker</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-dubbo -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-dubbo</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-dubbo3 -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-dubbo3</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-grpc -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-grpc</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-forest -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-forest</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-okhttps -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-okhttps</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-jwt -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-jwt</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-temp-jwt -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-temp-jwt</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-oauth2 -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-oauth2</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-apikey -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-apikey</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-sign -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-sign</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-quick-login -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-quick-login</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-sso -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-sso</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-spring-aop -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-aop</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-spring-el -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-el</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-spring-boot-webmvc-reactor-v2v3v4-common -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-webmvc-reactor-v2v3v4-common</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-spring-boot-reactor-v2v3v4-common -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-reactor-v2v3v4-common</artifactId>
<version>1.45.0</version>
</dependency>
<!-- sa-token-spring-boot-webmvc-v3v4-common -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-webmvc-v3v4-common</artifactId>
<version>1.45.0</version>
</dependency>
================================================
FILE: README.md
================================================
<p align="center">
<img alt="logo" src="https://sa-token.cc/logo.png" width="150" height="150">
</p>
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">Sa-Token v1.45.0</h1>
<h4 align="center">✨ 开源、免费、一站式 java 权限认证框架,让鉴权变得简单、优雅! </h4>
<p align="center">
<a href="https://gitee.com/dromara/sa-token/stargazers"><img src="https://gitee.com/dromara/sa-token/badge/star.svg?theme=gvp"></a>
<a href="https://gitee.com/dromara/sa-token/members"><img src="https://gitee.com/dromara/sa-token/badge/fork.svg?theme=gvp"></a>
<a href="https://atomgit.com/dromara/sa-token/stargazers"><img src="https://atomgit.com/dromara/Sa-Token/star/badge.svg"></a>
<a href="https://github.com/dromara/sa-token/stargazers"><img src="https://img.shields.io/github/stars/dromara/sa-token?style=flat-square&logo=GitHub"></a>
<a href="https://github.com/dromara/sa-token/network/members"><img src="https://img.shields.io/github/forks/dromara/sa-token?style=flat-square&logo=GitHub"></a>
<!-- <a href="https://github.com/dromara/sa-token/watchers"><img src="https://img.shields.io/github/watchers/dromara/sa-token?style=flat-square&logo=GitHub"></a> -->
<!-- <a href="https://github.com/dromara/sa-token/issues"><img src="https://img.shields.io/github/issues/dromara/sa-token.svg?style=flat-square&logo=GitHub"></a> -->
<a href="https://github.com/dromara/sa-token/blob/master/LICENSE"><img src="https://img.shields.io/github/license/dromara/sa-token.svg?style=flat-square"></a>
</p>
<!-- <p align="center">学习测试请拉取 master 分支,dev 是在开发分支 (在根目录执行 `git checkout master`)</p> -->
<p align="center"><a href="https://sa-token.cc?way=readme" target="_blank">在线文档:https://sa-token.cc</a></p>
---
### 📝 前言:
回望 2020 年初,我为 Sa-Token 提交第一行代码之际,彼时市面上 Java 缺少的不仅是一个简洁好用的鉴权框架,更是一整套清晰、自洽的权限架构设计思想。
因此,这几年间我将大量时间倾注在 Sa-Token 的文档编写,几乎每一章节、每一句话、每一个字都经过反复修改、精细打磨,以求做到最清晰、干练、易懂的表述。用心阅读文档,你学习到的将不止是 Sa-Token 框架本身,更是绝大多数场景下权限设计的最佳实践。
### 🛠️ Sa-Token 介绍
Sa-Token 是一个轻量级 Java 权限认证框架,目前拥有五大核心模块:登录认证、权限认证、单点登录、OAuth2.0、微服务鉴权。

要在 SpringBoot 项目中使用 Sa-Token,你只需要在 pom.xml 中引入依赖:
``` xml
<!-- Sa-Token 权限认证, 在线文档:https://sa-token.cc -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.45.0</version>
</dependency>
```
除了支持 SpringBoot2、Sa-Token 还为 SpringBoot3/4、Solon、JFinal 等常见 Web 框架提供集成包,做到真正的开箱即用。
<details>
<summary><b>简单示例展示:</b>(点击展开 / 折叠)</summary>
Sa-Token 旨在以简单、优雅的方式完成系统的权限认证部分,以登录认证为例,你只需要:
``` java
// 会话登录,参数填登录人的账号id
StpUtil.login(10001);
```
无需实现任何接口,无需创建任何配置文件,只需要这一句静态代码的调用,便可以完成会话登录认证。
如果一个接口需要登录后才能访问,我们只需调用以下代码:
``` java
// 校验当前客户端是否已经登录,如果未登录则抛出 `NotLoginException` 异常
StpUtil.checkLogin();
```
在 Sa-Token 中,大多数功能都可以一行代码解决:
踢人下线:
``` java
// 将账号id为 10077 的会话踢下线
StpUtil.kickout(10077);
```
权限认证:
``` java
// 注解鉴权:只有具备 `user:add` 权限的会话才可以进入方法
@SaCheckPermission("user:add")
public String insert(SysUser user) {
// ...
return "用户增加";
}
```
路由拦截鉴权:
``` java
// 根据路由划分模块,不同模块不同鉴权
registry.addInterceptor(new SaInterceptor(handler -> {
SaRouter.match("/user/**", r -> StpUtil.checkPermission("user"));
SaRouter.match("/admin/**", r -> StpUtil.checkPermission("admin"));
SaRouter.match("/goods/**", r -> StpUtil.checkPermission("goods"));
SaRouter.match("/orders/**", r -> StpUtil.checkPermission("orders"));
SaRouter.match("/notice/**", r -> StpUtil.checkPermission("notice"));
// 更多模块...
})).addPathPatterns("/**");
```
**如果您曾经使用过 Shiro、SpringSecurity,在切换到 Sa-Token 后,您将体会到质的飞跃。**
<!-- 当你受够 Shiro、SpringSecurity 等框架的三拜九叩之后,你就会明白,相对于这些传统老牌框架,Sa-Token 的 API 设计是多么的简单、优雅! -->
</details>
<details>
<summary> <b>核心模块一览:</b>(点击展开 / 折叠) </summary>
- **登录认证** —— 单端登录、多端登录、同端互斥登录、七天内免登录。
- **权限认证** —— 权限认证、角色认证、会话二级认证。
- **踢人下线** —— 根据账号id踢人下线、根据Token值踢人下线。
- **注解式鉴权** —— 优雅的将鉴权与业务代码分离。
- **路由拦截式鉴权** —— 根据路由拦截鉴权,可适配 restful 模式。
- **Session会话** —— 全端共享Session,单端独享Session,自定义Session,方便的存取值。
- **持久层扩展** —— 可集成 Redis,重启数据不丢失。
- **前后台分离** —— APP、小程序等不支持 Cookie 的终端也可以轻松鉴权。
- **Token风格定制** —— 内置六种 Token 风格,还可:自定义 Token 生成策略。
- **记住我模式** —— 适配 [记住我] 模式,重启浏览器免验证。
- **二级认证** —— 在已登录的基础上再次认证,保证安全性。
- **模拟他人账号** —— 实时操作任意用户状态数据。
- **临时身份切换** —— 将会话身份临时切换为其它账号。
- **同端互斥登录** —— 像QQ一样手机电脑同时在线,但是两个手机上互斥登录。
- **账号封禁** —— 登录封禁、按照业务分类封禁、按照处罚阶梯封禁。
- **密码加密** —— 提供基础加密算法,可快速 MD5、SHA1、SHA256、AES 加密。
- **会话查询** —— 提供方便灵活的会话查询接口。
- **Http Basic认证** —— 一行代码接入 Http Basic、Digest 认证。
- **全局侦听器** —— 在用户登陆、注销、被踢下线等关键性操作时进行一些AOP操作。
- **全局过滤器** —— 方便的处理跨域,全局设置安全响应头等操作。
- **多账号体系认证** —— 一个系统多套账号分开鉴权(比如商城的 User 表和 Admin 表)
- **单点登录** —— 内置三种单点登录模式:同域、跨域、同Redis、跨Redis、前后端分离等架构都可以搞定。
- **单点注销** —— 任意子系统内发起注销,即可全端下线。
- **OAuth2.0认证** —— 轻松搭建 OAuth2.0 服务,支持openid模式 。
- **分布式会话** —— 提供共享数据中心分布式会话方案。
- **微服务网关鉴权** —— 适配Gateway、ShenYu、Zuul等常见网关的路由拦截认证。
- **RPC调用鉴权** —— 网关转发鉴权,RPC调用鉴权,让服务调用不再裸奔
- **临时Token认证** —— 解决短时间的 Token 授权问题。
- **独立Redis** —— 将权限缓存与业务缓存分离。
- **Quick快速登录认证** —— 为项目零代码注入一个登录页面。
- **标签方言** —— 提供 Thymeleaf 标签方言集成包,提供 beetl 集成示例。
- **jwt集成** —— 提供三种模式的 jwt 集成方案,提供 token 扩展参数能力。
- **RPC调用状态传递** —— 提供 dubbo、grpc 等集成包,在RPC调用时登录状态不丢失。
- **参数签名** —— 提供跨系统API调用签名校验模块,防参数篡改,防请求重放。
- **自动续签** —— 提供两种Token过期策略,灵活搭配使用,还可自动续签。
- **开箱即用** —— 提供SpringMVC、WebFlux、Solon 等常见框架集成包,开箱即用。
- **最新技术栈** —— 适配最新技术栈:支持 SpringBoot 3.x,jdk 17。
</details>
### 🍃 SSO 单点登录
Sa-Token SSO 分为三种模式,可解决:`同域、跨域、共享Redis、跨Redis、前后端一体、前后端分离、纯 js、vue2、vue3、java 项目、非 java 项目` 等架构下的 SSO 认证需求:

| 系统架构 | 采用模式 | 简介 | 文档链接 |
| :-------- | :-------- |:----------------| :-------- |
| 前端同域 + 后端同 Redis | 模式一 | 共享Cookie同步会话 | [文档](https://sa-token.cc/doc.html#/sso/sso-type1)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso1-client) |
| 前端不同域 + 后端同 Redis | 模式二 | URL重定向传播会话 | [文档](https://sa-token.cc/doc.html#/sso/sso-type2)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso2-client) |
| 前端不同域 + 后端 不同Redis | 模式三 | HTTP请求获取会话 | [文档](https://sa-token.cc/doc.html#/sso/sso-type3)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso3-client) |
1. 前端同域:就是指多个系统可以部署在同一个主域名之下,比如:`c1.domain.com`、`c2.domain.com`、`c3.domain.com`
2. 后端同 Redis:就是指多个系统可以连接同一个 Redis,共享会话数据。
3. 如果无法做到前端同域、后端同 Redis,可以走托底的模式三:Http请求校验 ticket 获取会话。
4. 提供:NoSdk 模式示例 + sso-server 接口文档,非 Sa-Token 项目、非 java 项目也可以对接。
5. 提供:多重安全校验:域名校验、ticket校验、参数签名校验,有效防 ticket 劫持,防请求重放等攻击。
6. 提供:大量实战痛点教学:sso-server 前后端分离设计、sso-client 前后端分离设计、用户数据同步/迁移方案设计。
7. 提供:直接可运行的 demo 示例,助你快速熟悉 SSO 大致登录流程。
8. 提供:深度细节优化,参数防丢:笔者曾试验多个SSO框架,均有参数丢失情况,比如登录前是:`http://a.com?id=1&name=2`,登录成功后就变成了:`http://a.com?id=1`,Sa-Token-SSO 内有专门算法保证了参数不丢失,登录成功后精准原路返回。
### 🍂 OAuth2 授权认证
Sa-Token OAuth2 模块分为四种授权模式,解决不同场景下的授权需求
| 授权模式 | 简介 |
| :-------- | :-------- |
| 授权码式 | OAuth2 标准授权步骤,server 端下放 code,client 端获取 code 码兑换 access_token |
| 隐藏式 | 备用选择,server 端使用 URL 重定向方式直接将 access_token 下放到 client 端页面 |
| 密码式 | client 直接拿着用户的账号密码换取授权 access_token |
| 客户端凭证式 | server 端针对 client 级别的 client_token,代表应用自身的资源授权 |
详细参考文档:[https://sa-token.cc/doc.html#/oauth2/readme](https://sa-token.cc/doc.html#/oauth2/readme)
### 📖❓ 疑问解答
**1、Sa-Token 功能全不全?**
七年磨一剑:五大核心模块(登录、鉴权、SSO、OAuth2、微服务) + 众多实用插件 (短 token、jwt 集成、API 参数签名、API Key 秘钥授权...) 我们提供的不只是权限认证,我们提供的是一站式解决方案。
**2、Sa-Token 好不好学?**
中文文档 + 中文代码注释 + 中文交流社区 + 大量实战案例博客 + 多个视频教程 + 大量优秀开源项目集成案例。
**3、Sa-Token 用的人多不多?**
截止统计日 (2026-1-25) 起,Sa-Token 在:
- Gitee 关注量达到 48627 Star,位列平台所有推荐项目排行榜第一名。
- GitHub 关注量达到 18523 Star,是主要竞争框架 Spring Security 的 1.97 倍,Apache Shiro 的 4.19 倍。
- 25+ 微信粉丝群 (500人),8+ QQ粉丝群 (1000人 or 2000人) ,在线文档访问量月PV 20万+。
这是众多开发者用脚投票的数据,相信这些数据比任何言语都能证明 Sa-Token 的热度。
**4、Sa-Token 有哪些权威认证?**
曾获荣誉包括但不限于:Gitee GVP 最有价值开源项目、GitCode G-Star 优质开源项目、OSCHINA 2021 人气指数 TOP 30 开源项目、OSCHINA 2022 年度最火热中国开源项目社区之一、开放原子基金会2023快速成长开源项目、 Dromara 组织顶尖项目(之一)、可信开源社区共同体预备成员、所在开源社区 “Dromara” 荣获《2024中国互联网发展创新与投资大赛(开源)》二等奖。 Gitee High Star 计划项目(5000+star)。Gitee 2025年度开源项目 Web应用开发 Top 2。
**5、Sa-Token 收费吗?**
Sa-Token 采用 Apache-2.0 开源协议,承诺框架本身与在线文档永久免费开放。当然如果您有心赞助 Sa-Token,我们也不回避:[赞助链接](https://sa-token.cc/doc.html#/more/sa-token-donate)。
我们将定期同步赞助者名单到在线文档展示。(您需要注意的一点是:该赞助仅为友情赞助,不提供任何商业交换)
**6、Sa-Token 是封装的 SpringSecurity 吗?是套壳 ApacheShiro 吗?**
不是。Sa-Token 不是一个后台模板,也不是针对 xx 框架的二次封装套壳,而是从 0 开始的纯血自研框架,核心包零依赖,完全自主可控的架构内核 + 众多主流框架的集成适配。
### 🚀 优秀开源集成案例
- [[ Snowy ]](https://gitee.com/xiaonuobase/snowy):国内首个国密前后分离快速开发平台,采用 Vue3 + Vite + SpringBoot + Mp + HuTool + SaToken。
- [[ RuoYi-Vue-Plus ]](https://gitee.com/dromara/RuoYi-Vue-Plus):重写RuoYi-Vue所有功能 集成 Sa-Token、Mybatis-Plus、Xxl-Job、knife4j、OSS 定期同步。
- [[ Smart-Admin ]](https://gitee.com/lab1024/smart-admin):SmartAdmin 国内首个以「高质量代码」为核心,「简洁、高效、安全」中后台快速开发平台。
- [[ 橙单 ]](https://gitee.com/orangeform/orange-admin): 橙单中台化低代码生成器。可完整支持多应用、多租户、多渠道、工作流、框架技术栈自由组合等。
- [[ 灯灯 ]](https://gitee.com/dromara/lamp-cloud): 专注于多租户解决方案的中后台快速开发平台。支持独立数据库、共享数据架构 和 非租户模式 ✨
- [[ 拾壹博客 ]](https://gitee.com/quequnlong/shiyi-blog):一款 vue + springboot 前后端分离的博客系统。
还有更多优秀开源案例无法逐一展示,请参考:[Awesome-Sa-Token](https://gitee.com/sa-token/awesome-sa-token)
### 🔗 友情链接
- [[ OkHttps ]](https://gitee.com/ejlchina-zhxu/okhttps):轻量级 http 通信框架,API无比优雅,支持 WebSocket、Stomp 协议
- [[ Forest ]](https://gitee.com/dromara/forest):声明式与编程式双修,让天下没有难以发送的 HTTP 请求
- [[ Bean Searcher ]](https://github.com/ejlchina/bean-searcher):专注高级查询的只读 ORM,使一行代码实现复杂列表检索!
- [[ Jpom ]](https://gitee.com/dromara/Jpom):简而轻的低侵入式在线构建、自动部署、日常运维、项目监控软件。
- [[ TLog ]](https://gitee.com/dromara/TLog):一个轻量级的分布式日志标记追踪神器。
- [[ hippo4j ]](https://gitee.com/agentart/hippo4j):强大的动态线程池框架,附带监控报警功能。
- [[ hertzbeat ]](https://gitee.com/dromara/hertzbeat):易用友好的开源实时监控告警系统,无需Agent,高性能集群,强大自定义监控能力。
- [[ Solon ]](https://gitee.com/noear/solon):一个更现代感的应用开发框架:更快、更小、更自由。
- [[ Chat2DB ]](https://github.com/chat2db/Chat2DB):一个AI驱动的数据库管理和BI工具,支持Mysql、pg、Oracle、Redis等22种数据库的管理。
### 📦 代码托管
- Gitee:[https://gitee.com/dromara/sa-token](https://gitee.com/dromara/sa-token)
- GitHub:[https://github.com/dromara/sa-token](https://github.com/dromara/sa-token)
- AtomGit:[https://atomgit.com/dromara/sa-token](https://atomgit.com/dromara/sa-token)
### 💬 交流群
<!-- QQ交流群:685792424 [点击加入](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Y05Ld4125W92YSwZ0gA8e3RhG9Q4Vsfx&authKey=IomXuIuhP9g8G7l%2ByfkrRsS7i%2Fna0lIBpkTXxx%2BQEaz0NNEyJq00kgeiC4dUyNLS&noverify=0&group_code=685792424)-->
QQ交流群:1081649142 [点击加入](https://qm.qq.com/q/SCAaZ6Ros2)
微信交流群:
<!-- <img src="https://oss.dev33.cn/sa-token/qr/wx-qr-m-400k.png" width="230px" title="微信群" /> -->
<img src="https://sa-token.cc/big-file/contact/i-wx-qr2.jpg" width="230px" title="微信群" />
PS:扫码添加微信 (备注:sa-token),邀您加入群聊。
<br>
<img class="s-w" src="https://sa-token.cc/big-file/contact/show/wx-group-show3--liubai.png" style="max-width: 50%;" alt="微信群" />
加入群聊的好处:
- 第一时间收到框架更新通知。
- 第一时间收到框架 bug 通知。
- 第一时间收到新增开源案例通知。
- 和众多大佬一起互相 (huá shuǐ) 交流 (mō yú) 🖐️🐟️。
================================================
FILE: mvn clean.bat
================================================
:: 整体clean
call mvn clean
:: demo模块clean
cd sa-token-demo
cd sa-token-demo-alone-redis & call mvn clean & cd ..
cd sa-token-demo-alone-redis-cluster & call mvn clean & cd ..
cd sa-token-demo-apikey & call mvn clean & cd ..
cd sa-token-demo-async & call mvn clean & cd ..
cd sa-token-demo-beetl & call mvn clean & cd ..
cd sa-token-demo-bom-import & call mvn clean & cd ..
cd sa-token-demo-case & call mvn clean & cd ..
cd sa-token-demo-device-lock & call mvn clean & cd ..
cd sa-token-demo-grpc & call mvn clean & cd ..
cd sa-token-demo-hutool-timed-cache & call mvn clean & cd ..
cd sa-token-demo-caffeine & call mvn clean & cd ..
cd sa-token-demo-jwt & call mvn clean & cd ..
cd sa-token-demo-quick-login & call mvn clean & cd ..
cd sa-token-demo-quick-login-sb3 & call mvn clean & cd ..
cd sa-token-demo-solon & call mvn clean & cd ..
cd sa-token-demo-solon-redisson & call mvn clean & cd ..
cd sa-token-demo-springboot & call mvn clean & cd ..
cd sa-token-demo-springboot3-redis & call mvn clean & cd ..
cd sa-token-demo-springboot4-redis & call mvn clean & cd ..
cd sa-token-demo-springboot-low-version & call mvn clean & cd ..
cd sa-token-demo-springboot-redis & call mvn clean & cd ..
cd sa-token-demo-springboot-redisson & call mvn clean & cd ..
cd sa-token-demo-sse & call mvn clean & cd ..
cd sa-token-demo-ssm & call mvn clean & cd ..
cd sa-token-demo-test & call mvn clean & cd ..
cd sa-token-demo-thymeleaf & call mvn clean & cd ..
cd sa-token-demo-freemarker & call mvn clean & cd ..
cd sa-token-demo-webflux & call mvn clean & cd ..
cd sa-token-demo-webflux-springboot3 & call mvn clean & cd ..
cd sa-token-demo-websocket & call mvn clean & cd ..
cd sa-token-demo-websocket-spring & call mvn clean & cd ..
cd sa-token-demo-dubbo
cd sa-token-demo-dubbo-consumer & call mvn clean & cd ..
cd sa-token-demo-dubbo-provider & call mvn clean & cd ..
cd sa-token-demo-dubbo3-consumer & call mvn clean & cd ..
cd sa-token-demo-dubbo3-provider & call mvn clean & cd ..
cd ..
cd sa-token-demo-oauth2
cd sa-token-demo-oauth2-client & call mvn clean & cd ..
cd sa-token-demo-oauth2-server & call mvn clean & cd ..
cd ..
cd sa-token-demo-remember-me
cd sa-token-demo-remember-me-server & call mvn clean & cd ..
cd ..
cd sa-token-demo-sso
cd sa-token-demo-sso-server & call mvn clean & cd ..
cd sa-token-demo-sso1-client & call mvn clean & cd ..
cd sa-token-demo-sso2-client & call mvn clean & cd ..
cd sa-token-demo-sso3-client & call mvn clean & cd ..
cd sa-token-demo-sso3-client-nosdk & call mvn clean & cd ..
cd sa-token-demo-sso3-client-resdk & call mvn clean & cd ..
cd sa-token-demo-sso3-client-anon & call mvn clean & cd ..
cd ..
cd sa-token-demo-sso-for-solon
cd sa-token-demo-sso1-client-solon & call mvn clean & cd ..
cd sa-token-demo-sso2-client-solon & call mvn clean & cd ..
cd sa-token-demo-sso3-client-solon & call mvn clean & cd ..
cd sa-token-demo-sso-server-solon & call mvn clean & cd ..
cd ..
cd ..
:: test clean
cd sa-token-test
call mvn clean
cd ..
:: 最后打印
echo;
echo;
echo ----------- clean end -----------
echo;
pause
================================================
FILE: mvn test.bat
================================================
:: 整体test
call mvn clean test
:: 最后打印
echo;
echo;
echo ----------- test end -----------
echo;
pause
================================================
FILE: pom.xml
================================================
<?xml version='1.0' encoding='utf-8'?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 基础信息 -->
<groupId>cn.dev33</groupId>
<artifactId>sa-token-parent</artifactId>
<packaging>pom</packaging>
<version>${revision}</version>
<!-- 项目介绍 -->
<name>sa-token</name>
<description>An open-source, free, and one-stop Java authentication framework that makes authentication simple and elegant!</description>
<url>https://github.com/dromara/sa-token</url>
<!-- 所有模块 -->
<modules>
<module>sa-token-dependencies</module>
<module>sa-token-special-dependencies</module>
<module>sa-token-bom</module>
<module>sa-token-core</module>
<module>sa-token-starter</module>
<module>sa-token-plugin</module>
</modules>
<!-- 开源协议 apache 2.0 -->
<licenses>
<license>
<name>Apache 2</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
<distribution>repo</distribution>
<comments>A business-friendly OSS license</comments>
</license>
</licenses>
<!-- 一些属性 -->
<properties>
<revision>1.45.0</revision>
<jdk.version>1.8</jdk.version>
<project.build.sourceEncoding>utf-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>utf-8</project.reporting.outputEncoding>
<!-- Maven GPG Plugin & Maven Central Portal -->
<maven-gpg-plugin.version>3.2.8</maven-gpg-plugin.version>
<central.publishing.maven.version>0.10.0</central.publishing.maven.version>
</properties>
<!-- 仓库信息 -->
<scm>
<tag>master</tag>
<url>https://github.com/dromara/sa-token.git</url>
<connection>scm:git:https://github.com/dromara/sa-token.git</connection>
<developerConnection>scm:git:https://github.com/dromara/sa-token.git</developerConnection>
</scm>
<!-- 作者信息 -->
<developers>
<developer>
<name>click33</name>
<email>2393584716@qq.com</email>
</developer>
</developers>
<!-- 仓库依赖 -->
<dependencies>
</dependencies>
<dependencyManagement>
<dependencies>
<!--
导入 sa-token-dependencies 所有版本定义,并传导到每个子项目。
需要注意的是:该 import 只会导入 <dependencyManagement> 部分,而不会导入 <dependencies> 部分和 <properties> 部分。
-->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-dependencies</artifactId>
<version>${project.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 项目构建 -->
<build>
<plugins>
<!-- Source -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.4.0</version>
<configuration>
<attach>true</attach>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 源码编译 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.15.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- API 文档 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.12.0</version>
<configuration>
<!-- 统一生成聚合文档,解决 mvn package 时控制台发出 javadoc 警告的问题 -->
<!-- <aggregate>true</aggregate> -->
<!-- 忽略部分 error 和 warning -->
<failOnError>false</failOnError>
<failOnWarnings>false</failOnWarnings>
<additionalOptions>-Xdoclint:none</additionalOptions>
<detectLinks>false</detectLinks>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>aggregate</goal>
</goals>
</execution>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<doclint>none</doclint>
</configuration>
</execution>
</executions>
</plugin>
<!-- flatten 统一版本号管理 -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>flatten-maven-plugin</artifactId>
<version>1.7.3</version>
<configuration>
<updatePomFile>true</updatePomFile>
<flattenMode>resolveCiFriendliesOnly</flattenMode>
</configuration>
<executions>
<execution>
<id>flatten</id>
<phase>process-resources</phase>
<goals>
<goal>flatten</goal>
</goals>
</execution>
<execution>
<id>flatten.clean</id>
<phase>clean</phase>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- gpg 签名 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>${maven-gpg-plugin.version}</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 新版 Central Portal 中央仓库上传 -->
<plugin>
<groupId>org.sonatype.central</groupId>
<artifactId>central-publishing-maven-plugin</artifactId>
<version>${central.publishing.maven.version}</version>
<extensions>true</extensions>
<configuration>
<!-- 必须与 settings.xml 中 server 的 id 一致 -->
<publishingServerId>central</publishingServerId>
<!-- 是否自动发布。设为 true 后,上传完成无需手动点击发布 -->
<!-- <autoPublish>true</autoPublish> -->
<!-- 等待直到发布完成,让构建过程等待最终结果 -->
<!-- <waitUntil>published</waitUntil> -->
</configuration>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<versionRange>[1.0.0,)</versionRange>
<goals>
<goal>enforce</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore />
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
================================================
FILE: preview-doc.bat
================================================
:: 运行前需要安装 browser-sync:
:: npm install -g browser-sync
cd sa-token-doc & browser-sync start --server --files ""
================================================
FILE: sa-token-bom/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-bom</artifactId>
<version>${revision}</version>
<packaging>pom</packaging>
<name>sa-token-bom</name>
<description>Sa-Token Bom</description>
<url>https://github.com/dromara/sa-token</url>
<properties>
<revision>1.45.0</revision>
<!-- Maven GPG Plugin & Maven Central Portal -->
<maven-gpg-plugin.version>3.2.8</maven-gpg-plugin.version>
<central.publishing.maven.version>0.10.0</central.publishing.maven.version>
</properties>
<!-- 开源协议 apache 2.0 -->
<licenses>
<license>
<name>Apache 2</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
<distribution>repo</distribution>
<comments>A business-friendly OSS license</comments>
</license>
</licenses>
<!-- 仓库信息 -->
<scm>
<tag>master</tag>
<url>https://github.com/dromara/sa-token.git</url>
<connection>scm:git:https://github.com/dromara/sa-token.git</connection>
<developerConnection>scm:git:https://github.com/dromara/sa-token.git</developerConnection>
</scm>
<!-- 作者信息 -->
<developers>
<developer>
<name>click33</name>
<email>2393584716@qq.com</email>
</developer>
</developers>
<dependencyManagement>
<dependencies>
<!-- sa-token 核心 -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-core</artifactId>
<version>${revision}</version>
</dependency>
<!-- region sa-token-starter -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-starter</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-jboot-plugin</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-jfinal-plugin</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-reactor-spring-boot-starter</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-reactor-spring-boot3-starter</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-reactor-spring-boot4-starter</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-servlet</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-jakarta-servlet</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-solon-plugin</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-webmvc-reactor-v2v3v4-common</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-reactor-v2v3v4-common</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-webmvc-v3v4-common</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot3-starter</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot4-starter</artifactId>
<version>${revision}</version>
</dependency>
<!-- endregion-->
<!-- region sa-token-plugin -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-plugin</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-alone-redis</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-alone-redis-by-spring-boot4</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-dubbo</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-dubbo3</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-grpc</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-redis-template</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-jackson</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-jackson3</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-fastjson</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-fastjson2</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-snack3</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-redis-jackson</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-forest</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-okhttps</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-redisson-spring-boot-starter</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-redisson</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-redisx</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-hutool-timed-cache</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-thymeleaf</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-freemarker</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-jwt</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-oauth2</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-apikey</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-sign</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-quick-login</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-aop</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-el</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-sso</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-temp-jwt</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-redis-template-jdk-serializer</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-serializer-features</artifactId>
<version>${revision}</version>
</dependency>
<!-- endregion-->
</dependencies>
</dependencyManagement>
<!-- 项目构建 -->
<build>
<plugins>
<!-- 源码编译 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.15.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- flatten 统一版本号管理 -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>flatten-maven-plugin</artifactId>
<version>1.7.3</version>
<configuration>
<updatePomFile>true</updatePomFile>
<flattenMode>resolveCiFriendliesOnly</flattenMode>
</configuration>
<executions>
<execution>
<id>flatten</id>
<phase>process-resources</phase>
<goals>
<goal>flatten</goal>
</goals>
</execution>
<execution>
<id>flatten.clean</id>
<phase>clean</phase>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- gpg 签名 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>${maven-gpg-plugin.version}</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 新版 Central Portal 中央仓库上传 -->
<plugin>
<groupId>org.sonatype.central</groupId>
<artifactId>central-publishing-maven-plugin</artifactId>
<version>${central.publishing.maven.version}</version>
<extensions>true</extensions>
<configuration>
<!-- 必须与 settings.xml 中 server 的 id 一致 -->
<publishingServerId>central</publishingServerId>
<!-- 是否自动发布。设为 true 后,上传完成无需手动点击发布 -->
<!-- <autoPublish>true</autoPublish> -->
<!-- 等待直到发布完成,让构建过程等待最终结果 -->
<!-- <waitUntil>published</waitUntil> -->
</configuration>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<versionRange>[1.0.0,)</versionRange>
<goals>
<goal>enforce</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore />
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
================================================
FILE: sa-token-core/pom.xml
================================================
<?xml version='1.0' encoding='utf-8'?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-parent</artifactId>
<version>${revision}</version>
<relativePath>../pom.xml</relativePath>
</parent>
<packaging>jar</packaging>
<name>sa-token-core</name>
<artifactId>sa-token-core</artifactId>
<description>An open-source, free, and one-stop Java authentication framework that makes authentication simple and elegant!</description>
<dependencies>
<!-- Zero Dependence -->
</dependencies>
</project>
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/SaManager.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken;
import cn.dev33.satoken.config.SaTokenConfig;
import cn.dev33.satoken.config.SaTokenConfigFactory;
import cn.dev33.satoken.context.SaTokenContext;
import cn.dev33.satoken.context.SaTokenContextForThreadLocal;
import cn.dev33.satoken.dao.SaTokenDao;
import cn.dev33.satoken.dao.SaTokenDaoDefaultImpl;
import cn.dev33.satoken.error.SaErrorCode;
import cn.dev33.satoken.exception.SaTokenException;
import cn.dev33.satoken.http.SaHttpTemplate;
import cn.dev33.satoken.http.SaHttpTemplateDefaultImpl;
import cn.dev33.satoken.json.SaJsonTemplate;
import cn.dev33.satoken.json.SaJsonTemplateDefaultImpl;
import cn.dev33.satoken.listener.SaTokenEventCenter;
import cn.dev33.satoken.log.SaLog;
import cn.dev33.satoken.log.SaLogForConsole;
import cn.dev33.satoken.same.SaSameTemplate;
import cn.dev33.satoken.secure.totp.SaTotpTemplate;
import cn.dev33.satoken.serializer.SaSerializerTemplate;
import cn.dev33.satoken.serializer.impl.SaSerializerTemplateForJson;
import cn.dev33.satoken.stp.StpInterface;
import cn.dev33.satoken.stp.StpInterfaceDefaultImpl;
import cn.dev33.satoken.stp.StpLogic;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.strategy.SaStrategy;
import cn.dev33.satoken.temp.SaTempTemplate;
import cn.dev33.satoken.util.SaFoxUtil;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 管理 Sa-Token 所有全局组件,可通过此类快速获取、写入各种全局组件对象
*
* @author click33
* @since 1.18.0
*/
public class SaManager {
/**
* 全局配置对象
*/
public volatile static SaTokenConfig config;
public static void setConfig(SaTokenConfig config) {
setConfigMethod(config);
// 打印 banner
if(config !=null && config.getIsPrint()) {
SaFoxUtil.printSaToken();
}
// 如果此 config 对象没有配置 isColorLog 的值,则框架为它自动判断一下
if(config != null && config.getIsLog() != null && config.getIsLog() && config.getIsColorLog() == null) {
config.setIsColorLog(SaFoxUtil.isCanColorLog());
}
// $$ 全局事件
SaTokenEventCenter.doSetConfig(config);
// 调用一次 StpUtil 中的方法,保证其可以尽早的初始化 StpLogic
StpUtil.getLoginType();
}
private static void setConfigMethod(SaTokenConfig config) {
SaManager.config = config;
}
/**
* 获取 Sa-Token 的全局配置信息
* @return 全局配置信息
*/
public static SaTokenConfig getConfig() {
if (config == null) {
synchronized (SaManager.class) {
if (config == null) {
setConfigMethod(SaTokenConfigFactory.createConfig());
}
}
}
return config;
}
/**
* 持久化组件
*/
private volatile static SaTokenDao saTokenDao;
public static void setSaTokenDao(SaTokenDao saTokenDao) {
setSaTokenDaoMethod(saTokenDao);
SaTokenEventCenter.doRegisterComponent("SaTokenDao", saTokenDao);
}
private static void setSaTokenDaoMethod(SaTokenDao saTokenDao) {
if (SaManager.saTokenDao != null) {
SaManager.saTokenDao.destroy();
}
SaManager.saTokenDao = saTokenDao;
if (SaManager.saTokenDao != null) {
SaManager.saTokenDao.init();
}
}
public static SaTokenDao getSaTokenDao() {
if (saTokenDao == null) {
synchronized (SaManager.class) {
if (saTokenDao == null) {
setSaTokenDaoMethod(new SaTokenDaoDefaultImpl());
}
}
}
return saTokenDao;
}
/**
* 权限数据源组件
*/
private volatile static StpInterface stpInterface;
public static void setStpInterface(StpInterface stpInterface) {
SaManager.stpInterface = stpInterface;
SaTokenEventCenter.doRegisterComponent("StpInterface", stpInterface);
}
public static StpInterface getStpInterface() {
if (stpInterface == null) {
synchronized (SaManager.class) {
if (stpInterface == null) {
SaManager.stpInterface = new StpInterfaceDefaultImpl();
}
}
}
return stpInterface;
}
/**
* 上下文 SaTokenContext
*/
private volatile static SaTokenContext saTokenContext;
public static void setSaTokenContext(SaTokenContext saTokenContext) {
SaManager.saTokenContext = saTokenContext;
SaTokenEventCenter.doRegisterComponent("SaTokenContext", saTokenContext);
}
public static SaTokenContext getSaTokenContext() {
if (saTokenContext == null) {
synchronized (SaManager.class) {
if (saTokenContext == null) {
SaManager.saTokenContext = new SaTokenContextForThreadLocal();
}
}
}
return saTokenContext;
}
/**
* 临时 token 认证模块
*/
private volatile static SaTempTemplate saTempTemplate;
public static void setSaTempTemplate(SaTempTemplate saTempTemplate) {
SaManager.saTempTemplate = saTempTemplate;
SaTokenEventCenter.doRegisterComponent("SaTempTemplate", saTempTemplate);
}
public static SaTempTemplate getSaTempTemplate() {
if (saTempTemplate == null) {
synchronized (SaManager.class) {
if (saTempTemplate == null) {
SaManager.saTempTemplate = new SaTempTemplate();
}
}
}
return saTempTemplate;
}
/**
* JSON 转换器
*/
private volatile static SaJsonTemplate saJsonTemplate;
public static void setSaJsonTemplate(SaJsonTemplate saJsonTemplate) {
SaManager.saJsonTemplate = saJsonTemplate;
SaTokenEventCenter.doRegisterComponent("SaJsonTemplate", saJsonTemplate);
}
public static SaJsonTemplate getSaJsonTemplate() {
if (saJsonTemplate == null) {
synchronized (SaManager.class) {
if (saJsonTemplate == null) {
SaManager.saJsonTemplate = new SaJsonTemplateDefaultImpl();
}
}
}
return saJsonTemplate;
}
/**
* HTTP 转换器
*/
private volatile static SaHttpTemplate saHttpTemplate;
public static void setSaHttpTemplate(SaHttpTemplate saHttpTemplate) {
SaManager.saHttpTemplate = saHttpTemplate;
SaTokenEventCenter.doRegisterComponent("SaHttpTemplate", saHttpTemplate);
}
public static SaHttpTemplate getSaHttpTemplate() {
if (saHttpTemplate == null) {
synchronized (SaManager.class) {
if (saHttpTemplate == null) {
SaManager.saHttpTemplate = new SaHttpTemplateDefaultImpl();
}
}
}
return saHttpTemplate;
}
/**
* 序列化器
*/
private volatile static SaSerializerTemplate saSerializerTemplate;
public static void setSaSerializerTemplate(SaSerializerTemplate saSerializerTemplate) {
SaManager.saSerializerTemplate = saSerializerTemplate;
SaTokenEventCenter.doRegisterComponent("SaSerializerTemplate", saSerializerTemplate);
}
public static SaSerializerTemplate getSaSerializerTemplate() {
if (saSerializerTemplate == null) {
synchronized (SaManager.class) {
if (saSerializerTemplate == null) {
SaManager.saSerializerTemplate = new SaSerializerTemplateForJson();
}
}
}
return saSerializerTemplate;
}
/**
* Same-Token 同源系统认证模块
*/
private volatile static SaSameTemplate saSameTemplate;
public static void setSaSameTemplate(SaSameTemplate saSameTemplate) {
SaManager.saSameTemplate = saSameTemplate;
SaTokenEventCenter.doRegisterComponent("SaSameTemplate", saSameTemplate);
}
public static SaSameTemplate getSaSameTemplate() {
if (saSameTemplate == null) {
synchronized (SaManager.class) {
if (saSameTemplate == null) {
SaManager.saSameTemplate = new SaSameTemplate();
}
}
}
return saSameTemplate;
}
/**
* 日志输出器
*/
public volatile static SaLog log = new SaLogForConsole();
public static void setLog(SaLog log) {
SaManager.log = log;
SaTokenEventCenter.doRegisterComponent("SaLog", log);
}
public static SaLog getLog() {
return SaManager.log;
}
/**
* TOTP 算法类,支持 生成/验证 动态一次性密码
*/
private volatile static SaTotpTemplate totpTemplate;
public static void setSaTotpTemplate(SaTotpTemplate totpTemplate) {
SaManager.totpTemplate = totpTemplate;
SaTokenEventCenter.doRegisterComponent("SaTotpTemplate", totpTemplate);
}
public static SaTotpTemplate getSaTotpTemplate() {
if (totpTemplate == null) {
synchronized (SaManager.class) {
if (totpTemplate == null) {
SaManager.totpTemplate = new SaTotpTemplate();
}
}
}
return totpTemplate;
}
// ------------------- StpLogic 相关 -------------------
/**
* StpLogic 集合, 记录框架所有成功初始化的 StpLogic
*/
public static Map<String, StpLogic> stpLogicMap = new LinkedHashMap<>();
/**
* 向全局集合中 put 一个 StpLogic
* @param stpLogic StpLogic
*/
public static void putStpLogic(StpLogic stpLogic) {
stpLogicMap.put(stpLogic.getLoginType(), stpLogic);
}
/**
* 在全局集合中 移除 一个 StpLogic
*/
public static void removeStpLogic(String loginType) {
stpLogicMap.remove(loginType);
}
/**
* 根据 LoginType 获取对应的StpLogic,如果不存在则新建并返回
* @param loginType 对应的账号类型
* @return 对应的StpLogic
*/
public static StpLogic getStpLogic(String loginType) {
return getStpLogic(loginType, true);
}
/**
* 根据 LoginType 获取对应的StpLogic,如果不存在,isCreate = 是否自动创建并返回
* @param loginType 对应的账号类型
* @param isCreate 在 StpLogic 不存在时,true=新建并返回,false=抛出异常
* @return 对应的StpLogic
*/
public static StpLogic getStpLogic(String loginType, boolean isCreate) {
// 如果type为空则返回框架默认内置的
if(loginType == null || loginType.isEmpty()) {
return StpUtil.stpLogic;
}
// 从集合中获取
StpLogic stpLogic = stpLogicMap.get(loginType);
if(stpLogic == null) {
// isCreate=true时,自创建模式:自动创建并返回
if(isCreate) {
synchronized (SaManager.class) {
stpLogic = stpLogicMap.get(loginType);
if(stpLogic == null) {
stpLogic = SaStrategy.instance.createStpLogic.apply(loginType);
}
}
}
// isCreate=false时,严格校验模式:抛出异常
else {
/*
* 此时有两种情况会造成 StpLogic == null
* 1. loginType拼写错误,请改正 (建议使用常量)
* 2. 自定义StpUtil尚未初始化(静态类中的属性至少一次调用后才会初始化),解决方法两种
* (1) 从main方法里调用一次
* (2) 在自定义StpUtil类加上类似 @Component 的注解让容器启动时扫描到自动初始化
*/
throw new SaTokenException("未能获取对应StpLogic,type="+ loginType).setCode(SaErrorCode.CODE_10002);
}
}
// 返回
return stpLogic;
}
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckDisable.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.annotation;
import cn.dev33.satoken.util.SaTokenConsts;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 服务禁用校验:判断当前账号是否被禁用了指定服务,如果被禁用,会抛出异常,没有被禁用才能进入方法。
*
* <p> 可标注在方法、类上(效果等同于标注在此类的所有方法上)
*
* @author videomonster
* @since 1.31.0
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE })
public @interface SaCheckDisable {
/**
* 多账号体系下所属的账号体系标识,非多账号体系无需关注此值
*
* @return /
*/
String type() default "";
/**
* 服务标识 (具体你要校验是否禁用的服务名称)
*
* @return /
*/
String[] value() default { SaTokenConsts.DEFAULT_DISABLE_SERVICE };
/**
* 封禁等级(如果当前账号的被封禁等级 ≥ 此值,请求就无法进入方法)
*
* @return /
*/
int level() default SaTokenConsts.DEFAULT_DISABLE_LEVEL;
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckHttpBasic.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.annotation;
import cn.dev33.satoken.httpauth.basic.SaHttpBasicTemplate;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Http Basic 认证校验:只有通过 Http Basic 认证后才能进入该方法,否则抛出异常。
*
* <p> 可标注在方法、类上(效果等同于标注在此类的所有方法上)
*
* @author click33
* @since 1.26.0
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE })
public @interface SaCheckHttpBasic {
/**
* 领域
* @return /
*/
String realm() default SaHttpBasicTemplate.DEFAULT_REALM;
/**
* 需要校验的账号密码,格式形如 sa:123456
* @return /
*/
String account() default "";
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckHttpDigest.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.annotation;
import cn.dev33.satoken.httpauth.digest.SaHttpDigestModel;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Http Digest 认证校验:只有通过 Http Digest 认证后才能进入该方法,否则抛出异常。
*
* <p> 可标注在方法、类上(效果等同于标注在此类的所有方法上)
*
* @author click33
* @since 1.38.0
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE })
public @interface SaCheckHttpDigest {
/**
* 用户名
* @return /
*/
String username() default "";
/**
* 密码
* @return /
*/
String password() default "";
/**
* 领域
* @return /
*/
String realm() default SaHttpDigestModel.DEFAULT_REALM;
/**
* 需要校验的用户名和密码,格式形如 sa:123456
* @return /
*/
String value() default "";
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckLogin.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 登录认证校验:只有登录之后才能进入该方法。
*
* <p> 可标注在方法、类上(效果等同于标注在此类的所有方法上)
*
* @author click33
* @since 1.10.0
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE })
public @interface SaCheckLogin {
/**
* 多账号体系下所属的账号体系标识,非多账号体系无需关注此值
*
* @return /
*/
String type() default "";
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckOr.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.annotation;
import java.lang.annotation.*;
/**
* 批量注解鉴权:只要满足其中一个注解即可通过验证
*
* <p> 可标注在方法、类上(效果等同于标注在此类的所有方法上)
*
* @author click33
* @since 1.35.0
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE })
public @interface SaCheckOr {
/**
* 设定 @SaCheckLogin,参考 {@link SaCheckLogin}
*
* @return /
*/
SaCheckLogin[] login() default {};
/**
* 设定 @SaCheckRole,参考 {@link SaCheckRole}
*
* @return /
*/
SaCheckRole[] role() default {};
/**
* 设定 @SaCheckPermission,参考 {@link SaCheckPermission}
*
* @return /
*/
SaCheckPermission[] permission() default {};
/**
* 设定 @SaCheckSafe,参考 {@link SaCheckSafe}
*
* @return /
*/
SaCheckSafe[] safe() default {};
/**
* 设定 @SaCheckHttpBasic,参考 {@link SaCheckHttpBasic}
*
* @return /
*/
SaCheckHttpBasic[] httpBasic() default {};
/**
* 设定 @SaCheckBasic,参考 {@link SaCheckHttpDigest}
*
* @return /
*/
SaCheckHttpDigest[] httpDigest() default {};
/**
* 设定 @SaCheckDisable,参考 {@link SaCheckDisable}
*
* @return /
*/
SaCheckDisable[] disable() default {};
/**
* 需要追加抓取的注解 Class (只能填写 Sa-Token 相关注解类型)
*
* @return /
*/
Class<? extends Annotation>[] append() default {};
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckPermission.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 权限认证校验:必须具有指定权限才能进入该方法。
*
* <p> 可标注在方法、类上(效果等同于标注在此类的所有方法上)
*
* @author click33
* @since 1.10.0
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface SaCheckPermission {
/**
* 多账号体系下所属的账号体系标识,非多账号体系无需关注此值
*
* @return /
*/
String type() default "";
/**
* 需要校验的权限码 [ 数组 ]
*
* @return /
*/
String [] value() default {};
/**
* 验证模式:AND | OR,默认AND
*
* @return /
*/
SaMode mode() default SaMode.AND;
/**
* 在权限校验不通过时的次要选择,两者只要其一校验成功即可通过校验
*
* <p>
* 例1:@SaCheckPermission(value="user-add", orRole="admin"),
* 代表本次请求只要具有 user-add权限 或 admin角色 其一即可通过校验。
* </p>
*
* <p>
* 例2: orRole = {"admin", "manager", "staff"},具有三个角色其一即可。 <br>
* 例3: orRole = {"admin, manager, staff"},必须三个角色同时具备。
* </p>
*
* @return /
*/
String[] orRole() default {};
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckRole.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 角色认证校验:必须具有指定角色标识才能进入该方法。
*
* <p> 可标注在方法、类上(效果等同于标注在此类的所有方法上)
*
* @author click33
* @since 1.10.0
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface SaCheckRole {
/**
* 多账号体系下所属的账号体系标识,非多账号体系无需关注此值
*
* @return /
*/
String type() default "";
/**
* 需要校验的角色标识 [ 数组 ]
*
* @return /
*/
String [] value() default {};
/**
* 验证模式:AND | OR,默认AND
*
* @return /
*/
SaMode mode() default SaMode.AND;
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckSafe.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import cn.dev33.satoken.util.SaTokenConsts;
/**
* 二级认证校验:客户端必须完成二级认证之后,才能进入该方法,否则将被抛出异常。
*
* <p> 可标注在方法、类上(效果等同于标注在此类的所有方法上)。
*
* @author click33
* @since 1.21.0
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE })
public @interface SaCheckSafe {
/**
* 多账号体系下所属的账号体系标识,非多账号体系无需关注此值
*
* @return /
*/
String type() default "";
/**
* 要校验的服务
*
* @return /
*/
String value() default SaTokenConsts.DEFAULT_SAFE_AUTH_SERVICE;
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaIgnore.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 忽略认证:表示被修饰的方法或类无需进行注解认证和路由拦截认证。
*
* <h3> 请注意:此注解的忽略效果只针对 SaInterceptor拦截器 和 AOP注解鉴权 生效,对自定义拦截器与过滤器不生效。 </h3>
*
* @author click33
* @since 1.31.0
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE })
public @interface SaIgnore {
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaMode.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.annotation;
/**
* 注解鉴权的验证模式
*
* @author click33
* @since 1.10.0
*/
public enum SaMode {
/**
* 必须具有所有的元素
*/
AND,
/**
* 只需具有其中一个元素
*/
OR
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaAnnotationHandlerInterface.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.annotation.handler;
import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedElement;
/**
* 所有注解处理器的父接口
*
* @author click33
* @since 2024/8/2
*/
public interface SaAnnotationHandlerInterface<T extends Annotation> {
/**
* 获取所要处理的注解类型
* @return /
*/
Class<T> getHandlerAnnotationClass();
/**
* 所需要执行的校验方法
* @param at 注解对象
* @param element 被标注的注解的元素(方法/类)引用
*/
@SuppressWarnings("unchecked")
default void check(Annotation at, AnnotatedElement element) {
checkMethod((T) at, element);
}
/**
* 所需要执行的校验方法(转换类型后)
* @param at 注解对象
* @param element 被标注的注解的元素(方法/类)引用
*/
void checkMethod(T at, AnnotatedElement element);
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaCheckDisableHandler.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.annotation.handler;
import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.annotation.SaCheckDisable;
import cn.dev33.satoken.stp.StpLogic;
import java.lang.reflect.AnnotatedElement;
/**
* 注解 SaCheckDisable 的处理器
*
* @author click33
* @since 2024/8/2
*/
public class SaCheckDisableHandler implements SaAnnotationHandlerInterface<SaCheckDisable> {
@Override
public Class<SaCheckDisable> getHandlerAnnotationClass() {
return SaCheckDisable.class;
}
@Override
public void checkMethod(SaCheckDisable at, AnnotatedElement element) {
_checkMethod(at.type(), at.value(), at.level());
}
public static void _checkMethod(String type, String[] value, int level) {
StpLogic stpLogic = SaManager.getStpLogic(type, false);
Object loginId = stpLogic.getLoginId();
for (String service : value) {
stpLogic.checkDisableLevel(loginId, service, level);
}
}
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaCheckHttpBasicHandler.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.annotation.handler;
import cn.dev33.satoken.annotation.SaCheckHttpBasic;
import cn.dev33.satoken.httpauth.basic.SaHttpBasicUtil;
import java.lang.reflect.AnnotatedElement;
/**
* 注解 SaCheckHttpBasic 的处理器
*
* @author click33
* @since 2024/8/2
*/
public class SaCheckHttpBasicHandler implements SaAnnotationHandlerInterface<SaCheckHttpBasic> {
@Override
public Class<SaCheckHttpBasic> getHandlerAnnotationClass() {
return SaCheckHttpBasic.class;
}
@Override
public void checkMethod(SaCheckHttpBasic at, AnnotatedElement element) {
_checkMethod(at.realm(), at.account());
}
public static void _checkMethod(String realm, String account) {
SaHttpBasicUtil.check(realm, account);
}
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaCheckHttpDigestHandler.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.annotation.handler;
import cn.dev33.satoken.annotation.SaCheckHttpDigest;
import cn.dev33.satoken.exception.SaTokenException;
import cn.dev33.satoken.httpauth.digest.SaHttpDigestUtil;
import cn.dev33.satoken.util.SaFoxUtil;
import java.lang.reflect.AnnotatedElement;
/**
* 注解 SaCheckHttpDigest 的处理器
*
* @author click33
* @since 2024/8/2
*/
public class SaCheckHttpDigestHandler implements SaAnnotationHandlerInterface<SaCheckHttpDigest> {
@Override
public Class<SaCheckHttpDigest> getHandlerAnnotationClass() {
return SaCheckHttpDigest.class;
}
@Override
public void checkMethod(SaCheckHttpDigest at, AnnotatedElement element) {
_checkMethod(at.username(), at.password(), at.realm(), at.value());
}
public static void _checkMethod(String username, String password, String realm, String value) {
// 如果配置了 value,则以 value 优先
if(SaFoxUtil.isNotEmpty(value)){
String[] arr = value.split(":");
if(arr.length != 2){
throw new SaTokenException("注解参数配置错误,格式应如:username:password");
}
SaHttpDigestUtil.check(arr[0], arr[1]);
return;
}
// 如果配置了 username,则分别获取参数
if(SaFoxUtil.isNotEmpty(username)){
SaHttpDigestUtil.check(username, password, realm);
return;
}
// 都没有配置,则根据全局配置参数进行校验
SaHttpDigestUtil.check();
}
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaCheckLoginHandler.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.annotation.handler;
import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.stp.StpLogic;
import java.lang.reflect.AnnotatedElement;
/**
* 注解 SaCheckLogin 的处理器
*
* @author click33
* @since 2024/8/2
*/
public class SaCheckLoginHandler implements SaAnnotationHandlerInterface<SaCheckLogin> {
@Override
public Class<SaCheckLogin> getHandlerAnnotationClass() {
return SaCheckLogin.class;
}
@Override
public void checkMethod(SaCheckLogin at, AnnotatedElement element) {
_checkMethod(at.type());
}
public static void _checkMethod(String type) {
StpLogic stpLogic = SaManager.getStpLogic(type, false);
stpLogic.checkLogin();
}
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaCheckOrHandler.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.annotation.handler;
import cn.dev33.satoken.annotation.*;
import cn.dev33.satoken.exception.SaTokenException;
import cn.dev33.satoken.strategy.SaAnnotationStrategy;
import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedElement;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 注解 SaCheckOr 的处理器
*
* @author click33
* @since 2024/8/2
*/
public class SaCheckOrHandler implements SaAnnotationHandlerInterface<SaCheckOr> {
@Override
public Class<SaCheckOr> getHandlerAnnotationClass() {
return SaCheckOr.class;
}
@Override
public void checkMethod(SaCheckOr at, AnnotatedElement element) {
_checkMethod(at.login(), at.role(), at.permission(), at.safe(), at.httpBasic(), at.httpDigest(), at.disable(), at.append(), element);
}
public static void _checkMethod(
SaCheckLogin[] login,
SaCheckRole[] role,
SaCheckPermission[] permission,
SaCheckSafe[] safe,
SaCheckHttpBasic[] httpBasic,
SaCheckHttpDigest[] httpDigest,
SaCheckDisable[] disable,
Class<? extends Annotation>[] append,
AnnotatedElement element
) {
// 先把所有注解塞到一个 list 里
List<Annotation> annotationList = new ArrayList<>();
annotationList.addAll(Arrays.asList(login));
annotationList.addAll(Arrays.asList(role));
annotationList.addAll(Arrays.asList(permission));
annotationList.addAll(Arrays.asList(safe));
annotationList.addAll(Arrays.asList(disable));
annotationList.addAll(Arrays.asList(httpBasic));
annotationList.addAll(Arrays.asList(httpDigest));
for (Class<? extends Annotation> annotationClass : append) {
Annotation annotation = SaAnnotationStrategy.instance.getAnnotation.apply(element, annotationClass);
if(annotation != null) {
annotationList.add(annotation);
}
}
// 如果 atList 为空,说明 SaCheckOr 上不包含任何注解校验,我们直接跳过即可
if(annotationList.isEmpty()) {
return;
}
// 逐个开始校验 >>>
List<SaTokenException> errorList = new ArrayList<>();
for (Annotation item : annotationList) {
try {
SaAnnotationStrategy.instance.annotationHandlerMap.get(item.annotationType()).check(item, element);
// 只要有一个校验通过,就可以直接返回了
return;
} catch (SaTokenException e) {
errorList.add(e);
}
}
// 执行至此,说明所有注解校验都通过不了,此时 errorList 里面会有多个异常,我们随便抛出一个即可
throw errorList.get(0);
}
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaCheckPermissionHandler.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.annotation.handler;
import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.dev33.satoken.exception.NotPermissionException;
import cn.dev33.satoken.stp.StpLogic;
import cn.dev33.satoken.util.SaFoxUtil;
import java.lang.reflect.AnnotatedElement;
/**
* 注解 SaCheckPermission 的处理器
*
* @author click33
* @since 2024/8/2
*/
public class SaCheckPermissionHandler implements SaAnnotationHandlerInterface<SaCheckPermission> {
@Override
public Class<SaCheckPermission> getHandlerAnnotationClass() {
return SaCheckPermission.class;
}
@Override
public void checkMethod(SaCheckPermission at, AnnotatedElement element) {
_checkMethod(at.type(), at.value(), at.mode(), at.orRole());
}
public static void _checkMethod(String type, String[] value, SaMode mode, String[] orRole) {
StpLogic stpLogic = SaManager.getStpLogic(type, false);
String[] permissionArray = value;
try {
if(mode == SaMode.AND) {
stpLogic.checkPermissionAnd(permissionArray);
} else {
stpLogic.checkPermissionOr(permissionArray);
}
} catch (NotPermissionException e) {
// 权限认证校验未通过,再开始角色认证校验
for (String role : orRole) {
String[] rArr = SaFoxUtil.convertStringToArray(role);
// 某一项 role 认证通过,则可以提前退出了,代表通过
if (stpLogic.hasRoleAnd(rArr)) {
return;
}
}
throw e;
}
}
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaCheckRoleHandler.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.annotation.handler;
import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.annotation.SaCheckRole;
import cn.dev33.satoken.annotation.SaMode;
import cn.dev33.satoken.stp.StpLogic;
import java.lang.reflect.AnnotatedElement;
/**
* 注解 SaCheckRole 的处理器
*
* @author click33
* @since 2024/8/2
*/
public class SaCheckRoleHandler implements SaAnnotationHandlerInterface<SaCheckRole> {
@Override
public Class<SaCheckRole> getHandlerAnnotationClass() {
return SaCheckRole.class;
}
@Override
public void checkMethod(SaCheckRole at, AnnotatedElement element) {
_checkMethod(at.type(), at.value(), at.mode());
}
public static void _checkMethod(String type, String[] value, SaMode mode) {
StpLogic stpLogic = SaManager.getStpLogic(type, false);
String[] roleArray = value;
if(mode == SaMode.AND) {
stpLogic.checkRoleAnd(roleArray);
} else {
stpLogic.checkRoleOr(roleArray);
}
}
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaCheckSafeHandler.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.annotation.handler;
import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.annotation.SaCheckSafe;
import cn.dev33.satoken.stp.StpLogic;
import java.lang.reflect.AnnotatedElement;
/**
* 注解 SaCheckSafe 的处理器
*
* @author click33
* @since 2024/8/2
*/
public class SaCheckSafeHandler implements SaAnnotationHandlerInterface<SaCheckSafe> {
@Override
public Class<SaCheckSafe> getHandlerAnnotationClass() {
return SaCheckSafe.class;
}
@Override
public void checkMethod(SaCheckSafe at, AnnotatedElement element) {
_checkMethod(at.type(), at.value());
}
public static void _checkMethod(String type, String value) {
StpLogic stpLogic = SaManager.getStpLogic(type, false);
stpLogic.checkSafe(value);
}
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaIgnoreHandler.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.annotation.handler;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.dev33.satoken.router.SaRouter;
import java.lang.reflect.AnnotatedElement;
/**
* 注解 SaIgnore 的处理器
* <h2> v1.43.0 版本起,SaIgnore 注解处理逻辑已转移到全局策略中,此处理器代码仅做留档 </h2>
*
* @author click33
* @since 2024/8/2
*/
public class SaIgnoreHandler implements SaAnnotationHandlerInterface<SaIgnore> {
@Override
public Class<SaIgnore> getHandlerAnnotationClass() {
return SaIgnore.class;
}
@Override
public void checkMethod(SaIgnore at, AnnotatedElement element) {
_checkMethod();
}
public static void _checkMethod() {
SaRouter.stop();
}
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/application/ApplicationInfo.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.application;
import cn.dev33.satoken.util.SaFoxUtil;
/**
* 应用全局信息
*
* @author click33
* @since 1.31.0
*/
public class ApplicationInfo {
/**
* 应用前缀
*/
public static String routePrefix;
/**
* 为指定 path 裁剪掉 routePrefix 前缀
* @param path 指定 path
* @return /
*/
public static String cutPathPrefix(String path) {
if(! SaFoxUtil.isEmpty(routePrefix) && ! routePrefix.equals("/") && path.startsWith(routePrefix)){
path = path.substring(routePrefix.length());
}
return path;
}
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/application/SaApplication.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.application;
import java.util.ArrayList;
import java.util.List;
import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.dao.SaTokenDao;
/**
* Application Model,全局作用域的读取值对象。
*
* <p> 在应用全局范围内: 存值、取值。数据在应用重启后失效,如果集成了 Redis,则在 Redis 重启后失效。
*
* @author click33
* @since 1.31.0
*/
public class SaApplication implements SaSetValueInterface {
/**
* 默认实例
*/
public static SaApplication defaultInstance = new SaApplication();
// ---- 实现接口存取值方法
/** 取值 */
@Override
public Object get(String key) {
return SaManager.getSaTokenDao().getObject(splicingDataKey(key));
}
/** 写值 */
@Override
public SaApplication set(String key, Object value) {
return set(key, value, SaTokenDao.NEVER_EXPIRE);
}
/** 删值 */
@Override
public SaApplication delete(String key) {
SaManager.getSaTokenDao().deleteObject(splicingDataKey(key));
return this;
}
// ---- 其它方法
/**
* 写值
* @param key 名称
* @param value 值
* @param ttl 有效时间(单位:秒)
* @return 对象自身
*/
public SaApplication set(String key, Object value, long ttl) {
SaManager.getSaTokenDao().setObject(splicingDataKey(key), value, ttl);
return this;
}
/**
* 返回当前存入的所有 key
* @return /
*/
public List<String> keys() {
// 从缓存中查询出所有此前缀的 key
String prefix = splicingDataKey("");
List<String> list = SaManager.getSaTokenDao().searchData(prefix, "", 0, -1, true);
// 裁减掉固定前缀,保留 key 名称,塞入新集合
int prefixLength = prefix.length();
List<String> list2 = new ArrayList<>();
if(list != null) {
for (String key : list) {
list2.add(key.substring(prefixLength));
}
}
// 返回
return list2;
}
/**
* 清空当前存入的所有 key
*/
public void clear() {
List<String> keys = keys();
for (String key : keys) {
delete(key);
}
}
/**
* 拼接key:当存入一个变量时,应该使用的 key
*
* @param key 原始 key
* @return 拼接后的 key 值
*/
public String splicingDataKey(String key) {
return SaManager.getConfig().getTokenName() + ":var:" + key;
}
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/application/SaGetValueInterface.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.application;
import cn.dev33.satoken.util.SaFoxUtil;
/**
* 对取值的一组方法封装
* <p> 封装 SaStorage、SaSession、SaApplication 等存取值的一些固定方法,减少重复编码 </p>
*
* @author click33
* @since 1.31.0
*/
public interface SaGetValueInterface {
// --------- 需要子类实现的方法
/**
* 取值
* @param key key
* @return 值
*/
Object get(String key);
// --------- 接口提供封装的方法
/**
* 取值 (指定默认值)
*
* @param <T> 默认值的类型
* @param key key
* @param defaultValue 取不到值时返回的默认值
* @return 值
*/
default <T> T get(String key, T defaultValue) {
return getValueByDefaultValue(get(key), defaultValue);
}
/**
* 取值 (转String类型)
* @param key key
* @return 值
*/
default String getString(String key) {
Object value = get(key);
if(value == null) {
return null;
}
return String.valueOf(value);
}
/**
* 取值 (转int类型)
* @param key key
* @return 值
*/
default int getInt(String key) {
return getValueByDefaultValue(get(key), 0);
}
/**
* 取值 (转long类型)
* @param key key
* @return 值
*/
default long getLong(String key) {
return getValueByDefaultValue(get(key), 0L);
}
/**
* 取值 (转double类型)
* @param key key
* @return 值
*/
default double getDouble(String key) {
return getValueByDefaultValue(get(key), 0.0);
}
/**
* 取值 (转float类型)
* @param key key
* @return 值
*/
default float getFloat(String key) {
return getValueByDefaultValue(get(key), 0.0f);
}
/**
* 取值 (指定转换类型)
* @param <T> 泛型
* @param key key
* @param cs 指定转换类型
* @return 值
*/
default <T> T getModel(String key, Class<T> cs) {
return SaFoxUtil.getValueByType(get(key), cs);
}
/**
* 取值 (指定转换类型, 并指定值为 null 时返回的默认值)
* @param <T> 泛型
* @param key key
* @param cs 指定转换类型
* @param defaultValue 值为Null时返回的默认值
* @return 值
*/
@SuppressWarnings("unchecked")
default <T> T getModel(String key, Class<T> cs, Object defaultValue) {
T model = getModel(key, cs);
return valueIsNull(model) ? (T)defaultValue : model;
}
/**
* 是否含有某个 key
* @param key 指定 key
* @return 是否含有
*/
default boolean has(String key) {
return !valueIsNull(get(key));
}
// --------- 内部工具方法
/**
* 判断一个值是否为null
* @param value 指定值
* @return 此value是否为null
*/
default boolean valueIsNull(Object value) {
return value == null || value.equals("");
}
/**
* 根据默认值来获取值
* @param <T> 泛型
* @param value 值
* @param defaultValue 默认值
* @return 转换后的值
*/
@SuppressWarnings("unchecked")
default <T> T getValueByDefaultValue(Object value, T defaultValue) {
// 如果 obj 为 null,则直接返回默认值
if(valueIsNull(value)) {
return defaultValue;
}
// 开始转换类型
Class<T> cs = (Class<T>) defaultValue.getClass();
return SaFoxUtil.getValueByType(value, cs);
}
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/application/SaSetValueInterface.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.application;
import cn.dev33.satoken.fun.SaRetGenericFunction;
/**
* 对写值的一组方法封装
* <p> 封装 SaStorage、SaSession、SaApplication 等存取值的一些固定方法,减少重复编码 </p>
*
* @author click33
* @since 1.31.0
*/
public interface SaSetValueInterface extends SaGetValueInterface {
// --------- 需要子类实现的方法
/**
* 写值
* @param key 名称
* @param value 值
* @return 对象自身
*/
SaSetValueInterface set(String key, Object value);
/**
* 删值
* @param key 要删除的key
* @return 对象自身
*/
SaSetValueInterface delete(String key);
// --------- 接口提供封装的方法
/**
*
* 取值 (如果值为 null,则执行 fun 函数获取值,并把函数返回值写入缓存)
* @param <T> 返回值的类型
* @param key key
* @param fun 值为null时执行的函数
* @return 值
*/
@SuppressWarnings("unchecked")
default <T> T get(String key, SaRetGenericFunction<T> fun) {
Object value = get(key);
if(value == null) {
value = fun.run();
set(key, value);
}
return (T) value;
}
/**
* 写值 (只有在此 key 原本无值的情况下才会写入)
* @param key 名称
* @param value 值
* @return 对象自身
*/
default SaSetValueInterface setByNull(String key, Object value) {
if( ! has(key)) {
set(key, value);
}
return this;
}
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/config/SaCookieConfig.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.config;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* Sa-Token Cookie写入 相关配置
*
* @author click33
* @since 1.27.0
*/
public class SaCookieConfig {
/*
Cookie 功能为浏览器通用标准,建议大家自行搜索文章了解各个属性的功能含义,此处源码仅做简单解释。
*/
/**
* 作用域
* <p> 写入 Cookie 时显式指定的作用域, 常用于单点登录二级域名共享 Cookie 的场景。 </p>
* <p> 一般情况下你不需要设置此值,因为浏览器默认会把 Cookie 写到当前域名下。 </p>
*/
private String domain;
/**
* 路径 (一般只有当你在一个域名下部署多个项目时才会用到此值。)
*/
private String path;
/**
* 是否只在 https 协议下有效
*/
private Boolean secure = false;
/**
* 是否禁止 js 操作 Cookie
*/
private Boolean httpOnly = false;
/**
* 第三方限制级别(Strict=完全禁止,Lax=部分允许,None=不限制)
*/
private String sameSite;
/**
* 额外扩展属性
*/
private Map<String, String> extraAttrs = new LinkedHashMap<>();
/**
* 获取:Cookie 作用域
* <p> 写入 Cookie 时显式指定的作用域, 常用于单点登录二级域名共享 Cookie 的场景。 </p>
* <p> 一般情况下你不需要设置此值,因为浏览器默认会把 Cookie 写到当前域名下。 </p>
* @return /
*/
public String getDomain() {
return domain;
}
/**
* 写入:Cookie 作用域
* <p> 写入 Cookie 时显式指定的作用域, 常用于单点登录二级域名共享 Cookie 的场景。 </p>
* <p> 一般情况下你不需要设置此值,因为浏览器默认会把 Cookie 写到当前域名下。 </p>
* @param domain /
* @return 对象自身
*/
public SaCookieConfig setDomain(String domain) {
this.domain = domain;
return this;
}
/**
* @return 路径 (一般只有当你在一个域名下部署多个项目时才会用到此值。)
*/
public String getPath() {
return path;
}
/**
* @param path 路径 (一般只有当你在一个域名下部署多个项目时才会用到此值。)
* @return 对象自身
*/
public SaCookieConfig setPath(String path) {
this.path = path;
return this;
}
/**
* @return 是否只在 https 协议下有效
*/
public Boolean getSecure() {
return secure;
}
/**
* @param secure 是否只在 https 协议下有效
* @return 对象自身
*/
public SaCookieConfig setSecure(Boolean secure) {
this.secure = secure;
return this;
}
/**
* @return 是否禁止 js 操作 Cookie
*/
public Boolean getHttpOnly() {
return httpOnly;
}
/**
* @param httpOnly 是否禁止 js 操作 Cookie
* @return 对象自身
*/
public SaCookieConfig setHttpOnly(Boolean httpOnly) {
this.httpOnly = httpOnly;
return this;
}
/**
* @return 第三方限制级别(Strict=完全禁止,Lax=部分允许,None=不限制)
*/
public String getSameSite() {
return sameSite;
}
/**
* @param sameSite 第三方限制级别(Strict=完全禁止,Lax=部分允许,None=不限制)
* @return 对象自身
*/
public SaCookieConfig setSameSite(String sameSite) {
this.sameSite = sameSite;
return this;
}
/**
* @return 获取额外扩展属性
*/
public Map<String, String> getExtraAttrs() {
return extraAttrs;
}
/**
* 写入额外扩展属性
* @param extraAttrs /
* @return 对象自身
*/
public SaCookieConfig setExtraAttrs(Map<String, String> extraAttrs) {
this.extraAttrs = extraAttrs;
return this;
}
/**
* 追加扩展属性
* @param name /
* @param value /
* @return 对象自身
*/
public SaCookieConfig addExtraAttr(String name, String value) {
if (extraAttrs == null) {
extraAttrs = new LinkedHashMap<>();
}
this.extraAttrs.put(name, value);
return this;
}
/**
* 追加扩展属性
* @param name /
* @return 对象自身
*/
public SaCookieConfig addExtraAttr(String name) {
return this.addExtraAttr(name, null);
}
/**
* 移除指定扩展属性
* @param name /
* @return 对象自身
*/
public SaCookieConfig removeExtraAttr(String name) {
if(extraAttrs != null) {
this.extraAttrs.remove(name);
}
return this;
}
// toString
@Override
public String toString() {
return "SaCookieConfig [" +
"domain=" + domain +
", path=" + path +
", secure=" + secure +
", httpOnly=" + httpOnly +
", sameSite=" + sameSite +
", extraAttrs=" + extraAttrs +
"]";
}
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.config;
import cn.dev33.satoken.stp.parameter.enums.SaLogoutMode;
import cn.dev33.satoken.stp.parameter.enums.SaLogoutRange;
import cn.dev33.satoken.stp.parameter.enums.SaReplacedLoginExitMode;
import cn.dev33.satoken.stp.parameter.enums.SaReplacedRange;
import cn.dev33.satoken.util.SaFoxUtil;
import java.io.Serializable;
/**
* Sa-Token 配置类 Model
*
* <p>
* 你可以通过yml、properties、java代码等形式配置本类参数,具体请查阅官方文档:
* <a href="https://sa-token.cc">https://sa-token.cc</a>
* </p>
*
* @author click33
* @since 1.10.0
*/
public class SaTokenConfig implements Serializable {
private static final long serialVersionUID = -6541180061782004705L;
/** token 名称 (同时也是: cookie 名称、提交 token 时参数的名称、存储 token 时的 key 前缀) */
private String tokenName = "satoken";
/** token 有效期(单位:秒) 默认30天,-1 代表永久有效 */
private long timeout = 60 * 60 * 24 * 30;
/**
* token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
* (例如可以设置为 1800 代表 30 分钟内无操作就冻结)
*/
private long activeTimeout = -1;
/**
* 是否启用动态 activeTimeout 功能,如不需要请设置为 false,节省缓存请求次数
*/
private Boolean dynamicActiveTimeout = false;
/**
* 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
*/
private Boolean isConcurrent = true;
/**
* 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token)
*/
private Boolean isShare = false;
/**
* 在 isConcurrent=false 时,决定新旧设备谁将放弃会话 (OLD_DEVICE=旧设备下线,新设备登录成功, NEW_DEVICE=新设备登录失败,旧设备维持在线)
*/
private SaReplacedLoginExitMode replacedLoginExitMode = SaReplacedLoginExitMode.OLD_DEVICE;
/**
* 当 isConcurrent=false 时,顶人下线的范围 (CURR_DEVICE_TYPE=当前指定的设备类型端, ALL_DEVICE_TYPE=所有设备类型端)
*/
private SaReplacedRange replacedRange = SaReplacedRange.CURR_DEVICE_TYPE;
/**
* 同一账号最大登录数量,-1代表不限 (只有在 isConcurrent=true, isShare=false 时此配置项才有意义)
*/
private int maxLoginCount = 12;
/**
* 溢出 maxLoginCount 的客户端,将以何种方式注销下线 (LOGOUT=注销下线, KICKOUT=踢人下线, REPLACED=顶人下线)
*/
private SaLogoutMode overflowLogoutMode = SaLogoutMode.LOGOUT;
/**
* 在每次创建 token 时的最高循环次数,用于保证 token 唯一性(-1=不循环尝试,直接使用)
*/
private int maxTryTimes = 12;
/**
* 是否尝试从请求体里读取 token
*/
private Boolean isReadBody = true;
/**
* 是否尝试从 header 里读取 token
*/
private Boolean isReadHeader = true;
/**
* 是否尝试从 cookie 里读取 token
*/
private Boolean isReadCookie = true;
/**
* 是否为持久Cookie(临时Cookie在浏览器关闭时会自动删除,持久Cookie在重新打开后依然存在)
*/
private Boolean isLastingCookie = true;
/**
* 是否在登录后将 token 写入到响应头
*/
private Boolean isWriteHeader = false;
/**
* 注销范围 (TOKEN=只注销当前 token 的会话,ACCOUNT=注销当前 token 指向的 loginId 其所有客户端会话)
* <br/> (此参数只在调用 StpUtil.logout() 时有效)
*/
private SaLogoutRange logoutRange = SaLogoutRange.TOKEN;
/**
* 如果 token 已被冻结,是否保留其操作权 (是否允许此 token 调用注销API)
* <br/> (此参数只在调用 StpUtil.[logout/kickout/replaced]ByTokenValue("token") 时有效)
*/
private Boolean isLogoutKeepFreezeOps = false;
/**
* 在注销 token 后,是否保留其对应的 Token-Session
*/
private Boolean isLogoutKeepTokenSession = false;
/**
* 在登录时,是否立即创建对应的 Token-Session (true=在登录时立即创建,false=在第一次调用 getTokenSession() 时创建)
*/
private Boolean rightNowCreateTokenSession = false;
/**
* token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)
*/
private String tokenStyle = "uuid";
/**
* 默认 SaTokenDao 实现类中,每次清理过期数据间隔的时间(单位: 秒),默认值30秒,设置为 -1 代表不启动定时清理
*/
private int dataRefreshPeriod = 30;
/**
* 获取 Token-Session 时是否必须登录(如果配置为true,会在每次获取 getTokenSession() 时校验当前是否登录)
*/
private Boolean tokenSessionCheckLogin = true;
/**
* 是否打开自动续签 activeTimeout (如果此值为 true, 框架会在每次直接或间接调用 getLoginId() 时进行一次过期检查与续签操作)
*/
private Boolean autoRenew = true;
/**
* token 前缀, 前端提交 token 时应该填写的固定前缀,格式样例(satoken: Bearer xxxx-xxxx-xxxx-xxxx)
*/
private String tokenPrefix;
/**
* cookie 模式是否自动填充 token 前缀
*/
private Boolean cookieAutoFillPrefix = false;
/**
* 是否在初始化配置时在控制台打印版本字符画
*/
private Boolean isPrint = true;
/**
* 是否打印操作日志
*/
private Boolean isLog = false;
/**
* 日志等级(trace、debug、info、warn、error、fatal),此值与 logLevelInt 联动
*/
private String logLevel = "trace";
/**
* 日志等级 int 值(1=trace、2=debug、3=info、4=warn、5=error、6=fatal),此值与 logLevel 联动
*/
private int logLevelInt = 1;
/**
* 是否打印彩色日志
*/
private Boolean isColorLog = null;
/**
* jwt秘钥(只有集成 jwt 相关模块时此参数才会生效)
*/
private String jwtSecretKey;
/**
* Http Basic 认证的默认账号和密码,冒号隔开,例如:sa:123456
*/
private String httpBasic = "";
/**
* Http Digest 认证的默认账号和密码,冒号隔开,例如:sa:123456
*/
private String httpDigest = "";
/**
* 配置当前项目的网络访问地址
*/
private String currDomain;
/**
* Same-Token 的有效期 (单位: 秒)
*/
private long sameTokenTimeout = 60 * 60 * 24;
/**
* 是否校验 Same-Token(部分rpc插件有效)
*/
private Boolean checkSameToken = false;
/**
* Cookie配置对象
*/
public SaCookieConfig cookie = new SaCookieConfig();
/**
* @return token 名称 (同时也是: cookie 名称、提交 token 时参数的名称、存储 token 时的 key 前缀)
*/
public String getTokenName() {
return tokenName;
}
/**
* @param tokenName token 名称 (同时也是: cookie 名称、提交 token 时参数的名称、存储 token 时的 key 前缀)
* @return 对象自身
*/
public SaTokenConfig setTokenName(String tokenName) {
this.tokenName = tokenName;
return this;
}
/**
* @return token 有效期(单位:秒) 默认30天,-1 代表永久有效
*/
public long getTimeout() {
return timeout;
}
/**
* @param timeout token 有效期(单位:秒) 默认30天,-1 代表永久有效
* @return 对象自身
*/
public SaTokenConfig setTimeout(long timeout) {
this.timeout = timeout;
return this;
}
/**
* @return token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
* (例如可以设置为 1800 代表 30 分钟内无操作就冻结)
*/
public long getActiveTimeout() {
return activeTimeout;
}
/**
* @param activeTimeout token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
* (例如可以设置为 1800 代表 30 分钟内无操作就冻结)
* @return 对象自身
*/
public SaTokenConfig setActiveTimeout(long activeTimeout) {
this.activeTimeout = activeTimeout;
return this;
}
/**
* @return 是否启用动态 activeTimeout 功能,如不需要请设置为 false,节省缓存请求次数
*/
public Boolean getDynamicActiveTimeout() {
return dynamicActiveTimeout;
}
/**
* @param dynamicActiveTimeout 是否启用动态 activeTimeout 功能,如不需要请设置为 false,节省缓存请求次数
* @return 对象自身
*/
public SaTokenConfig setDynamicActiveTimeout(Boolean dynamicActiveTimeout) {
this.dynamicActiveTimeout = dynamicActiveTimeout;
return this;
}
/**
* @return 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
*/
public Boolean getIsConcurrent() {
return isConcurrent;
}
/**
* @param isConcurrent 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
* @return 对象自身
*/
public SaTokenConfig setIsConcurrent(Boolean isConcurrent) {
this.isConcurrent = isConcurrent;
return this;
}
/**
* @return 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个token, 为 false 时每次登录新建一个 token)
*/
public Boolean getIsShare() {
return isShare;
}
/**
* @param isShare 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个token, 为 false 时每次登录新建一个 token)
* @return 对象自身
*/
public SaTokenConfig setIsShare(Boolean isShare) {
this.isShare = isShare;
return this;
}
/**
* @return 同一账号最大登录数量,-1代表不限 (只有在 isConcurrent=true, isShare=false 时此配置项才有意义)
*/
public int getMaxLoginCount() {
return maxLoginCount;
}
/**
* @param maxLoginCount 同一账号最大登录数量,-1代表不限 (只有在 isConcurrent=true, isShare=false 时此配置项才有意义)
* @return 对象自身
*/
public SaTokenConfig setMaxLoginCount(int maxLoginCount) {
this.maxLoginCount = maxLoginCount;
return this;
}
/**
* @return 在每次创建 token 时的最高循环次数,用于保证 token 唯一性(-1=不循环尝试,直接使用)
*/
public int getMaxTryTimes() {
return maxTryTimes;
}
/**
* @param maxTryTimes 在每次创建 token 时的最高循环次数,用于保证 token 唯一性(-1=不循环尝试,直接使用)
* @return 对象自身
*/
public SaTokenConfig setMaxTryTimes(int maxTryTimes) {
this.maxTryTimes = maxTryTimes;
return this;
}
/**
* @return 是否尝试从请求体里读取 token
*/
public Boolean getIsReadBody() {
return isReadBody;
}
/**
* @param isReadBody 是否尝试从请求体里读取 token
* @return 对象自身
*/
public SaTokenConfig setIsReadBody(Boolean isReadBody) {
this.isReadBody = isReadBody;
return this;
}
/**
* @return 是否尝试从 header 里读取 token
*/
public Boolean getIsReadHeader() {
return isReadHeader;
}
/**
* @param isReadHeader 是否尝试从 header 里读取 token
* @return 对象自身
*/
public SaTokenConfig setIsReadHeader(Boolean isReadHeader) {
this.isReadHeader = isReadHeader;
return this;
}
/**
* @return 是否尝试从 cookie 里读取 token
*/
public Boolean getIsReadCookie() {
return isReadCookie;
}
/**
* @param isReadCookie 是否尝试从 cookie 里读取 token
* @return 对象自身
*/
public SaTokenConfig setIsReadCookie(Boolean isReadCookie) {
this.isReadCookie = isReadCookie;
return this;
}
/**
* 获取 是否为持久Cookie(临时Cookie在浏览器关闭时会自动删除,持久Cookie在重新打开后依然存在)
*
* @return isLastingCookie /
*/
public Boolean getIsLastingCookie() {
return this.isLastingCookie;
}
/**
* 设置 是否为持久Cookie(临时Cookie在浏览器关闭时会自动删除,持久Cookie在重新打开后依然存在)
*
* @param isLastingCookie /
* @return 对象自身
*/
public SaTokenConfig setIsLastingCookie(Boolean isLastingCookie) {
this.isLastingCookie = isLastingCookie;
return this;
}
/**
* @return 是否在登录后将 token 写入到响应头
*/
public Boolean getIsWriteHeader() {
return isWriteHeader;
}
/**
* @param isWriteHeader 是否在登录后将 token 写入到响应头
* @return 对象自身
*/
public SaTokenConfig setIsWriteHeader(Boolean isWriteHeader) {
this.isWriteHeader = isWriteHeader;
return this;
}
/**
* @return token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)
*/
public String getTokenStyle() {
return tokenStyle;
}
/**
* @param tokenStyle token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)
* @return 对象自身
*/
public SaTokenConfig setTokenStyle(String tokenStyle) {
this.tokenStyle = tokenStyle;
return this;
}
/**
* @return 默认 SaTokenDao 实现类中,每次清理过期数据间隔的时间(单位: 秒),默认值30秒,设置为 -1 代表不启动定时清理
*/
public int getDataRefreshPeriod() {
return dataRefreshPeriod;
}
/**
* @param dataRefreshPeriod 默认 SaTokenDao 实现类中,每次清理过期数据间隔的时间(单位: 秒),默认值30秒,设置为 -1 代表不启动定时清理
* @return 对象自身
*/
public SaTokenConfig setDataRefreshPeriod(int dataRefreshPeriod) {
this.dataRefreshPeriod = dataRefreshPeriod;
return this;
}
/**
* @return 获取 Token-Session 时是否必须登录(如果配置为true,会在每次获取 getTokenSession() 时校验当前是否登录)
*/
public Boolean getTokenSessionCheckLogin() {
return tokenSessionCheckLogin;
}
/**
* @param tokenSessionCheckLogin 获取 Token-Session 时是否必须登录(如果配置为true,会在每次获取 getTokenSession() 时校验当前是否登录)
* @return 对象自身
*/
public SaTokenConfig setTokenSessionCheckLogin(Boolean tokenSessionCheckLogin) {
this.tokenSessionCheckLogin = tokenSessionCheckLogin;
return this;
}
/**
* @return 是否打开自动续签 activeTimeout (如果此值为 true, 框架会在每次直接或间接调用 getLoginId() 时进行一次过期检查与续签操作)
*/
public Boolean getAutoRenew() {
return autoRenew;
}
/**
* @param autoRenew 是否打开自动续签 activeTimeout (如果此值为 true, 框架会在每次直接或间接调用 getLoginId() 时进行一次过期检查与续签操作)
* @return 对象自身
*/
public SaTokenConfig setAutoRenew(Boolean autoRenew) {
this.autoRenew = autoRenew;
return this;
}
/**
* @return token 前缀, 前端提交 token 时应该填写的固定前缀,格式样例(satoken: Bearer xxxx-xxxx-xxxx-xxxx)
*/
public String getTokenPrefix() {
return tokenPrefix;
}
/**
* @param tokenPrefix token 前缀, 前端提交 token 时应该填写的固定前缀,格式样例(satoken: Bearer xxxx-xxxx-xxxx-xxxx)
* @return 对象自身
*/
public SaTokenConfig setTokenPrefix(String tokenPrefix) {
this.tokenPrefix = tokenPrefix;
return this;
}
/**
* @return cookie 模式是否自动填充 token 前缀
*/
public Boolean getCookieAutoFillPrefix() {
return cookieAutoFillPrefix;
}
/**
* @param cookieAutoFillPrefix cookie 模式是否自动填充 token 前缀
* @return 对象自身
*/
public SaTokenConfig setCookieAutoFillPrefix(Boolean cookieAutoFillPrefix) {
this.cookieAutoFillPrefix = cookieAutoFillPrefix;
return this;
}
/**
* @return 是否在初始化配置时在控制台打印版本字符画
*/
public Boolean getIsPrint() {
return isPrint;
}
/**
* @param isPrint 是否在初始化配置时在控制台打印版本字符画
* @return 对象自身
*/
public SaTokenConfig setIsPrint(Boolean isPrint) {
this.isPrint = isPrint;
return this;
}
/**
* @return 是否打印操作日志
*/
public Boolean getIsLog() {
return isLog;
}
/**
* @param isLog 是否打印操作日志
* @return 对象自身
*/
public SaTokenConfig setIsLog(Boolean isLog) {
this.isLog = isLog;
return this;
}
/**
* @return 日志等级(trace、debug、info、warn、error、fatal),此值与 logLevelInt 联动
*/
public String getLogLevel() {
return logLevel;
}
/**
* @param logLevel 日志等级(trace、debug、info、warn、error、fatal),此值与 logLevelInt 联动
* @return 对象自身
*/
public SaTokenConfig setLogLevel(String logLevel) {
this.logLevel = logLevel;
this.logLevelInt = SaFoxUtil.translateLogLevelToInt(logLevel);
return this;
}
/**
* @return 日志等级 int 值(1=trace、2=debug、3=info、4=warn、5=error、6=fatal),此值与 logLevel 联动
*/
public int getLogLevelInt() {
return logLevelInt;
}
/**
* @param logLevelInt 日志等级 int 值(1=trace、2=debug、3=info、4=warn、5=error、6=fatal),此值与 logLevel 联动
* @return 对象自身
*/
public SaTokenConfig setLogLevelInt(int logLevelInt) {
this.logLevelInt = logLevelInt;
this.logLevel = SaFoxUtil.translateLogLevelToString(logLevelInt);
return this;
}
/**
* 获取:是否打印彩色日志
*
* @return isColorLog 是否打印彩色日志
*/
public Boolean getIsColorLog() {
return this.isColorLog;
}
/**
* 设置:是否打印彩色日志
*
* @param isColorLog 是否打印彩色日志
* @return 对象自身
*/
public SaTokenConfig setIsColorLog(Boolean isColorLog) {
this.isColorLog = isColorLog;
return this;
}
/**
* @return jwt秘钥(只有集成 jwt 相关模块时此参数才会生效)
*/
public String getJwtSecretKey() {
return jwtSecretKey;
}
/**
* @param jwtSecretKey jwt秘钥(只有集成 jwt 相关模块时此参数才会生效)
* @return 对象自身
*/
public SaTokenConfig setJwtSecretKey(String jwtSecretKey) {
this.jwtSecretKey = jwtSecretKey;
return this;
}
/**
* @return Http Basic 认证的默认账号和密码,冒号隔开,例如:sa:123456
*/
public String getHttpBasic() {
return httpBasic;
}
/**
* @param httpBasic Http Basic 认证的默认账号和密码,冒号隔开,例如:sa:123456
* @return 对象自身
*/
public SaTokenConfig setHttpBasic(String httpBasic) {
this.httpBasic = httpBasic;
return this;
}
/**
* @return Http Digest 认证的默认账号和密码,冒号隔开,例如:sa:123456
*/
public String getHttpDigest() {
return httpDigest;
}
/**
* @param httpDigest Http Digest 认证的默认账号和密码,冒号隔开,例如:sa:123456
* @return 对象自身
*/
public SaTokenConfig setHttpDigest(String httpDigest) {
this.httpDigest = httpDigest;
return this;
}
/**
* @return 配置当前项目的网络访问地址
*/
public String getCurrDomain() {
return currDomain;
}
/**
* @param currDomain 配置当前项目的网络访问地址
* @return 对象自身
*/
public SaTokenConfig setCurrDomain(String currDomain) {
this.currDomain = currDomain;
return this;
}
/**
* @return Same-Token 的有效期 (单位: 秒)
*/
public long getSameTokenTimeout() {
return sameTokenTimeout;
}
/**
* @param sameTokenTimeout Same-Token 的有效期 (单位: 秒)
* @return 对象自身
*/
public SaTokenConfig setSameTokenTimeout(long sameTokenTimeout) {
this.sameTokenTimeout = sameTokenTimeout;
return this;
}
/**
* @return 是否校验Same-Token(部分rpc插件有效)
*/
public Boolean getCheckSameToken() {
return checkSameToken;
}
/**
* @param checkSameToken 是否校验Same-Token(部分rpc插件有效)
* @return 对象自身
*/
public SaTokenConfig setCheckSameToken(Boolean checkSameToken) {
this.checkSameToken = checkSameToken;
return this;
}
/**
* @return 在 isConcurrent=false 时,决定新旧设备谁将放弃会话 (OLD_DEVICE=旧设备下线,新设备登录成功, NEW_DEVICE=新设备登录失败,旧设备维持在线)
*/
public SaReplacedLoginExitMode getReplacedLoginExitMode() {
return replacedLoginExitMode;
}
/**
* @param replacedLoginExitMode 在 isConcurrent=false 时,决定新旧设备谁将放弃会话 (OLD_DEVICE=旧设备下线,新设备登录成功, NEW_DEVICE=新设备登录失败,旧设备维持在线)
* @return 对象自身
*/
public SaTokenConfig setReplacedLoginExitMode(SaReplacedLoginExitMode replacedLoginExitMode) {
this.replacedLoginExitMode = replacedLoginExitMode;
return this;
}
/**
* 获取 当 isConcurrent=false 时,顶人下线的范围 (CURR_DEVICE_TYPE=当前指定的设备类型端 ALL_DEVICE_TYPE=所有设备类型端)
*
* @return /
*/
public SaReplacedRange getReplacedRange() {
return this.replacedRange;
}
/**
* 设置 当 isConcurrent=false 时,顶人下线的范围 (CURR_DEVICE_TYPE=当前指定的设备类型端 ALL_DEVICE_TYPE=所有设备类型端)
*
* @param replacedRange /
* @return 对象自身
*/
public SaTokenConfig setReplacedRange(SaReplacedRange replacedRange) {
this.replacedRange = replacedRange;
return this;
}
/**
* 获取 溢出 maxLoginCount 的客户端,将以何种方式注销下线 (LOGOUT=注销下线, KICKOUT=踢人下线, REPLACED=顶人下线)
*
* @return /
*/
public SaLogoutMode getOverflowLogoutMode() {
return this.overflowLogoutMode;
}
/**
* 设置 溢出 maxLoginCount 的客户端,将以何种方式注销下线 (LOGOUT=注销下线, KICKOUT=踢人下线, REPLACED=顶人下线)
*
* @param overflowLogoutMode /
* @return 对象自身
*/
public SaTokenConfig setOverflowLogoutMode(SaLogoutMode overflowLogoutMode) {
this.overflowLogoutMode = overflowLogoutMode;
return this;
}
/**
* 获取 注销范围 (TOKEN=只注销当前 token 的会话,ACCOUNT=注销当前 token 指向的 loginId 其所有客户端会话) <br> (此参数只在调用 StpUtil.logout() 时有效)
*
* @return /
*/
public SaLogoutRange getLogoutRange() {
return this.logoutRange;
}
/**
* 设置 注销范围 (TOKEN=只注销当前 token 的会话,ACCOUNT=注销当前 token 指向的 loginId 其所有客户端会话) <br> (此参数只在调用 StpUtil.logout() 时有效)
*
* @param logoutRange /
* @return 对象自身
*/
public SaTokenConfig setLogoutRange(SaLogoutRange logoutRange) {
this.logoutRange = logoutRange;
return this;
}
/**
* 获取 如果 token 已被冻结,是否保留其操作权 (是否允许此 token 调用注销API) <br> (此参数只在调用 StpUtil.[logoutkickoutreplaced]ByTokenValue("token") 时有效)
*
* @return isLogoutKeepFreezeOps /
*/
public Boolean getIsLogoutKeepFreezeOps() {
return this.isLogoutKeepFreezeOps;
}
/**
* 设置 如果 token 已被冻结,是否保留其操作权 (是否允许此 token 调用注销API) <br> (此参数只在调用 StpUtil.[logoutkickoutreplaced]ByTokenValue("token") 时有效)
*
* @param isLogoutKeepFreezeOps /
* @return 对象自身
*/
public SaTokenConfig setIsLogoutKeepFreezeOps(Boolean isLogoutKeepFreezeOps) {
this.isLogoutKeepFreezeOps = isLogoutKeepFreezeOps;
return this;
}
/**
* 获取 在注销 token 后,是否保留其对应的 Token-Session
*
* @return isLogoutKeepTokenSession /
*/
public Boolean getIsLogoutKeepTokenSession() {
return this.isLogoutKeepTokenSession;
}
/**
* 设置 在注销 token 后,是否保留其对应的 Token-Session
*
* @param isLogoutKeepTokenSession /
* @return 对象自身
*/
public SaTokenConfig setIsLogoutKeepTokenSession(Boolean isLogoutKeepTokenSession) {
this.isLogoutKeepTokenSession = isLogoutKeepTokenSession;
return this;
}
/**
* 获取 在登录时,是否立即创建对应的 Token-Session (true=在登录时立即创建,false=在第一次调用 getTokenSession() 时创建)
*
* @return /
*/
public Boolean getRightNowCreateTokenSession() {
return this.rightNowCreateTokenSession;
}
/**
* 设置 在登录时,是否立即创建对应的 Token-Session (true=在登录时立即创建,false=在第一次调用 getTokenSession() 时创建)
*
* @param rightNowCreateTokenSession /
* @return 对象自身
*/
public SaTokenConfig setRightNowCreateTokenSession(Boolean rightNowCreateTokenSession) {
this.rightNowCreateTokenSession = rightNowCreateTokenSession;
return this;
}
/**
* @return Cookie 全局配置对象
*/
public SaCookieConfig getCookie() {
return cookie;
}
/**
* @param cookie Cookie 全局配置对象
* @return 对象自身
*/
public SaTokenConfig setCookie(SaCookieConfig cookie) {
this.cookie = cookie;
return this;
}
@Override
public String toString() {
return "SaTokenConfig ["
+ "tokenName=" + tokenName
+ ", timeout=" + timeout
+ ", activeTimeout=" + activeTimeout
+ ", dynamicActiveTimeout=" + dynamicActiveTimeout
+ ", isConcurrent=" + isConcurrent
+ ", isShare=" + isShare
+ ", replacedRange=" + replacedRange
+ ", replacedLoginExitMode=" + replacedLoginExitMode
+ ", maxLoginCount=" + maxLoginCount
+ ", overflowLogoutMode=" + overflowLogoutMode
+ ", maxTryTimes=" + maxTryTimes
+ ", isReadBody=" + isReadBody
+ ", isReadHeader=" + isReadHeader
+ ", isReadCookie=" + isReadCookie
+ ", isLastingCookie=" + isLastingCookie
+ ", isWriteHeader=" + isWriteHeader
+ ", logoutRange=" + logoutRange
+ ", isLogoutKeepFreezeOps=" + isLogoutKeepFreezeOps
+ ", isLogoutKeepTokenSession=" + isLogoutKeepTokenSession
+ ", rightNowCreateTokenSession=" + rightNowCreateTokenSession
+ ", tokenStyle=" + tokenStyle
+ ", dataRefreshPeriod=" + dataRefreshPeriod
+ ", tokenSessionCheckLogin=" + tokenSessionCheckLogin
+ ", autoRenew=" + autoRenew
+ ", tokenPrefix=" + tokenPrefix
+ ", cookieAutoFillPrefix=" + cookieAutoFillPrefix
+ ", isPrint=" + isPrint
+ ", isLog=" + isLog
+ ", logLevel=" + logLevel
+ ", logLevelInt=" + logLevelInt
+ ", isColorLog=" + isColorLog
+ ", jwtSecretKey=" + jwtSecretKey
+ ", httpBasic=" + httpBasic
+ ", httpDigest=" + httpDigest
+ ", currDomain=" + currDomain
+ ", sameTokenTimeout=" + sameTokenTimeout
+ ", checkSameToken=" + checkSameToken
+ ", cookie=" + cookie
+ "]";
}
// ------------------- 过期方法 -------------------
/**
* <h2> 请更改为 getActiveTimeout() </h2>
* @return token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
* (例如可以设置为 1800 代表 30 分钟内无操作就冻结)
*/
@Deprecated
public long getActivityTimeout() {
// System.err.println("配置项已过期,请更换:sa-token.activity-timeout -> sa-token.active-timeout");
return activeTimeout;
}
/**
* <h2> 请更改为 setActiveTimeout() </h2>
* @param activityTimeout token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
* (例如可以设置为 1800 代表 30 分钟内无操作就冻结)
* @return 对象自身
*/
@Deprecated
public SaTokenConfig setActivityTimeout(long activityTimeout) {
System.err.println("配置项已过期,请更换:sa-token.activity-timeout -> sa-token.active-timeout");
this.activeTimeout = activityTimeout;
return this;
}
/**
* <h2> 请更改为 getHttpBasic() </h2>
* @return Http Basic 认证的默认账号和密码
*/
@Deprecated
public String getBasic() {
return httpBasic;
}
/**
* <h2> 请更改为 setHttpBasic() </h2>
* @param basic Http Basic 认证的默认账号和密码
* @return 对象自身
*/
@Deprecated
public SaTokenConfig setBasic(String basic) {
this.httpBasic = basic;
return this;
}
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfigFactory.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.config;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import cn.dev33.satoken.error.SaErrorCode;
import cn.dev33.satoken.exception.SaTokenException;
import cn.dev33.satoken.util.SaFoxUtil;
/**
* Sa-Token配置文件的构建工厂类
*
* <p> 用于手动读取配置文件初始化 SaTokenConfig 对象,只有在非IOC环境下你才会用到此类 </p>
*
* @author click33
* @since 1.10.0
*/
public class SaTokenConfigFactory {
private SaTokenConfigFactory() {
}
/**
* 配置文件地址
*/
public static String configPath = "sa-token.properties";
/**
* 根据 configPath 路径获取配置信息
*
* @return 一个SaTokenConfig对象
*/
public static SaTokenConfig createConfig() {
return createConfig(configPath);
}
/**
* 根据指定路径路径获取配置信息
*
* @param path 配置文件路径
* @return 一个 SaTokenConfig 对象
*/
public static SaTokenConfig createConfig(String path) {
Map<String, String> map = readPropToMap(path);
// if (map == null) {
// throw new RuntimeException("找不到配置文件:" + configPath, null);
// }
return (SaTokenConfig) initPropByMap(map, new SaTokenConfig());
}
/**
* 工具方法: 将指定路径的properties配置文件读取到Map中
*
* @param propertiesPath 配置文件地址
* @return 一个Map
*/
private static Map<String, String> readPropToMap(String propertiesPath) {
Map<String, String> map = new HashMap<>(16);
try {
InputStream is = SaTokenConfigFactory.class.getClassLoader().getResourceAsStream(propertiesPath);
if (is == null) {
return null;
}
Properties prop = new Properties();
prop.load(is);
for (String key : prop.stringPropertyNames()) {
map.put(key, prop.getProperty(key));
}
} catch (IOException e) {
throw new SaTokenException("配置文件(" + propertiesPath + ")加载失败", e).setCode(SaErrorCode.CODE_10021);
}
return map;
}
/**
* 工具方法: 将 Map 的值映射到一个 Model 上
*
* @param map 属性集合
* @param obj 对象, 或类型
* @return 返回实例化后的对象
*/
private static Object initPropByMap(Map<String, String> map, Object obj) {
if (map == null) {
map = new HashMap<>(16);
}
// 1、取出类型
Class<?> cs;
if (obj instanceof Class) {
// 如果是一个类型,则将obj=null,以便完成静态属性反射赋值
cs = (Class<?>) obj;
obj = null;
} else {
// 如果是一个对象,则取出其类型
cs = obj.getClass();
}
// 2、遍历类型属性,反射赋值
for (Field field : cs.getDeclaredFields()) {
String value = map.get(field.getName());
if (value == null) {
// 如果为空代表没有配置此项
continue;
}
try {
Object valueConvert = SaFoxUtil.getValueByType(value, field.getType());
field.setAccessible(true);
field.set(obj, valueConvert);
} catch (IllegalArgumentException | IllegalAccessException e) {
throw new SaTokenException("属性赋值出错:" + field.getName(), e).setCode(SaErrorCode.CODE_10022);
}
}
return obj;
}
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/context/SaHolder.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.context;
import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.application.SaApplication;
import cn.dev33.satoken.context.model.SaRequest;
import cn.dev33.satoken.context.model.SaResponse;
import cn.dev33.satoken.context.model.SaStorage;
/**
* Sa-Token 上下文持有类,你可以通过此类快速获取当前环境下的 SaRequest、SaResponse、SaStorage、SaApplication 对象。
*
* @author click33
* @since 1.18.0
*/
public class SaHolder {
/**
* 获取当前请求的 SaTokenContext 上下文对象
* @see SaTokenContext
*
* @return /
*/
public static SaTokenContext getContext() {
return SaManager.getSaTokenContext();
}
/**
* 获取当前请求的 Request 包装对象
* @see SaRequest
*
* @return /
*/
public static SaRequest getRequest() {
return SaManager.getSaTokenContext().getRequest();
}
/**
* 获取当前请求的 Response 包装对象
* @see SaResponse
*
* @return /
*/
public static SaResponse getResponse() {
return SaManager.getSaTokenContext().getResponse();
}
/**
* 获取当前请求的 Storage 包装对象
* @see SaStorage
*
* @return /
*/
public static SaStorage getStorage() {
return SaManager.getSaTokenContext().getStorage();
}
/**
* 获取全局 SaApplication 对象
* @see SaApplication
*
* @return /
*/
public static SaApplication getApplication() {
return SaApplication.defaultInstance;
}
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/context/SaTokenContext.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.context;
import cn.dev33.satoken.context.model.SaRequest;
import cn.dev33.satoken.context.model.SaResponse;
import cn.dev33.satoken.context.model.SaStorage;
import cn.dev33.satoken.context.model.SaTokenContextModelBox;
/**
* Sa-Token 上下文处理器
*
* <p> 上下文处理器封装了当前应用环境的底层操作,是 Sa-Token 对接不同 web 框架的关键,详细可参考在线文档 “自定义 SaTokenContext 指南”章节 </p>
*
* @author click33
* @since 1.16.0
*/
public interface SaTokenContext {
/**
* 初始化上下文
*
* @param req /
* @param res /
* @param stg /
*/
void setContext(SaRequest req, SaResponse res, SaStorage stg);
/**
* 清除化上下文
*/
void clearContext();
/**
* 判断当前上下文是否可用
*
* @return /
*/
boolean isValid();
/**
* 获取 Box 对象
*/
SaTokenContextModelBox getModelBox();
/**
* 获取当前上下文的 Request 包装对象
* @see SaRequest
*
* @return /
*/
default SaRequest getRequest() {
return getModelBox().getRequest();
}
/**
* 获取当前上下文的 Response 包装对象
* @see SaResponse
*
* @return /
*/
default SaResponse getResponse(){
return getModelBox().getResponse();
}
/**
* 获取当前上下文的 Storage 包装对象
* @see SaStorage
*
* @return /
*/
default SaStorage getStorage(){
return getModelBox().getStorage();
}
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/context/SaTokenContextDefaultImpl.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.context;
import cn.dev33.satoken.context.model.SaRequest;
import cn.dev33.satoken.context.model.SaResponse;
import cn.dev33.satoken.context.model.SaStorage;
import cn.dev33.satoken.context.model.SaTokenContextModelBox;
import cn.dev33.satoken.error.SaErrorCode;
import cn.dev33.satoken.exception.SaTokenContextException;
/**
* Sa-Token 上下文处理器 [ 默认实现类 ]
*
* <p>
* 一般情况下框架会为你自动注入合适的上下文处理器,如果代码断点走到了此默认实现类,
* 说明你引入的依赖有问题或者错误的调用了 Sa-Token 的API, 请在 [ 在线开发文档 → 附录 → 常见问题排查 ] 中按照提示进行排查
* </p>
*
* @author click33
* @since 1.16.0
*/
public class SaTokenContextDefaultImpl implements SaTokenContext {
/**
* 默认的上下文处理器对象
*/
public static SaTokenContextDefaultImpl defaultContext = new SaTokenContextDefaultImpl();
/**
* 错误提示语
*/
public static final String ERROR_MESSAGE = "未能获取有效的上下文处理器";
@Override
public void setContext(SaRequest req, SaResponse res, SaStorage stg) {
throw new SaTokenContextException(ERROR_MESSAGE).setCode(SaErrorCode.CODE_10001);
}
@Override
public void clearContext() {
throw new SaTokenContextException(ERROR_MESSAGE).setCode(SaErrorCode.CODE_10001);
}
@Override
public boolean isValid() {
throw new SaTokenContextException(ERROR_MESSAGE).setCode(SaErrorCode.CODE_10001);
}
@Override
public SaTokenContextModelBox getModelBox() {
throw new SaTokenContextException(ERROR_MESSAGE).setCode(SaErrorCode.CODE_10001);
}
@Override
public SaRequest getRequest() {
throw new SaTokenContextException(ERROR_MESSAGE).setCode(SaErrorCode.CODE_10001);
}
@Override
public SaResponse getResponse() {
throw new SaTokenContextException(ERROR_MESSAGE).setCode(SaErrorCode.CODE_10001);
}
@Override
public SaStorage getStorage() {
throw new SaTokenContextException(ERROR_MESSAGE).setCode(SaErrorCode.CODE_10001);
}
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/context/SaTokenContextForReadOnly.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.context;
import cn.dev33.satoken.context.model.SaRequest;
import cn.dev33.satoken.context.model.SaResponse;
import cn.dev33.satoken.context.model.SaStorage;
import cn.dev33.satoken.context.model.SaTokenContextModelBox;
/**
* Sa-Token 上下文处理器次级实现:只读上下文
*
* @author click33
* @since 1.42.0
*/
public interface SaTokenContextForReadOnly extends SaTokenContext {
@Override
default void setContext(SaRequest req, SaResponse res, SaStorage stg) {
}
@Override
default void clearContext() {
}
@Override
default SaTokenContextModelBox getModelBox() {
return null;
}
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/context/SaTokenContextForThreadLocal.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.context;
import cn.dev33.satoken.context.model.SaRequest;
import cn.dev33.satoken.context.model.SaResponse;
import cn.dev33.satoken.context.model.SaStorage;
import cn.dev33.satoken.context.model.SaTokenContextModelBox;
/**
* Sa-Token 上下文处理器 [ ThreadLocal 版本 ]
*
* <p>
* 使用 [ ThreadLocal 版本 ] 上下文处理器需要在全局过滤器或者拦截器内率先调用
* SaTokenContextForThreadLocalStaff.setBox(req, res, sto) 初始化上下文
* </p>
*
* <p> 一般情况下你不需要直接操作此类,因为框架的 starter 集成包里已经封装了完整的上下文操作 </p>
*
* @author click33
* @since 1.16.0
*/
public class SaTokenContextForThreadLocal implements SaTokenContext {
@Override
public void setContext(SaRequest req, SaResponse res, SaStorage stg) {
SaTokenContextForThreadLocalStaff.setModelBox(req, res, stg);
}
@Override
public void clearContext() {
SaTokenContextForThreadLocalStaff.clearModelBox();
}
@Override
public boolean isValid() {
return SaTokenContextForThreadLocalStaff.getModelBoxOrNull() != null;
}
@Override
public SaTokenContextModelBox getModelBox() {
return SaTokenContextForThreadLocalStaff.getModelBox();
}
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/context/SaTokenContextForThreadLocalStaff.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.context;
import cn.dev33.satoken.context.model.SaRequest;
import cn.dev33.satoken.context.model.SaResponse;
import cn.dev33.satoken.context.model.SaStorage;
import cn.dev33.satoken.context.model.SaTokenContextModelBox;
import cn.dev33.satoken.error.SaErrorCode;
import cn.dev33.satoken.exception.SaTokenContextException;
/**
* Sa-Token 上下文处理器 [ThreadLocal 版本] ---- 对象存储器
*
* <p> 一般情况下你不需要直接操作此类,因为框架的 starter 集成包里已经封装了完整的上下文操作 </p>
*
* @author click33
* @since 1.16.0
*/
public class SaTokenContextForThreadLocalStaff {
/**
* 基于 ThreadLocal 的 [ Box 存储器 ]
*/
public static ThreadLocal<SaTokenContextModelBox> modelBoxThreadLocal = new ThreadLocal<>();
/**
* 初始化当前线程的 [ Box 存储器 ]
* @param request {@link SaRequest}
* @param response {@link SaResponse}
* @param storage {@link SaStorage}
*/
public static void setModelBox(SaRequest request, SaResponse response, SaStorage storage) {
SaTokenContextModelBox bok = new SaTokenContextModelBox(request, response, storage);
modelBoxThreadLocal.set(bok);
}
/**
* 清除当前线程的 [ Box 存储器 ]
*/
public static void clearModelBox() {
modelBoxThreadLocal.remove();
}
/**
* 获取当前线程的 [ Box 存储器 ]
* @return /
*/
public static SaTokenContextModelBox getModelBoxOrNull() {
return modelBoxThreadLocal.get();
}
/**
* 获取当前线程的 [ Box 存储器 ], 如果为空则抛出异常
* @return /
*/
public static SaTokenContextModelBox getModelBox() {
SaTokenContextModelBox box = modelBoxThreadLocal.get();
if(box == null) {
throw new SaTokenContextException("SaTokenContext 上下文尚未初始化").setCode(SaErrorCode.CODE_10002);
}
return box;
}
/**
* 在当前线程的 SaRequest 包装对象
*
* @return /
*/
public static SaRequest getRequest() {
return getModelBox().getRequest();
}
/**
* 在当前线程的 SaResponse 包装对象
*
* @return /
*/
public static SaResponse getResponse() {
return getModelBox().getResponse();
}
/**
* 在当前线程的 SaStorage 存储器包装对象
*
* @return /
*/
public static SaStorage getStorage() {
return getModelBox().getStorage();
}
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/context/mock/SaRequestForMock.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.context.mock;
import cn.dev33.satoken.application.ApplicationInfo;
import cn.dev33.satoken.context.model.SaRequest;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 对 SaRequest 包装类的实现(Mock 版)
*
* @author click33
* @since 1.42.0
*/
public class SaRequestForMock implements SaRequest {
public Map<String, String> parameterMap = new LinkedHashMap<>();
public Map<String, String> headerMap = new LinkedHashMap<>();
public Map<String, String> cookieMap = new LinkedHashMap<>();
public String requestPath;
public String url;
public String method;
public String host;
public String forwardTo;
/**
* 获取底层源对象
*/
@Override
public Object getSource() {
return null;
}
/**
* 在 [请求体] 里获取一个值
*/
@Override
public String getParam(String name) {
return parameterMap.get(name);
}
/**
* 获取 [请求体] 里提交的所有参数名称
* @return 参数名称列表
*/
@Override
public Collection<String> getParamNames(){
return parameterMap.keySet();
}
/**
* 获取 [请求体] 里提交的所有参数
* @return 参数列表
*/
@Override
public Map<String, String> getParamMap(){
return parameterMap;
}
/**
* 在 [请求头] 里获取一个值
*/
@Override
public String getHeader(String name) {
return headerMap.get(name);
}
/**
* 在 [Cookie作用域] 里获取一个值
*/
@Override
public String getCookieValue(String name) {
return getCookieLastValue(name);
}
/**
* 在 [ Cookie作用域 ] 里获取一个值 (第一个此名称的)
*/
@Override
public String getCookieFirstValue(String name){
return cookieMap.get(name);
}
/**
* 在 [ Cookie作用域 ] 里获取一个值 (最后一个此名称的)
* @param name 键
* @return 值
*/
@Override
public String getCookieLastValue(String name){
return cookieMap.get(name);
}
/**
* 返回当前请求path (不包括上下文名称)
*/
@Override
public String getRequestPath() {
return ApplicationInfo.cutPathPrefix(requestPath);
}
/**
* 返回当前请求的url,例:http://xxx.com/test
* @return see note
*/
public String getUrl() {
return url;
}
/**
* 返回当前请求的类型
*/
@Override
public String getMethod() {
return method;
}
/**
* 查询请求 host
*/
@Override
public String getHost() {
return host;
}
/**
* 转发请求
*/
@Override
public Object forward(String path) {
this.forwardTo = path;
return null;
}
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/context/mock/SaResponseForMock.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.context.mock;
import cn.dev33.satoken.context.model.SaResponse;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 对 SaResponse 包装类的实现(Mock 版)
*
* @author click33
* @since 1.42.0
*/
public class SaResponseForMock implements SaResponse {
public int status;
public Map<String, String> headerMap = new LinkedHashMap<>();
public String redirectTo;
/**
* 获取底层源对象
*/
@Override
public Object getSource() {
return null;
}
/**
* 设置响应状态码
*/
@Override
public SaResponse setStatus(int sc) {
this.status = sc;
return this;
}
/**
* 在响应头里写入一个值
*/
@Override
public SaResponse setHeader(String name, String value) {
headerMap.put(name, value);
return this;
}
/**
* 在响应头里添加一个值
* @param name 名字
* @param value 值
* @return 对象自身
*/
public SaResponse addHeader(String name, String value) {
headerMap.put(name, value);
return this;
}
/**
* 重定向
*/
@Override
public Object redirect(String url) {
this.redirectTo = url;
return null;
}
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/context/mock/SaStorageForMock.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.context.mock;
import cn.dev33.satoken.context.model.SaStorage;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 对 SaStorage 包装类的实现(Mock 版)
*
* @author click33
* @since 1.42.0
*/
public class SaStorageForMock implements SaStorage {
public Map<String, Object> dataMap = new LinkedHashMap<>();
/**
* 获取底层源对象
*/
@Override
public Object getSource() {
return null;
}
/**
* 在 [Request作用域] 里写入一个值
*/
@Override
public SaStorageForMock set(String key, Object value) {
dataMap.put(key, value);
return this;
}
/**
* 在 [Request作用域] 里获取一个值
*/
@Override
public Object get(String key) {
return dataMap.get(key);
}
/**
* 在 [Request作用域] 里删除一个值
*/
@Override
public SaStorageForMock delete(String key) {
dataMap.remove(key);
return this;
}
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/context/mock/SaTokenContextMockUtil.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.context.mock;
import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.fun.SaFunction;
import cn.dev33.satoken.fun.SaRetGenericFunction;
/**
* Sa-Token Mock 上下文 操作工具类
*
* @author click33
* @since 1.42.0
*/
public class SaTokenContextMockUtil {
/**
* 写入 Mock 上下文
*/
public static void setMockContext() {
SaRequestForMock request = new SaRequestForMock();
SaResponseForMock response = new SaResponseForMock();
SaStorageForMock storage = new SaStorageForMock();
SaManager.getSaTokenContext().setContext(request, response, storage);
}
/**
* 写入 Mock 上下文,并执行一段代码,执行完毕后清除上下文
*
* @param fun /
*/
public static void setMockContext(SaFunction fun) {
try {
setMockContext();
fun.run();
} finally {
clearContext();
}
}
/**
* 写入 Mock 上下文,并执行一段代码,执行完毕后清除上下文
*
* @param fun /
*/
public static <T> T setMockContext(SaRetGenericFunction<T> fun) {
try {
setMockContext();
return fun.run();
} finally {
clearContext();
}
}
/**
* 清除上下文
*/
public static void clearContext() {
SaManager.getSaTokenContext().clearContext();
}
}
================================================
FILE: sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaCookie.java
================================================
/*
* Copyright 2020-2099 sa-token.cc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cn.dev33.satoken.context.model;
import cn.dev33.satoken.error.SaErrorCode;
import cn.dev33.satoken.exception.SaTokenException;
import cn.dev33.satoken.util.SaFoxUtil;
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* Cookie Model,代表一个 Cookie 应该具有的所有参数
*
* @author click33
* @since 1.16.0
*/
public class SaCookie {
/**
* 写入响应头时使用的key
*/
public static final String HEADER_NAME = "Set-Cookie";
/**
* 名称
*/
private String name;
/**
* 值
*/
private String value;
/**
* 有效时长 (单位:秒),-1 代表为临时Cookie 浏览器关闭后自动删除
*/
private int maxAge = -1;
/**
* 域
*/
private String domain;
/**
* 路径
*/
private String path;
/**
* 是否只在 https 协议下有效
*/
private Boolean secure = false;
/**
* 是否禁止 js 操作 Cookie
*/
private Boolean httpOnly = false;
/**
* 第三方限制级别(Strict=完全禁止,Lax=部分允许,None=不限制)
*/
private String sameSite;
// Cookie 属性参考文章:https://blog.csdn.net/fengbin2005/article/details/136544226
/**
* 额外扩展属性
*/
private Map<String, String> extraAttrs = new LinkedHashMap<>();
/**
* 构造一个
*/
public SaCookie() {
}
/**
* 构造一个
* @param name 名字
* @param value 值
*/
public SaCookie(String name, String value) {
this.name = name;
this.value = value;
}
/**
* @return 名称
*/
public String getName() {
return name;
}
/**
* @param name 名称
* @return 对象自身
*/
public SaCookie setName(String name) {
this.name = name;
return this;
}
/**
* @return 值
*/
public String getValue() {
return value;
}
/**
* @param value 值
* @return 对象自身
*/
public SaCookie setValue(String value) {
this.value = value;
return this;
}
/**
* @return 有效时长 (单位:秒),-1 代表为临时Cookie 浏览器关闭后自动删除
*/
public int getMaxAge() {
return maxAge;
}
/**
* @param maxAge 有效时长 (单位:秒),-1 代表为临时Cookie 浏览器关闭后自动删除
* @return 对象自身
*/
public SaCookie setMaxAge(int maxAge) {
this.maxAge = maxAge;
return this;
}
/**
* @return 域
*/
public String getDomain() {
return domain;
}
/**
* @param domain 域
* @return 对象自身
*/
public SaCookie setDomain(String domain) {
this.domain = domain;
return this;
}
/**
* @return 路径
*/
public String getPath() {
return path;
}
/**
* @param path 路径
* @return 对象自身
*/
public SaCookie setPath(String path) {
this.path = path;
return this;
}
/**
* @return 是否只在 https 协议下有效
*/
public Boolean getSecure() {
return secure;
}
/**
* @param secure 是否只在 https 协议下有效
* @return 对象自身
*/
public SaCookie setSecure(Boolean secure) {
this.secure = secure;
return this;
}
/**
* @return 是否禁止 js 操作 Cookie
*/
public Boolean getHttpOnly() {
return httpOnly;
}
/**
* @param httpOnly 是否禁止 js 操作 Cookie
* @return 对象自身
*/
public SaCookie setHttpOnly(Boolean httpOnly) {
this.httpOnly = httpOnly;
return this;
}
/**
* @return 第三方限制级别(Strict=完全禁止,Lax=部分允许,None=不限制)
*/
public String getSameSite() {
return sameSite;
}
/**
* @param sameSite 第三方限制级别(Strict=完全禁
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
Showing preview only (722K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (7953 symbols across 952 files)
FILE: .agents/skills/remove-redundancy-import/scan_redundant_imports.py
function get_simple_name (line 13) | def get_simple_name(imp: str) -> str | None:
function get_import_full (line 24) | def get_import_full(imp: str) -> str:
function get_import_package (line 30) | def get_import_package(imp: str) -> str:
function find_class_body_start (line 39) | def find_class_body_start(content: str) -> int:
function main (line 47) | def main() -> None:
FILE: sa-token-core/src/main/java/cn/dev33/satoken/SaManager.java
class SaManager (line 54) | public class SaManager {
method setConfig (line 60) | public static void setConfig(SaTokenConfig config) {
method setConfigMethod (line 79) | private static void setConfigMethod(SaTokenConfig config) {
method getConfig (line 87) | public static SaTokenConfig getConfig() {
method setSaTokenDao (line 102) | public static void setSaTokenDao(SaTokenDao saTokenDao) {
method setSaTokenDaoMethod (line 106) | private static void setSaTokenDaoMethod(SaTokenDao saTokenDao) {
method getSaTokenDao (line 115) | public static SaTokenDao getSaTokenDao() {
method setStpInterface (line 130) | public static void setStpInterface(StpInterface stpInterface) {
method getStpInterface (line 134) | public static StpInterface getStpInterface() {
method setSaTokenContext (line 149) | public static void setSaTokenContext(SaTokenContext saTokenContext) {
method getSaTokenContext (line 153) | public static SaTokenContext getSaTokenContext() {
method setSaTempTemplate (line 168) | public static void setSaTempTemplate(SaTempTemplate saTempTemplate) {
method getSaTempTemplate (line 172) | public static SaTempTemplate getSaTempTemplate() {
method setSaJsonTemplate (line 187) | public static void setSaJsonTemplate(SaJsonTemplate saJsonTemplate) {
method getSaJsonTemplate (line 191) | public static SaJsonTemplate getSaJsonTemplate() {
method setSaHttpTemplate (line 206) | public static void setSaHttpTemplate(SaHttpTemplate saHttpTemplate) {
method getSaHttpTemplate (line 210) | public static SaHttpTemplate getSaHttpTemplate() {
method setSaSerializerTemplate (line 225) | public static void setSaSerializerTemplate(SaSerializerTemplate saSeri...
method getSaSerializerTemplate (line 229) | public static SaSerializerTemplate getSaSerializerTemplate() {
method setSaSameTemplate (line 244) | public static void setSaSameTemplate(SaSameTemplate saSameTemplate) {
method getSaSameTemplate (line 248) | public static SaSameTemplate getSaSameTemplate() {
method setLog (line 263) | public static void setLog(SaLog log) {
method getLog (line 267) | public static SaLog getLog() {
method setSaTotpTemplate (line 275) | public static void setSaTotpTemplate(SaTotpTemplate totpTemplate) {
method getSaTotpTemplate (line 279) | public static SaTotpTemplate getSaTotpTemplate() {
method putStpLogic (line 302) | public static void putStpLogic(StpLogic stpLogic) {
method removeStpLogic (line 309) | public static void removeStpLogic(String loginType) {
method getStpLogic (line 318) | public static StpLogic getStpLogic(String loginType) {
method getStpLogic (line 328) | public static StpLogic getStpLogic(String loginType, boolean isCreate) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaMode.java
type SaMode (line 24) | public enum SaMode {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaAnnotationHandlerInterface.java
type SaAnnotationHandlerInterface (line 27) | public interface SaAnnotationHandlerInterface<T extends Annotation> {
method getHandlerAnnotationClass (line 33) | Class<T> getHandlerAnnotationClass();
method check (line 40) | @SuppressWarnings("unchecked")
method checkMethod (line 50) | void checkMethod(T at, AnnotatedElement element);
FILE: sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaCheckDisableHandler.java
class SaCheckDisableHandler (line 30) | public class SaCheckDisableHandler implements SaAnnotationHandlerInterfa...
method getHandlerAnnotationClass (line 32) | @Override
method checkMethod (line 37) | @Override
method _checkMethod (line 42) | public static void _checkMethod(String type, String[] value, int level) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaCheckHttpBasicHandler.java
class SaCheckHttpBasicHandler (line 29) | public class SaCheckHttpBasicHandler implements SaAnnotationHandlerInter...
method getHandlerAnnotationClass (line 31) | @Override
method checkMethod (line 36) | @Override
method _checkMethod (line 41) | public static void _checkMethod(String realm, String account) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaCheckHttpDigestHandler.java
class SaCheckHttpDigestHandler (line 31) | public class SaCheckHttpDigestHandler implements SaAnnotationHandlerInte...
method getHandlerAnnotationClass (line 33) | @Override
method checkMethod (line 38) | @Override
method _checkMethod (line 43) | public static void _checkMethod(String username, String password, Stri...
FILE: sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaCheckLoginHandler.java
class SaCheckLoginHandler (line 30) | public class SaCheckLoginHandler implements SaAnnotationHandlerInterface...
method getHandlerAnnotationClass (line 32) | @Override
method checkMethod (line 37) | @Override
method _checkMethod (line 42) | public static void _checkMethod(String type) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaCheckOrHandler.java
class SaCheckOrHandler (line 34) | public class SaCheckOrHandler implements SaAnnotationHandlerInterface<Sa...
method getHandlerAnnotationClass (line 36) | @Override
method checkMethod (line 41) | @Override
method _checkMethod (line 46) | public static void _checkMethod(
FILE: sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaCheckPermissionHandler.java
class SaCheckPermissionHandler (line 33) | public class SaCheckPermissionHandler implements SaAnnotationHandlerInte...
method getHandlerAnnotationClass (line 35) | @Override
method checkMethod (line 40) | @Override
method _checkMethod (line 45) | public static void _checkMethod(String type, String[] value, SaMode mo...
FILE: sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaCheckRoleHandler.java
class SaCheckRoleHandler (line 31) | public class SaCheckRoleHandler implements SaAnnotationHandlerInterface<...
method getHandlerAnnotationClass (line 33) | @Override
method checkMethod (line 38) | @Override
method _checkMethod (line 43) | public static void _checkMethod(String type, String[] value, SaMode mo...
FILE: sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaCheckSafeHandler.java
class SaCheckSafeHandler (line 30) | public class SaCheckSafeHandler implements SaAnnotationHandlerInterface<...
method getHandlerAnnotationClass (line 32) | @Override
method checkMethod (line 37) | @Override
method _checkMethod (line 42) | public static void _checkMethod(String type, String value) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaIgnoreHandler.java
class SaIgnoreHandler (line 30) | public class SaIgnoreHandler implements SaAnnotationHandlerInterface<SaI...
method getHandlerAnnotationClass (line 32) | @Override
method checkMethod (line 37) | @Override
method _checkMethod (line 42) | public static void _checkMethod() {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/application/ApplicationInfo.java
class ApplicationInfo (line 26) | public class ApplicationInfo {
method cutPathPrefix (line 38) | public static String cutPathPrefix(String path) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/application/SaApplication.java
class SaApplication (line 32) | public class SaApplication implements SaSetValueInterface {
method get (line 42) | @Override
method set (line 48) | @Override
method delete (line 54) | @Override
method set (line 70) | public SaApplication set(String key, Object value, long ttl) {
method keys (line 79) | public List<String> keys() {
method clear (line 100) | public void clear() {
method splicingDataKey (line 113) | public String splicingDataKey(String key) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/application/SaGetValueInterface.java
type SaGetValueInterface (line 27) | public interface SaGetValueInterface {
method get (line 36) | Object get(String key);
method get (line 49) | default <T> T get(String key, T defaultValue) {
method getString (line 58) | default String getString(String key) {
method getInt (line 71) | default int getInt(String key) {
method getLong (line 80) | default long getLong(String key) {
method getDouble (line 89) | default double getDouble(String key) {
method getFloat (line 98) | default float getFloat(String key) {
method getModel (line 109) | default <T> T getModel(String key, Class<T> cs) {
method getModel (line 121) | @SuppressWarnings("unchecked")
method has (line 132) | default boolean has(String key) {
method valueIsNull (line 144) | default boolean valueIsNull(Object value) {
method getValueByDefaultValue (line 155) | @SuppressWarnings("unchecked")
FILE: sa-token-core/src/main/java/cn/dev33/satoken/application/SaSetValueInterface.java
type SaSetValueInterface (line 27) | public interface SaSetValueInterface extends SaGetValueInterface {
method set (line 37) | SaSetValueInterface set(String key, Object value);
method delete (line 44) | SaSetValueInterface delete(String key);
method get (line 57) | @SuppressWarnings("unchecked")
method setByNull (line 73) | default SaSetValueInterface setByNull(String key, Object value) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/config/SaCookieConfig.java
class SaCookieConfig (line 27) | public class SaCookieConfig {
method getDomain (line 72) | public String getDomain() {
method setDomain (line 83) | public SaCookieConfig setDomain(String domain) {
method getPath (line 91) | public String getPath() {
method setPath (line 99) | public SaCookieConfig setPath(String path) {
method getSecure (line 107) | public Boolean getSecure() {
method setSecure (line 115) | public SaCookieConfig setSecure(Boolean secure) {
method getHttpOnly (line 123) | public Boolean getHttpOnly() {
method setHttpOnly (line 131) | public SaCookieConfig setHttpOnly(Boolean httpOnly) {
method getSameSite (line 139) | public String getSameSite() {
method setSameSite (line 147) | public SaCookieConfig setSameSite(String sameSite) {
method getExtraAttrs (line 155) | public Map<String, String> getExtraAttrs() {
method setExtraAttrs (line 164) | public SaCookieConfig setExtraAttrs(Map<String, String> extraAttrs) {
method addExtraAttr (line 175) | public SaCookieConfig addExtraAttr(String name, String value) {
method addExtraAttr (line 188) | public SaCookieConfig addExtraAttr(String name) {
method removeExtraAttr (line 197) | public SaCookieConfig removeExtraAttr(String name) {
method toString (line 205) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java
class SaTokenConfig (line 37) | public class SaTokenConfig implements Serializable {
method getTokenName (line 233) | public String getTokenName() {
method setTokenName (line 241) | public SaTokenConfig setTokenName(String tokenName) {
method getTimeout (line 249) | public long getTimeout() {
method setTimeout (line 257) | public SaTokenConfig setTimeout(long timeout) {
method getActiveTimeout (line 266) | public long getActiveTimeout() {
method setActiveTimeout (line 275) | public SaTokenConfig setActiveTimeout(long activeTimeout) {
method getDynamicActiveTimeout (line 283) | public Boolean getDynamicActiveTimeout() {
method setDynamicActiveTimeout (line 291) | public SaTokenConfig setDynamicActiveTimeout(Boolean dynamicActiveTime...
method getIsConcurrent (line 299) | public Boolean getIsConcurrent() {
method setIsConcurrent (line 307) | public SaTokenConfig setIsConcurrent(Boolean isConcurrent) {
method getIsShare (line 315) | public Boolean getIsShare() {
method setIsShare (line 323) | public SaTokenConfig setIsShare(Boolean isShare) {
method getMaxLoginCount (line 331) | public int getMaxLoginCount() {
method setMaxLoginCount (line 339) | public SaTokenConfig setMaxLoginCount(int maxLoginCount) {
method getMaxTryTimes (line 347) | public int getMaxTryTimes() {
method setMaxTryTimes (line 355) | public SaTokenConfig setMaxTryTimes(int maxTryTimes) {
method getIsReadBody (line 363) | public Boolean getIsReadBody() {
method setIsReadBody (line 371) | public SaTokenConfig setIsReadBody(Boolean isReadBody) {
method getIsReadHeader (line 379) | public Boolean getIsReadHeader() {
method setIsReadHeader (line 387) | public SaTokenConfig setIsReadHeader(Boolean isReadHeader) {
method getIsReadCookie (line 395) | public Boolean getIsReadCookie() {
method setIsReadCookie (line 403) | public SaTokenConfig setIsReadCookie(Boolean isReadCookie) {
method getIsLastingCookie (line 413) | public Boolean getIsLastingCookie() {
method setIsLastingCookie (line 423) | public SaTokenConfig setIsLastingCookie(Boolean isLastingCookie) {
method getIsWriteHeader (line 431) | public Boolean getIsWriteHeader() {
method setIsWriteHeader (line 439) | public SaTokenConfig setIsWriteHeader(Boolean isWriteHeader) {
method getTokenStyle (line 447) | public String getTokenStyle() {
method setTokenStyle (line 455) | public SaTokenConfig setTokenStyle(String tokenStyle) {
method getDataRefreshPeriod (line 463) | public int getDataRefreshPeriod() {
method setDataRefreshPeriod (line 471) | public SaTokenConfig setDataRefreshPeriod(int dataRefreshPeriod) {
method getTokenSessionCheckLogin (line 479) | public Boolean getTokenSessionCheckLogin() {
method setTokenSessionCheckLogin (line 487) | public SaTokenConfig setTokenSessionCheckLogin(Boolean tokenSessionChe...
method getAutoRenew (line 495) | public Boolean getAutoRenew() {
method setAutoRenew (line 503) | public SaTokenConfig setAutoRenew(Boolean autoRenew) {
method getTokenPrefix (line 511) | public String getTokenPrefix() {
method setTokenPrefix (line 519) | public SaTokenConfig setTokenPrefix(String tokenPrefix) {
method getCookieAutoFillPrefix (line 527) | public Boolean getCookieAutoFillPrefix() {
method setCookieAutoFillPrefix (line 535) | public SaTokenConfig setCookieAutoFillPrefix(Boolean cookieAutoFillPre...
method getIsPrint (line 543) | public Boolean getIsPrint() {
method setIsPrint (line 551) | public SaTokenConfig setIsPrint(Boolean isPrint) {
method getIsLog (line 559) | public Boolean getIsLog() {
method setIsLog (line 567) | public SaTokenConfig setIsLog(Boolean isLog) {
method getLogLevel (line 575) | public String getLogLevel() {
method setLogLevel (line 583) | public SaTokenConfig setLogLevel(String logLevel) {
method getLogLevelInt (line 592) | public int getLogLevelInt() {
method setLogLevelInt (line 600) | public SaTokenConfig setLogLevelInt(int logLevelInt) {
method getIsColorLog (line 611) | public Boolean getIsColorLog() {
method setIsColorLog (line 621) | public SaTokenConfig setIsColorLog(Boolean isColorLog) {
method getJwtSecretKey (line 629) | public String getJwtSecretKey() {
method setJwtSecretKey (line 637) | public SaTokenConfig setJwtSecretKey(String jwtSecretKey) {
method getHttpBasic (line 645) | public String getHttpBasic() {
method setHttpBasic (line 653) | public SaTokenConfig setHttpBasic(String httpBasic) {
method getHttpDigest (line 661) | public String getHttpDigest() {
method setHttpDigest (line 669) | public SaTokenConfig setHttpDigest(String httpDigest) {
method getCurrDomain (line 677) | public String getCurrDomain() {
method setCurrDomain (line 685) | public SaTokenConfig setCurrDomain(String currDomain) {
method getSameTokenTimeout (line 693) | public long getSameTokenTimeout() {
method setSameTokenTimeout (line 701) | public SaTokenConfig setSameTokenTimeout(long sameTokenTimeout) {
method getCheckSameToken (line 709) | public Boolean getCheckSameToken() {
method setCheckSameToken (line 717) | public SaTokenConfig setCheckSameToken(Boolean checkSameToken) {
method getReplacedLoginExitMode (line 725) | public SaReplacedLoginExitMode getReplacedLoginExitMode() {
method setReplacedLoginExitMode (line 733) | public SaTokenConfig setReplacedLoginExitMode(SaReplacedLoginExitMode ...
method getReplacedRange (line 743) | public SaReplacedRange getReplacedRange() {
method setReplacedRange (line 753) | public SaTokenConfig setReplacedRange(SaReplacedRange replacedRange) {
method getOverflowLogoutMode (line 763) | public SaLogoutMode getOverflowLogoutMode() {
method setOverflowLogoutMode (line 773) | public SaTokenConfig setOverflowLogoutMode(SaLogoutMode overflowLogout...
method getLogoutRange (line 783) | public SaLogoutRange getLogoutRange() {
method setLogoutRange (line 793) | public SaTokenConfig setLogoutRange(SaLogoutRange logoutRange) {
method getIsLogoutKeepFreezeOps (line 803) | public Boolean getIsLogoutKeepFreezeOps() {
method setIsLogoutKeepFreezeOps (line 813) | public SaTokenConfig setIsLogoutKeepFreezeOps(Boolean isLogoutKeepFree...
method getIsLogoutKeepTokenSession (line 823) | public Boolean getIsLogoutKeepTokenSession() {
method setIsLogoutKeepTokenSession (line 833) | public SaTokenConfig setIsLogoutKeepTokenSession(Boolean isLogoutKeepT...
method getRightNowCreateTokenSession (line 843) | public Boolean getRightNowCreateTokenSession() {
method setRightNowCreateTokenSession (line 853) | public SaTokenConfig setRightNowCreateTokenSession(Boolean rightNowCre...
method getCookie (line 861) | public SaCookieConfig getCookie() {
method setCookie (line 869) | public SaTokenConfig setCookie(SaCookieConfig cookie) {
method toString (line 875) | @Override
method getActivityTimeout (line 928) | @Deprecated
method setActivityTimeout (line 940) | @Deprecated
method getBasic (line 951) | @Deprecated
method setBasic (line 961) | @Deprecated
FILE: sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfigFactory.java
class SaTokenConfigFactory (line 37) | public class SaTokenConfigFactory {
method SaTokenConfigFactory (line 39) | private SaTokenConfigFactory() {
method createConfig (line 52) | public static SaTokenConfig createConfig() {
method createConfig (line 62) | public static SaTokenConfig createConfig(String path) {
method readPropToMap (line 76) | private static Map<String, String> readPropToMap(String propertiesPath) {
method initPropByMap (line 101) | private static Object initPropByMap(Map<String, String> map, Object ob...
FILE: sa-token-core/src/main/java/cn/dev33/satoken/context/SaHolder.java
class SaHolder (line 30) | public class SaHolder {
method getContext (line 38) | public static SaTokenContext getContext() {
method getRequest (line 48) | public static SaRequest getRequest() {
method getResponse (line 58) | public static SaResponse getResponse() {
method getStorage (line 68) | public static SaStorage getStorage() {
method getApplication (line 78) | public static SaApplication getApplication() {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/context/SaTokenContext.java
type SaTokenContext (line 31) | public interface SaTokenContext {
method setContext (line 40) | void setContext(SaRequest req, SaResponse res, SaStorage stg);
method clearContext (line 45) | void clearContext();
method isValid (line 52) | boolean isValid();
method getModelBox (line 57) | SaTokenContextModelBox getModelBox();
method getRequest (line 65) | default SaRequest getRequest() {
method getResponse (line 75) | default SaResponse getResponse(){
method getStorage (line 85) | default SaStorage getStorage(){
FILE: sa-token-core/src/main/java/cn/dev33/satoken/context/SaTokenContextDefaultImpl.java
class SaTokenContextDefaultImpl (line 36) | public class SaTokenContextDefaultImpl implements SaTokenContext {
method setContext (line 48) | @Override
method clearContext (line 53) | @Override
method isValid (line 58) | @Override
method getModelBox (line 63) | @Override
method getRequest (line 68) | @Override
method getResponse (line 73) | @Override
method getStorage (line 78) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/context/SaTokenContextForReadOnly.java
type SaTokenContextForReadOnly (line 29) | public interface SaTokenContextForReadOnly extends SaTokenContext {
method setContext (line 31) | @Override
method clearContext (line 36) | @Override
method getModelBox (line 41) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/context/SaTokenContextForThreadLocal.java
class SaTokenContextForThreadLocal (line 36) | public class SaTokenContextForThreadLocal implements SaTokenContext {
method setContext (line 38) | @Override
method clearContext (line 43) | @Override
method isValid (line 48) | @Override
method getModelBox (line 53) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/context/SaTokenContextForThreadLocalStaff.java
class SaTokenContextForThreadLocalStaff (line 33) | public class SaTokenContextForThreadLocalStaff {
method setModelBox (line 46) | public static void setModelBox(SaRequest request, SaResponse response,...
method clearModelBox (line 54) | public static void clearModelBox() {
method getModelBoxOrNull (line 62) | public static SaTokenContextModelBox getModelBoxOrNull() {
method getModelBox (line 70) | public static SaTokenContextModelBox getModelBox() {
method getRequest (line 83) | public static SaRequest getRequest() {
method getResponse (line 92) | public static SaResponse getResponse() {
method getStorage (line 101) | public static SaStorage getStorage() {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/context/mock/SaRequestForMock.java
class SaRequestForMock (line 31) | public class SaRequestForMock implements SaRequest {
method getSource (line 45) | @Override
method getParam (line 53) | @Override
method getParamNames (line 62) | @Override
method getParamMap (line 71) | @Override
method getHeader (line 79) | @Override
method getCookieValue (line 87) | @Override
method getCookieFirstValue (line 95) | @Override
method getCookieLastValue (line 105) | @Override
method getRequestPath (line 113) | @Override
method getUrl (line 122) | public String getUrl() {
method getMethod (line 129) | @Override
method getHost (line 137) | @Override
method forward (line 145) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/context/mock/SaResponseForMock.java
class SaResponseForMock (line 29) | public class SaResponseForMock implements SaResponse {
method getSource (line 39) | @Override
method setStatus (line 47) | @Override
method setHeader (line 56) | @Override
method addHeader (line 68) | public SaResponse addHeader(String name, String value) {
method redirect (line 76) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/context/mock/SaStorageForMock.java
class SaStorageForMock (line 29) | public class SaStorageForMock implements SaStorage {
method getSource (line 36) | @Override
method set (line 44) | @Override
method get (line 53) | @Override
method delete (line 61) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/context/mock/SaTokenContextMockUtil.java
class SaTokenContextMockUtil (line 28) | public class SaTokenContextMockUtil {
method setMockContext (line 33) | public static void setMockContext() {
method setMockContext (line 45) | public static void setMockContext(SaFunction fun) {
method setMockContext (line 59) | public static <T> T setMockContext(SaRetGenericFunction<T> fun) {
method clearContext (line 71) | public static void clearContext() {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaCookie.java
class SaCookie (line 35) | public class SaCookie {
method SaCookie (line 93) | public SaCookie() {
method SaCookie (line 101) | public SaCookie(String name, String value) {
method getName (line 111) | public String getName() {
method setName (line 119) | public SaCookie setName(String name) {
method getValue (line 127) | public String getValue() {
method setValue (line 135) | public SaCookie setValue(String value) {
method getMaxAge (line 143) | public int getMaxAge() {
method setMaxAge (line 151) | public SaCookie setMaxAge(int maxAge) {
method getDomain (line 159) | public String getDomain() {
method setDomain (line 167) | public SaCookie setDomain(String domain) {
method getPath (line 175) | public String getPath() {
method setPath (line 183) | public SaCookie setPath(String path) {
method getSecure (line 191) | public Boolean getSecure() {
method setSecure (line 199) | public SaCookie setSecure(Boolean secure) {
method getHttpOnly (line 207) | public Boolean getHttpOnly() {
method setHttpOnly (line 215) | public SaCookie setHttpOnly(Boolean httpOnly) {
method getSameSite (line 223) | public String getSameSite() {
method setSameSite (line 231) | public SaCookie setSameSite(String sameSite) {
method getExtraAttrs (line 239) | public Map<String, String> getExtraAttrs() {
method setExtraAttrs (line 248) | public SaCookie setExtraAttrs(Map<String, String> extraAttrs) {
method addExtraAttr (line 259) | public SaCookie addExtraAttr(String name, String value) {
method addExtraAttr (line 272) | public SaCookie addExtraAttr(String name) {
method removeExtraAttr (line 281) | public SaCookie removeExtraAttr(String name) {
method toString (line 290) | @Override
method builder (line 308) | public void builder() {
method toHeaderValue (line 318) | public String toHeaderValue() {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaRequest.java
type SaRequest (line 32) | public interface SaRequest {
method getSource (line 38) | Object getSource();
method getParam (line 45) | String getParam(String name);
method getParam (line 53) | default String getParam(String name, String defaultValue) {
method isParam (line 67) | default boolean isParam(String name, String value) {
method hasParam (line 77) | default boolean hasParam(String name) {
method getParamNotNull (line 86) | default String getParamNotNull(String name) {
method getParamNames (line 98) | Collection<String> getParamNames();
method getParamMap (line 104) | Map<String, String> getParamMap();
method getHeader (line 111) | String getHeader(String name);
method getHeader (line 119) | default String getHeader(String name, String defaultValue) {
method getCookieValue (line 132) | String getCookieValue(String name);
method getCookieFirstValue (line 139) | String getCookieFirstValue(String name);
method getCookieLastValue (line 146) | String getCookieLastValue(String name);
method getRequestPath (line 152) | String getRequestPath();
method isPath (line 159) | default boolean isPath(String path) {
method getUrl (line 167) | String getUrl();
method getMethod (line 173) | String getMethod();
method isMethod (line 180) | default boolean isMethod(String method) {
method isMethod (line 189) | default boolean isMethod(SaHttpMethod method) {
method getHost (line 197) | String getHost();
method isAjax (line 203) | default boolean isAjax() {
method forward (line 212) | Object forward(String path);
FILE: sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaResponse.java
type SaResponse (line 24) | public interface SaResponse {
method getSource (line 35) | Object getSource();
method deleteCookie (line 41) | default void deleteCookie(String name) {
method deleteCookie (line 51) | default void deleteCookie(String name, String path, String domain) {
method addCookie (line 63) | default void addCookie(String name, String value, String path, String ...
method addCookie (line 71) | default void addCookie(SaCookie cookie) {
method setStatus (line 80) | SaResponse setStatus(int sc);
method setHeader (line 88) | SaResponse setHeader(String name, String value);
method addHeader (line 96) | SaResponse addHeader(String name, String value);
method setServer (line 103) | default SaResponse setServer(String value) {
method redirect (line 112) | Object redirect(String url);
FILE: sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaStorage.java
type SaStorage (line 28) | public interface SaStorage extends SaSetValueInterface {
method getSource (line 34) | Object getSource();
method get (line 39) | @Override
method set (line 43) | @Override
method delete (line 47) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaTokenContextModelBox.java
class SaTokenContextModelBox (line 9) | public class SaTokenContextModelBox {
method SaTokenContextModelBox (line 17) | public SaTokenContextModelBox(SaRequest request, SaResponse response, ...
method getRequest (line 23) | public SaRequest getRequest() {
method setRequest (line 27) | public void setRequest(SaRequest request) {
method getResponse (line 31) | public SaResponse getResponse() {
method setResponse (line 35) | public void setResponse(SaResponse response) {
method getStorage (line 39) | public SaStorage getStorage() {
method setStorage (line 43) | public void setStorage(SaStorage storage) {
method toString (line 47) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/dao/SaTokenDao.java
type SaTokenDao (line 33) | public interface SaTokenDao {
method get (line 50) | String get(String key);
method set (line 59) | void set(String key, String value, long timeout);
method update (line 66) | void update(String key, String value);
method delete (line 72) | void delete(String key);
method getTimeout (line 79) | long getTimeout(String key);
method updateTimeout (line 86) | void updateTimeout(String key, long timeout);
method getObject (line 97) | Object getObject(String key);
method getObject (line 105) | <T> T getObject(String key, Class<T> classType);
method setObject (line 114) | void setObject(String key, Object object, long timeout);
method updateObject (line 121) | void updateObject(String key, Object object);
method deleteObject (line 127) | void deleteObject(String key);
method getObjectTimeout (line 134) | long getObjectTimeout(String key);
method updateObjectTimeout (line 141) | void updateObjectTimeout(String key, long timeout);
method getSession (line 151) | SaSession getSession(String sessionId);
method setSession (line 158) | void setSession(SaSession session, long timeout);
method updateSession (line 164) | void updateSession(SaSession session);
method deleteSession (line 170) | void deleteSession(String sessionId);
method getSessionTimeout (line 177) | long getSessionTimeout(String sessionId);
method updateSessionTimeout (line 184) | void updateSessionTimeout(String sessionId, long timeout);
method searchData (line 199) | List<String> searchData(String prefix, String keyword, int start, int ...
method init (line 207) | default void init() {
method destroy (line 213) | default void destroy() {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/dao/SaTokenDaoDefaultImpl.java
class SaTokenDaoDefaultImpl (line 32) | public class SaTokenDaoDefaultImpl implements SaTokenDaoByStringFollowOb...
method getObject (line 41) | @Override
method getObject (line 46) | @Override
method setObject (line 52) | @Override
method updateObject (line 57) | @Override
method deleteObject (line 62) | @Override
method getObjectTimeout (line 67) | @Override
method updateObjectTimeout (line 72) | @Override
method searchData (line 80) | @Override
method init (line 91) | @Override
method destroy (line 99) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/dao/auto/SaTokenDaoByObjectFollowString.java
type SaTokenDaoByObjectFollowString (line 26) | public interface SaTokenDaoByObjectFollowString extends SaTokenDaoBySess...
method getObject (line 36) | @Override
method getObject (line 48) | default <T> T getObject(String key, Class<T> classType) {
method setObject (line 60) | @Override
method updateObject (line 71) | @Override
method deleteObject (line 81) | @Override
method getObjectTimeout (line 91) | @Override
method updateObjectTimeout (line 101) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/dao/auto/SaTokenDaoBySessionFollowObject.java
type SaTokenDaoBySessionFollowObject (line 28) | public interface SaTokenDaoBySessionFollowObject extends SaTokenDao {
method getSession (line 37) | default SaSession getSession(String sessionId) {
method setSession (line 46) | default void setSession(SaSession session, long timeout) {
method updateSession (line 54) | default void updateSession(SaSession session) {
method deleteSession (line 62) | default void deleteSession(String sessionId) {
method getSessionTimeout (line 71) | default long getSessionTimeout(String sessionId) {
method updateSessionTimeout (line 80) | default void updateSessionTimeout(String sessionId, long timeout) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/dao/auto/SaTokenDaoByStringFollowObject.java
type SaTokenDaoByStringFollowObject (line 24) | public interface SaTokenDaoByStringFollowObject extends SaTokenDaoBySess...
method get (line 28) | @Override
method set (line 33) | @Override
method update (line 38) | @Override
method delete (line 43) | @Override
method getTimeout (line 48) | @Override
method updateTimeout (line 53) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/dao/timedcache/SaMapPackage.java
type SaMapPackage (line 26) | public interface SaMapPackage<V> {
method getSource (line 33) | Object getSource();
method get (line 42) | V get(String key);
method put (line 50) | void put(String key, V value);
method remove (line 56) | void remove(String key);
method keySet (line 61) | Set<String> keySet();
FILE: sa-token-core/src/main/java/cn/dev33/satoken/dao/timedcache/SaMapPackageForConcurrentHashMap.java
class SaMapPackageForConcurrentHashMap (line 27) | public class SaMapPackageForConcurrentHashMap<V> implements SaMapPackage...
method getSource (line 31) | @Override
method get (line 36) | @Override
method put (line 41) | @Override
method remove (line 46) | @Override
method keySet (line 51) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/dao/timedcache/SaTimedCache.java
class SaTimedCache (line 30) | public class SaTimedCache {
method SaTimedCache (line 42) | public SaTimedCache(SaMapPackage<Object> dataMap, SaMapPackage<Long> e...
method getObject (line 50) | public Object getObject(String key) {
method setObject (line 55) | public void setObject(String key, Object object, long timeout) {
method updateObject (line 63) | public void updateObject(String key, Object object) {
method deleteObject (line 70) | public void deleteObject(String key) {
method getObjectTimeout (line 75) | public long getObjectTimeout(String key) {
method updateObjectTimeout (line 79) | public void updateObjectTimeout(String key, long timeout) {
method keySet (line 83) | public Set<String> keySet() {
method clearKeyByTimeout (line 94) | void clearKeyByTimeout(String key) {
method getKeyTimeout (line 111) | long getKeyTimeout(String key) {
method refreshDataMap (line 157) | public void refreshDataMap() {
method initRefreshThread (line 166) | public void initRefreshThread() {
method endRefreshThread (line 205) | public void endRefreshThread() {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/error/SaErrorCode.java
type SaErrorCode (line 24) | public interface SaErrorCode {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/exception/ApiDisabledException.java
class ApiDisabledException (line 26) | public class ApiDisabledException extends SaTokenException {
method ApiDisabledException (line 39) | public ApiDisabledException() {
method ApiDisabledException (line 47) | public ApiDisabledException(String message) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/exception/BackResultException.java
class BackResultException (line 24) | public class BackResultException extends SaTokenException {
method BackResultException (line 40) | public BackResultException(Object result) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/exception/DisableServiceException.java
class DisableServiceException (line 24) | public class DisableServiceException extends SaTokenException {
method getLoginType (line 73) | public String getLoginType() {
method getLoginId (line 82) | public Object getLoginId() {
method getService (line 91) | public Object getService() {
method getLevel (line 100) | public int getLevel() {
method getLimitLevel (line 109) | public int getLimitLevel() {
method getDisableTime (line 117) | public long getDisableTime() {
method DisableServiceException (line 131) | public DisableServiceException(String loginType, Object loginId, Strin...
FILE: sa-token-core/src/main/java/cn/dev33/satoken/exception/FirewallCheckException.java
class FirewallCheckException (line 24) | public class FirewallCheckException extends SaTokenException {
method FirewallCheckException (line 31) | public FirewallCheckException(String message) {
method FirewallCheckException (line 35) | public FirewallCheckException(Throwable e) {
method FirewallCheckException (line 39) | public FirewallCheckException(String message, Throwable e) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/exception/InvalidContextException.java
class InvalidContextException (line 25) | @Deprecated
method InvalidContextException (line 37) | public InvalidContextException(String message) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/exception/NotHttpBasicAuthException.java
class NotHttpBasicAuthException (line 24) | public class NotHttpBasicAuthException extends SaTokenException {
method NotHttpBasicAuthException (line 37) | public NotHttpBasicAuthException() {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/exception/NotHttpDigestAuthException.java
class NotHttpDigestAuthException (line 24) | public class NotHttpDigestAuthException extends SaTokenException {
method NotHttpDigestAuthException (line 37) | public NotHttpDigestAuthException() {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/exception/NotImplException.java
class NotImplException (line 24) | public class NotImplException extends SaTokenException {
method NotImplException (line 35) | public NotImplException(String message) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/exception/NotLoginException.java
class NotLoginException (line 29) | public class NotLoginException extends SaTokenException {
method getType (line 92) | public String getType() {
method getLoginType (line 106) | public String getLoginType() {
method NotLoginException (line 116) | public NotLoginException(String message, String loginType, String type) {
method newInstance (line 130) | public static NotLoginException newInstance(String loginType, String t...
FILE: sa-token-core/src/main/java/cn/dev33/satoken/exception/NotPermissionException.java
class NotPermissionException (line 26) | public class NotPermissionException extends SaTokenException {
method getPermission (line 39) | public String getPermission() {
method getLoginType (line 53) | public String getLoginType() {
method NotPermissionException (line 57) | public NotPermissionException(String permission) {
method NotPermissionException (line 61) | public NotPermissionException(String permission, String loginType) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/exception/NotRoleException.java
class NotRoleException (line 26) | public class NotRoleException extends SaTokenException {
method getRole (line 39) | public String getRole() {
method getLoginType (line 53) | public String getLoginType() {
method NotRoleException (line 57) | public NotRoleException(String role) {
method NotRoleException (line 61) | public NotRoleException(String role, String loginType) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/exception/NotSafeException.java
class NotSafeException (line 24) | public class NotSafeException extends SaTokenException {
method getLoginType (line 54) | public String getLoginType() {
method getTokenValue (line 63) | public Object getTokenValue() {
method getService (line 72) | public Object getService() {
method NotSafeException (line 83) | public NotSafeException(String loginType, String tokenValue, String se...
FILE: sa-token-core/src/main/java/cn/dev33/satoken/exception/NotWebContextException.java
class NotWebContextException (line 24) | public class NotWebContextException extends SaTokenException {
method NotWebContextException (line 35) | public NotWebContextException(String message) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/exception/RequestPathInvalidException.java
class RequestPathInvalidException (line 24) | public class RequestPathInvalidException extends FirewallCheckException {
method getPath (line 37) | public String getPath() {
method RequestPathInvalidException (line 41) | public RequestPathInvalidException(String message, String path) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/exception/SaJsonConvertException.java
class SaJsonConvertException (line 24) | public class SaJsonConvertException extends SaTokenException {
method SaJsonConvertException (line 35) | public SaJsonConvertException(Throwable cause) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/exception/SaTokenContextException.java
class SaTokenContextException (line 26) | public class SaTokenContextException extends InvalidContextException imp...
method SaTokenContextException (line 37) | public SaTokenContextException(String message) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/exception/SaTokenException.java
class SaTokenException (line 29) | public class SaTokenException extends RuntimeException {
method SaTokenException (line 46) | public SaTokenException(int code) {
method SaTokenException (line 57) | public SaTokenException(String message) {
method SaTokenException (line 67) | public SaTokenException(int code, String message) {
method SaTokenException (line 77) | public SaTokenException(Throwable cause) {
method SaTokenException (line 87) | public SaTokenException(String message, Throwable cause) {
method getCode (line 95) | public int getCode() {
method setCode (line 104) | public SaTokenException setCode(int code) {
method notTrue (line 114) | public static void notTrue(boolean flag, String message) {
method notTrue (line 124) | public static void notTrue(boolean flag, String message, int code) {
method notEmpty (line 135) | public static void notEmpty(Object value, String message) {
method notEmpty (line 145) | public static void notEmpty(Object value, String message, int code) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/exception/SaTokenPluginException.java
class SaTokenPluginException (line 24) | public class SaTokenPluginException extends SaTokenException {
method SaTokenPluginException (line 35) | public SaTokenPluginException(String message) {
method SaTokenPluginException (line 44) | public SaTokenPluginException(Throwable cause) {
method SaTokenPluginException (line 54) | public SaTokenPluginException(String message, Throwable cause) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/exception/SameTokenInvalidException.java
class SameTokenInvalidException (line 24) | public class SameTokenInvalidException extends SaTokenException {
method SameTokenInvalidException (line 35) | public SameTokenInvalidException(String message) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/exception/StopMatchException.java
class StopMatchException (line 24) | public class StopMatchException extends SaTokenException {
method StopMatchException (line 34) | public StopMatchException() {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/exception/TotpAuthException.java
class TotpAuthException (line 24) | public class TotpAuthException extends SaTokenException {
method TotpAuthException (line 37) | public TotpAuthException() {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/filter/SaFilter.java
type SaFilter (line 28) | public interface SaFilter {
method addInclude (line 37) | SaFilter addInclude(String... paths);
method addExclude (line 44) | SaFilter addExclude(String... paths);
method setIncludeList (line 51) | SaFilter setIncludeList(List<String> pathList);
method setExcludeList (line 58) | SaFilter setExcludeList(List<String> pathList);
method setAuth (line 68) | SaFilter setAuth(SaFilterAuthStrategy auth);
method setError (line 75) | SaFilter setError(SaFilterErrorStrategy error);
method setBeforeAuth (line 83) | SaFilter setBeforeAuth(SaFilterAuthStrategy beforeAuth);
FILE: sa-token-core/src/main/java/cn/dev33/satoken/filter/SaFilterAuthStrategy.java
type SaFilterAuthStrategy (line 24) | @FunctionalInterface
method run (line 31) | void run(Object obj);
FILE: sa-token-core/src/main/java/cn/dev33/satoken/filter/SaFilterErrorStrategy.java
type SaFilterErrorStrategy (line 26) | @FunctionalInterface
method run (line 34) | Object run(Throwable e);
FILE: sa-token-core/src/main/java/cn/dev33/satoken/fun/IsRunFunction.java
class IsRunFunction (line 24) | public class IsRunFunction {
method IsRunFunction (line 36) | public IsRunFunction(boolean isRun) {
method exe (line 45) | public IsRunFunction exe(SaFunction function) {
method noExe (line 57) | public IsRunFunction noExe(SaFunction function) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/fun/SaFunction.java
type SaFunction (line 24) | @FunctionalInterface
method run (line 30) | void run();
FILE: sa-token-core/src/main/java/cn/dev33/satoken/fun/SaParamFunction.java
type SaParamFunction (line 24) | @FunctionalInterface
method run (line 31) | void run(T r);
FILE: sa-token-core/src/main/java/cn/dev33/satoken/fun/SaParamRetFunction.java
type SaParamRetFunction (line 24) | @FunctionalInterface
method run (line 32) | R run(T param);
FILE: sa-token-core/src/main/java/cn/dev33/satoken/fun/SaRetFunction.java
type SaRetFunction (line 24) | @FunctionalInterface
method run (line 31) | Object run();
FILE: sa-token-core/src/main/java/cn/dev33/satoken/fun/SaRetGenericFunction.java
type SaRetGenericFunction (line 24) | @FunctionalInterface
method run (line 31) | T run();
FILE: sa-token-core/src/main/java/cn/dev33/satoken/fun/SaRouteFunction.java
type SaRouteFunction (line 27) | @FunctionalInterface
method run (line 37) | void run(SaRequest request, SaResponse response, Object handler);
FILE: sa-token-core/src/main/java/cn/dev33/satoken/fun/SaTwoParamFunction.java
type SaTwoParamFunction (line 24) | @FunctionalInterface
method run (line 32) | void run(T r, T2 r2);
FILE: sa-token-core/src/main/java/cn/dev33/satoken/fun/hooks/SaTokenPluginHookFunction.java
type SaTokenPluginHookFunction (line 26) | @FunctionalInterface
method execute (line 33) | void execute(SaTokenPlugin plugin);
FILE: sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaAutoRenewFunction.java
type SaAutoRenewFunction (line 31) | @FunctionalInterface
FILE: sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaCheckELRootMapExtendFunction.java
type SaCheckELRootMapExtendFunction (line 29) | @FunctionalInterface
FILE: sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaCheckElementAnnotationFunction.java
type SaCheckElementAnnotationFunction (line 30) | @FunctionalInterface
FILE: sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaCheckMethodAnnotationFunction.java
type SaCheckMethodAnnotationFunction (line 30) | @FunctionalInterface
FILE: sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaCheckOrAnnotationFunction.java
type SaCheckOrAnnotationFunction (line 31) | @FunctionalInterface
FILE: sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaCorsHandleFunction.java
type SaCorsHandleFunction (line 28) | @FunctionalInterface
method execute (line 38) | void execute(
FILE: sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaCreateSessionFunction.java
type SaCreateSessionFunction (line 31) | @FunctionalInterface
FILE: sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaCreateStpLogicFunction.java
type SaCreateStpLogicFunction (line 31) | @FunctionalInterface
FILE: sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaCreateTokenFunction.java
type SaCreateTokenFunction (line 29) | @FunctionalInterface
FILE: sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaFirewallCheckFailHandleFunction.java
type SaFirewallCheckFailHandleFunction (line 28) | @FunctionalInterface
method run (line 38) | void run(FirewallCheckException e, SaRequest req, SaResponse res, Obje...
FILE: sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaFirewallCheckFunction.java
type SaFirewallCheckFunction (line 27) | @FunctionalInterface
method execute (line 37) | void execute(SaRequest req, SaResponse res, Object extArg);
FILE: sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaGenerateUniqueTokenFunction.java
type SaGenerateUniqueTokenFunction (line 30) | @FunctionalInterface
method execute (line 42) | String execute(
FILE: sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaGetAnnotationFunction.java
type SaGetAnnotationFunction (line 31) | @FunctionalInterface
FILE: sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaHasElementFunction.java
type SaHasElementFunction (line 30) | @FunctionalInterface
FILE: sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaIsAnnotationPresentFunction.java
type SaIsAnnotationPresentFunction (line 31) | @FunctionalInterface
FILE: sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaRouteMatchFunction.java
type SaRouteMatchFunction (line 29) | @FunctionalInterface
FILE: sa-token-core/src/main/java/cn/dev33/satoken/http/SaHttpTemplate.java
type SaHttpTemplate (line 26) | public interface SaHttpTemplate {
method get (line 34) | String get(String url);
method postByFormData (line 43) | String postByFormData(String url, Map<String, Object> params);
FILE: sa-token-core/src/main/java/cn/dev33/satoken/http/SaHttpTemplateDefaultImpl.java
class SaHttpTemplateDefaultImpl (line 29) | public class SaHttpTemplateDefaultImpl implements SaHttpTemplate {
method get (line 39) | @Override
method postByFormData (line 47) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/http/SaHttpUtil.java
class SaHttpUtil (line 28) | public class SaHttpUtil {
method get (line 36) | public static String get(String url) {
method postByFormData (line 47) | public static String postByFormData(String url, Map<String, Object> pa...
FILE: sa-token-core/src/main/java/cn/dev33/satoken/httpauth/basic/SaHttpBasicAccount.java
class SaHttpBasicAccount (line 27) | public class SaHttpBasicAccount {
method SaHttpBasicAccount (line 44) | public SaHttpBasicAccount(String username, String password) {
method SaHttpBasicAccount (line 53) | public SaHttpBasicAccount(String usernameAndPassword) {
method getUsername (line 70) | public String getUsername() {
method setUsername (line 79) | public void setUsername(String username) {
method getPassword (line 88) | public String getPassword() {
method setPassword (line 97) | public void setPassword(String password) {
method toString (line 101) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/httpauth/basic/SaHttpBasicTemplate.java
class SaHttpBasicTemplate (line 31) | public class SaHttpBasicTemplate {
method throwNotBasicAuthException (line 42) | public void throwNotBasicAuthException(String realm) {
method getAuthorizationValue (line 51) | public String getAuthorizationValue() {
method getHttpBasicAccount (line 69) | public SaHttpBasicAccount getHttpBasicAccount() {
method check (line 80) | public void check() {
method check (line 88) | public void check(String account) {
method check (line 97) | public void check(String realm, String account) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/httpauth/basic/SaHttpBasicUtil.java
class SaHttpBasicUtil (line 24) | public class SaHttpBasicUtil {
method SaHttpBasicUtil (line 26) | private SaHttpBasicUtil() {
method getAuthorizationValue (line 38) | public static String getAuthorizationValue() {
method getHttpBasicAccount (line 46) | public static SaHttpBasicAccount getHttpBasicAccount() {
method check (line 53) | public static void check() {
method check (line 61) | public static void check(String account) {
method check (line 70) | public static void check(String realm, String account) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/httpauth/digest/SaHttpDigestModel.java
class SaHttpDigestModel (line 24) | public class SaHttpDigestModel {
method SaHttpDigestModel (line 94) | public SaHttpDigestModel() {
method SaHttpDigestModel (line 96) | public SaHttpDigestModel(String username, String password) {
method SaHttpDigestModel (line 100) | public SaHttpDigestModel(String username, String password, String real...
method getUsername (line 114) | public String getUsername() {
method setUsername (line 124) | public SaHttpDigestModel setUsername(String username) {
method getRealm (line 134) | public String getRealm() {
method setRealm (line 144) | public SaHttpDigestModel setRealm(String realm) {
method getPassword (line 154) | public String getPassword() {
method setPassword (line 164) | public SaHttpDigestModel setPassword(String password) {
method getNonce (line 174) | public String getNonce() {
method setNonce (line 184) | public SaHttpDigestModel setNonce(String nonce) {
method getUri (line 194) | public String getUri() {
method setUri (line 204) | public SaHttpDigestModel setUri(String uri) {
method getMethod (line 214) | public String getMethod() {
method setMethod (line 224) | public SaHttpDigestModel setMethod(String method) {
method getQop (line 234) | public String getQop() {
method setQop (line 244) | public SaHttpDigestModel setQop(String qop) {
method getNc (line 254) | public String getNc() {
method setNc (line 264) | public SaHttpDigestModel setNc(String nc) {
method getCnonce (line 274) | public String getCnonce() {
method setCnonce (line 284) | public SaHttpDigestModel setCnonce(String cnonce) {
method getOpaque (line 294) | public String getOpaque() {
method setOpaque (line 304) | public SaHttpDigestModel setOpaque(String opaque) {
method getResponse (line 314) | public String getResponse() {
method setResponse (line 324) | public SaHttpDigestModel setResponse(String response) {
method toString (line 329) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/httpauth/digest/SaHttpDigestTemplate.java
class SaHttpDigestTemplate (line 36) | public class SaHttpDigestTemplate {
method buildResponseHeaderValue (line 53) | public String buildResponseHeaderValue(SaHttpDigestModel model) {
method throwNotHttpDigestAuthException (line 68) | public void throwNotHttpDigestAuthException(SaHttpDigestModel model) {
method getAuthorizationValue (line 89) | public String getAuthorizationValue() {
method getAuthorizationValueToModel (line 107) | public SaHttpDigestModel getAuthorizationValueToModel() {
method calcResponse (line 167) | public String calcResponse(SaHttpDigestModel model) {
method copyHopeToReq (line 188) | public void copyHopeToReq(SaHttpDigestModel hopeModel, SaHttpDigestMod...
method check (line 208) | public void check(SaHttpDigestModel hopeModel) {
method check (line 242) | public void check(String username, String password) {
method check (line 252) | public void check(String username, String password, String realm) {
method check (line 259) | public void check() {
method checkByAnnotation (line 280) | @Deprecated
FILE: sa-token-core/src/main/java/cn/dev33/satoken/httpauth/digest/SaHttpDigestUtil.java
class SaHttpDigestUtil (line 28) | public class SaHttpDigestUtil {
method SaHttpDigestUtil (line 30) | private SaHttpDigestUtil() {
method getAuthorizationValue (line 43) | public static String getAuthorizationValue() {
method getAuthorizationValueToModel (line 51) | public static SaHttpDigestModel getAuthorizationValueToModel() {
method check (line 61) | public static void check(SaHttpDigestModel hopeModel) {
method check (line 70) | public static void check(String username, String password) {
method check (line 80) | public static void check(String username, String password, String real...
method check (line 87) | public static void check() {
method checkByAnnotation (line 100) | @Deprecated
FILE: sa-token-core/src/main/java/cn/dev33/satoken/json/SaJsonTemplate.java
type SaJsonTemplate (line 26) | public interface SaJsonTemplate {
method objectToJson (line 34) | String objectToJson(Object obj);
method jsonToObject (line 44) | <T>T jsonToObject(String jsonStr, Class<T> type);
method jsonToObject (line 52) | default Object jsonToObject(String jsonStr) {
method jsonToMap (line 62) | default Map<String, Object> jsonToMap(String jsonStr) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/json/SaJsonTemplateDefaultImpl.java
class SaJsonTemplateDefaultImpl (line 31) | public class SaJsonTemplateDefaultImpl implements SaJsonTemplate {
method objectToJson (line 35) | @Override
method jsonToObject (line 40) | @Override
method jsonToObject (line 45) | @Override
method jsonToMap (line 50) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenEventCenter.java
class SaTokenEventCenter (line 36) | public class SaTokenEventCenter {
method getListenerList (line 51) | public static List<SaTokenListener> getListenerList() {
method setListenerList (line 59) | public static void setListenerList(List<SaTokenListener> listenerList) {
method registerListener (line 70) | public static void registerListener(SaTokenListener listener) {
method registerListenerList (line 81) | public static void registerListenerList(List<SaTokenListener> listener...
method removeListener (line 97) | public static void removeListener(SaTokenListener listener) {
method removeListener (line 105) | public static void removeListener(Class<? extends SaTokenListener> cls) {
method clearListener (line 117) | public static void clearListener() {
method hasListener (line 126) | public static boolean hasListener(SaTokenListener listener) {
method hasListener (line 135) | public static boolean hasListener(Class<? extends SaTokenListener> cls) {
method doLogin (line 154) | public static void doLogin(String loginType, Object loginId, String to...
method doLogout (line 166) | public static void doLogout(String loginType, Object loginId, String t...
method doKickout (line 178) | public static void doKickout(String loginType, Object loginId, String ...
method doReplaced (line 190) | public static void doReplaced(String loginType, Object loginId, String...
method doDisable (line 204) | public static void doDisable(String loginType, Object loginId, String ...
method doUntieDisable (line 216) | public static void doUntieDisable(String loginType, Object loginId, St...
method doOpenSafe (line 229) | public static void doOpenSafe(String loginType, String tokenValue, Str...
method doCloseSafe (line 241) | public static void doCloseSafe(String loginType, String tokenValue, St...
method doCreateSession (line 251) | public static void doCreateSession(String id) {
method doLogoutSession (line 261) | public static void doLogoutSession(String id) {
method doRenewTimeout (line 275) | public static void doRenewTimeout(String loginType, Object loginId, St...
method doRegisterComponent (line 286) | public static void doRegisterComponent(String compName, Object compObj) {
method doRegisterAnnotationHandler (line 296) | public static void doRegisterAnnotationHandler(SaAnnotationHandlerInte...
method doSetStpLogic (line 306) | public static void doSetStpLogic(StpLogic stpLogic) {
method doSetConfig (line 316) | public static void doSetConfig(SaTokenConfig config) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListener.java
type SaTokenListener (line 31) | public interface SaTokenListener {
method doLogin (line 40) | void doLogin(String loginType, Object loginId, String tokenValue, SaLo...
method doLogout (line 48) | void doLogout(String loginType, Object loginId, String tokenValue);
method doKickout (line 56) | void doKickout(String loginType, Object loginId, String tokenValue);
method doReplaced (line 64) | void doReplaced(String loginType, Object loginId, String tokenValue);
method doDisable (line 74) | void doDisable(String loginType, Object loginId, String service, int l...
method doUntieDisable (line 82) | void doUntieDisable(String loginType, Object loginId, String service);
method doOpenSafe (line 91) | void doOpenSafe(String loginType, String tokenValue, String service, l...
method doCloseSafe (line 99) | void doCloseSafe(String loginType, String tokenValue, String service);
method doCreateSession (line 105) | void doCreateSession(String id);
method doLogoutSession (line 111) | void doLogoutSession(String id);
method doRenewTimeout (line 121) | void doRenewTimeout(String loginType, Object loginId, String tokenValu...
method doRegisterComponent (line 128) | default void doRegisterComponent(String compName, Object compObj) {}
method doRegisterAnnotationHandler (line 134) | default void doRegisterAnnotationHandler(SaAnnotationHandlerInterface<...
method doSetStpLogic (line 140) | default void doSetStpLogic(StpLogic stpLogic) {}
method doSetConfig (line 146) | default void doSetConfig(SaTokenConfig config) {}
FILE: sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListenerForLog.java
class SaTokenListenerForLog (line 32) | public class SaTokenListenerForLog implements SaTokenListener {
method doLogin (line 37) | @Override
method doLogout (line 45) | @Override
method doKickout (line 53) | @Override
method doReplaced (line 61) | @Override
method doDisable (line 69) | @Override
method doUntieDisable (line 77) | @Override
method doOpenSafe (line 85) | @Override
method doCloseSafe (line 93) | @Override
method doCreateSession (line 101) | @Override
method doLogoutSession (line 109) | @Override
method doRenewTimeout (line 117) | @Override
method doRegisterComponent (line 127) | @Override
method doRegisterAnnotationHandler (line 137) | @Override
method doSetStpLogic (line 148) | @Override
method doSetConfig (line 159) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListenerForSimple.java
class SaTokenListenerForSimple (line 28) | public class SaTokenListenerForSimple implements SaTokenListener {
method doLogin (line 30) | @Override
method doLogout (line 35) | @Override
method doKickout (line 40) | @Override
method doReplaced (line 45) | @Override
method doDisable (line 50) | @Override
method doUntieDisable (line 55) | @Override
method doOpenSafe (line 60) | @Override
method doCloseSafe (line 65) | @Override
method doCreateSession (line 70) | @Override
method doLogoutSession (line 75) | @Override
method doRenewTimeout (line 80) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/log/SaLog.java
type SaLog (line 24) | public interface SaLog {
method trace (line 31) | void trace(String str, Object ...args);
method debug (line 38) | void debug(String str, Object ...args);
method info (line 45) | void info(String str, Object ...args);
method warn (line 52) | void warn(String str, Object ...args);
method error (line 59) | void error(String str, Object ...args);
method fatal (line 66) | void fatal(String str, Object ...args);
FILE: sa-token-core/src/main/java/cn/dev33/satoken/log/SaLogForConsole.java
class SaLogForConsole (line 28) | public class SaLogForConsole implements SaLog {
method trace (line 63) | @Override
method debug (line 68) | @Override
method info (line 73) | @Override
method warn (line 78) | @Override
method error (line 83) | @Override
method fatal (line 88) | @Override
method println (line 101) | public void println(int level, String color, String prefix, String str...
FILE: sa-token-core/src/main/java/cn/dev33/satoken/model/wrapperInfo/SaDisableWrapperInfo.java
class SaDisableWrapperInfo (line 26) | public class SaDisableWrapperInfo {
method SaDisableWrapperInfo (line 50) | public SaDisableWrapperInfo(boolean isDisable, long disableTime, int d...
method createDisabled (line 62) | public static SaDisableWrapperInfo createDisabled(long disableTime, in...
method createNotDisabled (line 70) | public static SaDisableWrapperInfo createNotDisabled() {
method createNotDisabled (line 79) | public static SaDisableWrapperInfo createNotDisabled(long cacheTime) {
method toString (line 83) | @Override
method getIsDisable (line 94) | public boolean getIsDisable() {
method setIsDisable (line 98) | public SaDisableWrapperInfo setIsDisable(boolean isDisable) {
method getDisableTime (line 103) | public long getDisableTime() {
method setDisableTime (line 107) | public SaDisableWrapperInfo setDisableTime(long disableTime) {
method getDisableLevel (line 112) | public int getDisableLevel() {
method setDisableLevel (line 116) | public SaDisableWrapperInfo setDisableLevel(int disableLevel) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/plugin/SaTokenPlugin.java
type SaTokenPlugin (line 24) | public interface SaTokenPlugin {
method install (line 29) | void install();
method destroy (line 34) | default void destroy(){
FILE: sa-token-core/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginHolder.java
class SaTokenPluginHolder (line 37) | public class SaTokenPluginHolder {
method init (line 60) | public synchronized void init() {
method loaderPlugins (line 74) | public synchronized void loaderPlugins() {
method _loaderPluginsBySpi (line 90) | protected <T> List<T> _loaderPluginsBySpi(Class<T> serviceInterface, S...
method getPluginListCopy (line 133) | public synchronized List<SaTokenPlugin> getPluginListCopy() {
method isInstalledPlugin (line 143) | public synchronized<T extends SaTokenPlugin> boolean isInstalledPlugin...
method getPlugin (line 158) | public synchronized<T extends SaTokenPlugin> T getPlugin(Class<T> plug...
method _consumeHooks (line 173) | protected synchronized <T extends SaTokenPlugin> int _consumeHooks(Lis...
method installPlugin (line 194) | public synchronized SaTokenPluginHolder installPlugin(SaTokenPlugin pl...
method installPlugin (line 229) | public synchronized<T extends SaTokenPlugin> SaTokenPluginHolder insta...
method destroyPlugin (line 242) | public synchronized SaTokenPluginHolder destroyPlugin(SaTokenPlugin pl...
method destroyPlugin (line 274) | public synchronized<T extends SaTokenPlugin> SaTokenPluginHolder destr...
method onInstall (line 302) | public synchronized<T extends SaTokenPlugin> SaTokenPluginHolder onIns...
method onBeforeInstall (line 321) | public synchronized<T extends SaTokenPlugin> SaTokenPluginHolder onBef...
method onAfterInstall (line 340) | public synchronized<T extends SaTokenPlugin> SaTokenPluginHolder onAft...
method onDestroy (line 378) | public synchronized<T extends SaTokenPlugin> SaTokenPluginHolder onDes...
method onBeforeDestroy (line 391) | public synchronized<T extends SaTokenPlugin> SaTokenPluginHolder onBef...
method onAfterDestroy (line 404) | public synchronized<T extends SaTokenPlugin> SaTokenPluginHolder onAft...
FILE: sa-token-core/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginHookModel.java
class SaTokenPluginHookModel (line 26) | public class SaTokenPluginHookModel<T extends SaTokenPlugin> {
method SaTokenPluginHookModel (line 43) | public SaTokenPluginHookModel(Class<T> listenerClass, SaTokenPluginHoo...
FILE: sa-token-core/src/main/java/cn/dev33/satoken/router/SaHttpMethod.java
type SaHttpMethod (line 32) | public enum SaHttpMethod {
method toEnum (line 54) | public static SaHttpMethod toEnum(String method) {
method toEnumArray (line 70) | public static SaHttpMethod[] toEnumArray(String... methods) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/router/SaRouter.java
class SaRouter (line 44) | public class SaRouter {
method SaRouter (line 46) | private SaRouter() {
method isMatch (line 57) | public static boolean isMatch(String pattern, String path) {
method isMatch (line 67) | public static boolean isMatch(List<String> patterns, String path) {
method isMatch (line 85) | public static boolean isMatch(String[] patterns, String path) {
method isMatch (line 103) | public static boolean isMatch(SaHttpMethod[] methods, String methodStr...
method isMatchCurrURI (line 122) | public static boolean isMatchCurrURI(String pattern) {
method isMatchCurrURI (line 131) | public static boolean isMatchCurrURI(List<String> patterns) {
method isMatchCurrURI (line 140) | public static boolean isMatchCurrURI(String[] patterns) {
method isMatchCurrMethod (line 149) | public static boolean isMatchCurrMethod(SaHttpMethod[] methods) {
method newMatch (line 160) | public static SaRouterStaff newMatch() {
method match (line 171) | public static SaRouterStaff match(String... patterns) {
method notMatch (line 180) | public static SaRouterStaff notMatch(String... patterns) {
method match (line 189) | public static SaRouterStaff match(List<String> patterns) {
method notMatch (line 198) | public static SaRouterStaff notMatch(List<String> patterns) {
method match (line 209) | public static SaRouterStaff match(SaHttpMethod... methods) {
method notMatch (line 218) | public static SaRouterStaff notMatch(SaHttpMethod... methods) {
method matchMethod (line 227) | public static SaRouterStaff matchMethod(String... methods) {
method notMatchMethod (line 236) | public static SaRouterStaff notMatchMethod(String... methods) {
method match (line 247) | public static SaRouterStaff match(boolean flag) {
method notMatch (line 256) | public static SaRouterStaff notMatch(boolean flag) {
method match (line 265) | public static SaRouterStaff match(SaParamRetFunction<Object, Boolean> ...
method notMatch (line 274) | public static SaRouterStaff notMatch(SaParamRetFunction<Object, Boolea...
method match (line 287) | public static SaRouterStaff match(String pattern, SaFunction fun) {
method match (line 297) | public static SaRouterStaff match(String pattern, SaParamFunction<SaRo...
method match (line 308) | public static SaRouterStaff match(String pattern, String excludePatter...
method match (line 319) | public static SaRouterStaff match(String pattern, String excludePatter...
method stop (line 330) | public static SaRouterStaff stop() {
method back (line 338) | public static SaRouterStaff back() {
method back (line 347) | public static SaRouterStaff back(Object result) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/router/SaRouterStaff.java
class SaRouterStaff (line 32) | public class SaRouterStaff {
method isHit (line 42) | public boolean isHit() {
method setHit (line 50) | public SaRouterStaff setHit(boolean isHit) {
method reset (line 59) | public SaRouterStaff reset() {
method match (line 72) | public SaRouterStaff match(String... patterns) {
method notMatch (line 84) | public SaRouterStaff notMatch(String... patterns) {
method match (line 96) | public SaRouterStaff match(List<String> patterns) {
method notMatch (line 108) | public SaRouterStaff notMatch(List<String> patterns) {
method match (line 122) | public SaRouterStaff match(SaHttpMethod... methods) {
method notMatch (line 134) | public SaRouterStaff notMatch(SaHttpMethod... methods) {
method matchMethod (line 146) | public SaRouterStaff matchMethod(String... methods) {
method notMatchMethod (line 159) | public SaRouterStaff notMatchMethod(String... methods) {
method match (line 175) | public SaRouterStaff match(boolean flag) {
method notMatch (line 187) | public SaRouterStaff notMatch(boolean flag) {
method match (line 199) | public SaRouterStaff match(SaParamRetFunction<Object, Boolean> fun) {
method notMatch (line 211) | public SaRouterStaff notMatch(SaParamRetFunction<Object, Boolean> fun) {
method check (line 226) | public SaRouterStaff check(SaFunction fun) {
method check (line 238) | public SaRouterStaff check(SaParamFunction<SaRouterStaff> fun) {
method free (line 250) | public SaRouterStaff free(SaParamFunction<SaRouterStaff> fun) {
method match (line 270) | public SaRouterStaff match(String pattern, SaFunction fun) {
method match (line 280) | public SaRouterStaff match(String pattern, SaParamFunction<SaRouterSta...
method match (line 291) | public SaRouterStaff match(String pattern, String excludePattern, SaFu...
method match (line 302) | public SaRouterStaff match(String pattern, String excludePattern, SaPa...
method stop (line 313) | public SaRouterStaff stop() {
method back (line 324) | public SaRouterStaff back() {
method back (line 336) | public SaRouterStaff back(Object result) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/same/SaSameTemplate.java
class SaSameTemplate (line 32) | public class SaSameTemplate {
method getToken (line 45) | public String getToken() {
method isValid (line 59) | public boolean isValid(String token) {
method checkToken (line 73) | public void checkToken(String token) {
method checkCurrentRequestToken (line 83) | public void checkCurrentRequestToken() {
method refreshToken (line 91) | public String refreshToken() {
method saveToken (line 114) | public void saveToken(String token) {
method savePastToken (line 126) | public void savePastToken(String token, long timeout){
method getTokenNh (line 140) | public String getTokenNh() {
method getPastTokenNh (line 148) | public String getPastTokenNh() {
method getTokenTimeout (line 156) | public long getTokenTimeout() {
method createToken (line 167) | public String createToken() {
method splicingTokenSaveKey (line 178) | public String splicingTokenSaveKey() {
method splicingPastTokenSaveKey (line 186) | public String splicingPastTokenSaveKey() {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/same/SaSameUtil.java
class SaSameUtil (line 28) | public class SaSameUtil {
method SaSameUtil (line 30) | private SaSameUtil(){}
method getToken (line 43) | public static String getToken() {
method isValid (line 52) | public static boolean isValid(String token) {
method checkToken (line 60) | public static void checkToken(String token) {
method checkCurrentRequestToken (line 67) | public static void checkCurrentRequestToken() {
method refreshToken (line 75) | public static String refreshToken() {
method getTokenNh (line 86) | public static String getTokenNh() {
method getPastTokenNh (line 94) | public static String getPastTokenNh() {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/secure/BCrypt.java
class BCrypt (line 49) | @Deprecated
method encode_base64 (line 158) | private static String encode_base64(byte[] d, int len) throws IllegalA...
method char64 (line 196) | private static byte char64(char x) {
method decodeBase64 (line 211) | private static byte[] decodeBase64(String s, int maxolen) throws Illeg...
method encipher (line 257) | private void encipher(int[] lr, int off) {
method streamToWord (line 287) | private static int streamToWord(byte[] data, int[] offp) {
method init_key (line 304) | private void init_key() {
method key (line 314) | private void key(byte[] key) {
method ekskey (line 342) | private void ekskey(byte[] data, byte[] key) {
method crypt (line 378) | public byte[] crypt(byte[] password, byte[] salt, int log_rounds, int[...
method hashpw (line 417) | public static String hashpw(String password) {
method hashpw (line 428) | public static String hashpw(String password, String salt) {
method gensalt (line 485) | public static String gensalt(int log_rounds, SecureRandom random) {
method gensalt (line 509) | public static String gensalt(int log_rounds) {
method gensalt (line 518) | public static String gensalt() {
method checkpw (line 529) | public static boolean checkpw(String plaintext, String hashed) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/secure/SaBase32Util.java
class SaBase32Util (line 26) | public class SaBase32Util {
method encodeBytesToString (line 46) | public static String encodeBytesToString(byte[] bytes) {
method decodeStringToBytes (line 76) | public static byte[] decodeStringToBytes(String text) {
method encode (line 112) | public static String encode(String text) {
method decode (line 120) | public static String decode(String base32Text) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/secure/SaBase64Util.java
class SaBase64Util (line 27) | public class SaBase64Util {
method encodeBytesToString (line 37) | public static String encodeBytesToString(byte[] bytes){
method decodeStringToBytes (line 46) | public static byte[] decodeStringToBytes(String text){
method encode (line 55) | public static String encode(String text){
method decode (line 64) | public static String decode(String base64Text){
FILE: sa-token-core/src/main/java/cn/dev33/satoken/secure/SaSecureUtil.java
class SaSecureUtil (line 42) | public class SaSecureUtil {
method SaSecureUtil (line 44) | private SaSecureUtil() {
method md5 (line 64) | public static String md5(String str) {
method sha1 (line 91) | public static String sha1(String str) {
method sha256 (line 107) | public static String sha256(String str) {
method sha384 (line 123) | public static String sha384(String str) {
method sha512 (line 139) | public static String sha512(String str) {
method getShaHexString (line 156) | private static String getShaHexString(String str, MessageDigest messag...
method md5BySalt (line 178) | @Deprecated
method sha256BySalt (line 189) | @Deprecated
method aesEncrypt (line 208) | public static String aesEncrypt(String key, String text) {
method aesDecrypt (line 226) | public static String aesDecrypt(String key, String text) {
method getSecretKey (line 242) | private static SecretKeySpec getSecretKey(final String password) throw...
method rsaGenerateKeyPair (line 266) | @Deprecated
method rsaEncryptByPublic (line 291) | @Deprecated
method rsaEncryptByPrivate (line 318) | @Deprecated
method rsaDecryptByPublic (line 344) | @Deprecated
method rsaDecryptByPrivate (line 372) | @Deprecated
method getPublicKeyFromString (line 397) | private static PublicKey getPublicKeyFromString(String key)
method getPrivateKeyFromString (line 412) | private static PrivateKey getPrivateKeyFromString(String key)
method splitBytes (line 430) | private static byte[][] splitBytes(byte[] bytes, int splitLength) {
method bytesToHexString (line 453) | private static String bytesToHexString(byte[] bytes) {
method hexStringToBytes (line 468) | private static byte[] hexStringToBytes(String hex) {
method toByte (line 482) | private static byte toByte(char c) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/secure/totp/SaTotpTemplate.java
class SaTotpTemplate (line 35) | public class SaTotpTemplate {
method SaTotpTemplate (line 60) | public SaTotpTemplate() {
method SaTotpTemplate (line 71) | public SaTotpTemplate(int timeStep, int codeDigits, String hmacAlgorit...
method generateSecretKey (line 84) | public String generateSecretKey() {
method _generateTOTP (line 97) | public String _generateTOTP(String secretKey) {
method validateTOTP (line 109) | public boolean validateTOTP(String secretKey, String code, int timeWin...
method checkTOTP (line 127) | public void checkTOTP(String secretKey, String code, int timeWindowOff...
method generateGoogleSecretKey (line 139) | public String generateGoogleSecretKey(String account) {
method generateGoogleSecretKey (line 150) | public String generateGoogleSecretKey(String account, String secretKey) {
method generateGoogleSecretKey (line 162) | public String generateGoogleSecretKey(String account, String issuer, S...
method _generateTOTP (line 166) | protected String _generateTOTP(String secretKey, long time) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/secure/totp/SaTotpUtil.java
class SaTotpUtil (line 26) | public class SaTotpUtil {
method generateSecretKey (line 33) | public static String generateSecretKey() {
method generateTOTP (line 43) | public static String generateTOTP(String secretKey) {
method validateTOTP (line 55) | public static boolean validateTOTP(String secretKey, String code, int ...
method checkTOTP (line 66) | public static void checkTOTP(String secretKey, String code, int timeWi...
method generateGoogleSecretKey (line 76) | public static String generateGoogleSecretKey(String account) {
method generateGoogleSecretKey (line 87) | public static String generateGoogleSecretKey(String account, String se...
method generateGoogleSecretKey (line 99) | public static String generateGoogleSecretKey(String account, String is...
FILE: sa-token-core/src/main/java/cn/dev33/satoken/serializer/SaSerializerTemplate.java
type SaSerializerTemplate (line 24) | public interface SaSerializerTemplate {
method objectToString (line 32) | String objectToString(Object obj);
method stringToObject (line 40) | Object stringToObject(String str);
method stringToObject (line 51) | @SuppressWarnings("unchecked")
method objectToBytes (line 63) | byte[] objectToBytes(Object obj);
method bytesToObject (line 71) | Object bytesToObject(byte[] bytes);
FILE: sa-token-core/src/main/java/cn/dev33/satoken/serializer/impl/SaSerializerTemplateForJdk.java
type SaSerializerTemplateForJdk (line 29) | public interface SaSerializerTemplateForJdk extends SaSerializerTemplate {
method objectToString (line 31) | @Override
method stringToObject (line 40) | @Override
method objectToBytes (line 49) | @Override
method bytesToObject (line 65) | @Override
method bytesToString (line 85) | String bytesToString(byte[] bytes);
method stringToBytes (line 92) | byte[] stringToBytes(String str);
FILE: sa-token-core/src/main/java/cn/dev33/satoken/serializer/impl/SaSerializerTemplateForJdkUseBase64.java
class SaSerializerTemplateForJdkUseBase64 (line 26) | public class SaSerializerTemplateForJdkUseBase64 implements SaSerializer...
method bytesToString (line 28) | @Override
method stringToBytes (line 33) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/serializer/impl/SaSerializerTemplateForJdkUseHex.java
class SaSerializerTemplateForJdkUseHex (line 26) | public class SaSerializerTemplateForJdkUseHex implements SaSerializerTem...
method bytesToString (line 28) | @Override
method stringToBytes (line 33) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/serializer/impl/SaSerializerTemplateForJdkUseISO_8859_1.java
class SaSerializerTemplateForJdkUseISO_8859_1 (line 26) | public class SaSerializerTemplateForJdkUseISO_8859_1 implements SaSerial...
method bytesToString (line 28) | @Override
method stringToBytes (line 33) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/serializer/impl/SaSerializerTemplateForJson.java
class SaSerializerTemplateForJson (line 28) | public class SaSerializerTemplateForJson implements SaSerializerTemplate {
method objectToString (line 30) | @Override
method stringToObject (line 35) | @Override
method stringToObject (line 40) | @Override
method objectToBytes (line 45) | @Override
method bytesToObject (line 50) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/session/SaSession.java
class SaSession (line 45) | public class SaSession implements SaSetValueInterface, Serializable {
method SaSession (line 113) | public SaSession() {
method SaSession (line 125) | public SaSession(String id) {
method getId (line 136) | public String getId() {
method setId (line 145) | public SaSession setId(String id) {
method getType (line 155) | public String getType() {
method setType (line 165) | public SaSession setType(String type) {
method getLoginType (line 174) | public String getLoginType() {
method setLoginType (line 183) | public SaSession setLoginType(String loginType) {
method getLoginId (line 192) | public Object getLoginId() {
method setLoginId (line 201) | public SaSession setLoginId(Object loginId) {
method getToken (line 210) | public String getToken() {
method setToken (line 219) | public SaSession setToken(String token) {
method getCreateTime (line 228) | public long getCreateTime() {
method setCreateTime (line 237) | public SaSession setCreateTime(long createTime) {
method setTerminalList (line 254) | public void setTerminalList(List<SaTerminalInfo> terminalList) {
method getTerminalList (line 263) | public List<SaTerminalInfo> getTerminalList() {
method terminalListCopy (line 272) | public List<SaTerminalInfo> terminalListCopy() {
method getTerminalListByDeviceType (line 282) | public List<SaTerminalInfo> getTerminalListByDeviceType(String deviceT...
method getTokenValueListByDeviceType (line 304) | public List<String> getTokenValueListByDeviceType(String deviceType) {
method getTerminal (line 318) | public SaTerminalInfo getTerminal(String tokenValue) {
method addTerminal (line 332) | public void addTerminal(SaTerminalInfo terminalInfo) {
method removeTerminal (line 350) | public void removeTerminal(String tokenValue) {
method getHistoryTerminalCount (line 362) | public int getHistoryTerminalCount() {
method setHistoryTerminalCount (line 371) | public void setHistoryTerminalCount(int historyTerminalCount) {
method forEachTerminalList (line 380) | public void forEachTerminalList(SaTwoParamFunction<SaSession, SaTermin...
method isTrustDeviceId (line 392) | public boolean isTrustDeviceId(String deviceId) {
method update (line 410) | public void update() {
method logout (line 415) | public void logout() {
method logoutByTerminalCountToZero (line 422) | public void logoutByTerminalCountToZero() {
method timeout (line 432) | public long timeout() {
method updateTimeout (line 440) | public void updateTimeout(long timeout) {
method updateMinTimeout (line 448) | public void updateMinTimeout(long minTimeout) {
method updateMaxTimeout (line 460) | public void updateMaxTimeout(long maxTimeout) {
method trans (line 473) | protected long trans(long value) {
method get (line 487) | @Override
method set (line 498) | @Override
method setByNull (line 511) | @Override
method delete (line 525) | @Override
method keys (line 540) | public Set<String> keys() {
method clear (line 547) | public void clear() {
method getDataMap (line 557) | public Map<String, Object> getDataMap() {
method setDataMap (line 567) | public SaSession setDataMap(Map<String, Object> dataMap) {
method refreshDataMap (line 576) | public SaSession refreshDataMap(Map<String, Object> dataMap) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/session/SaSessionCustomUtil.java
class SaSessionCustomUtil (line 40) | public class SaSessionCustomUtil {
method SaSessionCustomUtil (line 42) | private SaSessionCustomUtil() {
method splicingSessionKey (line 56) | public static String splicingSessionKey(String sessionId) {
method isExists (line 66) | public static boolean isExists(String sessionId) {
method getSessionById (line 77) | public static SaSession getSessionById(String sessionId, boolean isCre...
method getSessionById (line 93) | public static SaSession getSessionById(String sessionId) {
method deleteSessionById (line 102) | public static void deleteSessionById(String sessionId) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/session/SaTerminalInfo.java
class SaTerminalInfo (line 28) | public class SaTerminalInfo implements Serializable {
method SaTerminalInfo (line 68) | public SaTerminalInfo() {
method SaTerminalInfo (line 79) | public SaTerminalInfo(int index, String tokenValue, String deviceType,...
method setExtra (line 95) | public SaTerminalInfo setExtra(String key, Object value) {
method getExtra (line 108) | public Object getExtra(String key) {
method haveExtraData (line 119) | public boolean haveExtraData() {
method getIndex (line 132) | public int getIndex() {
method setIndex (line 142) | public SaTerminalInfo setIndex(int index) {
method getTokenValue (line 150) | public String getTokenValue() {
method setTokenValue (line 160) | public SaTerminalInfo setTokenValue(String tokenValue) {
method getDeviceType (line 168) | public String getDeviceType() {
method setDeviceType (line 178) | public SaTerminalInfo setDeviceType(String deviceType) {
method getDeviceId (line 188) | public String getDeviceId() {
method setDeviceId (line 198) | public SaTerminalInfo setDeviceId(String deviceId) {
method getExtraData (line 208) | public Map<String, Object> getExtraData() {
method setExtraData (line 218) | public SaTerminalInfo setExtraData(Map<String, Object> extraData) {
method getCreateTime (line 228) | public long getCreateTime() {
method setCreateTime (line 238) | public SaTerminalInfo setCreateTime(long createTime) {
method toString (line 244) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/session/raw/SaRawSessionDelegator.java
class SaRawSessionDelegator (line 26) | public class SaRawSessionDelegator {
method SaRawSessionDelegator (line 33) | public SaRawSessionDelegator(String type) {
method isExists (line 43) | public boolean isExists(Object valueId) {
method getSessionById (line 54) | public SaSession getSessionById(Object valueId, boolean isCreate) {
method getSessionById (line 64) | public SaSession getSessionById(Object valueId) {
method deleteSessionById (line 73) | public void deleteSessionById(Object valueId) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/session/raw/SaRawSessionUtil.java
class SaRawSessionUtil (line 28) | public class SaRawSessionUtil {
method SaRawSessionUtil (line 30) | private SaRawSessionUtil() {
method splicingSessionKey (line 40) | public static String splicingSessionKey(String type, Object valueId) {
method isExists (line 51) | public static boolean isExists(String type, Object valueId) {
method getSessionById (line 63) | public static SaSession getSessionById(String type, Object valueId, bo...
method getSessionById (line 81) | public static SaSession getSessionById(String type, Object valueId) {
method deleteSessionById (line 91) | public static void deleteSessionById(String type, Object valueId) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginConfig.java
class SaLoginConfig (line 39) | @Deprecated
method SaLoginConfig (line 42) | private SaLoginConfig() {
method setDevice (line 49) | public static SaLoginParameter setDevice(String device) {
method setIsLastingCookie (line 57) | public static SaLoginParameter setIsLastingCookie(Boolean isLastingCoo...
method setTimeout (line 65) | public static SaLoginParameter setTimeout(long timeout) {
method setActiveTimeout (line 73) | public static SaLoginParameter setActiveTimeout(long activeTimeout) {
method setExtraData (line 81) | public static SaLoginParameter setExtraData(Map<String, Object> extraD...
method setToken (line 89) | public static SaLoginParameter setToken(String token) {
method setExtra (line 99) | public static SaLoginParameter setExtra(String key, Object value) {
method setIsWriteHeader (line 107) | public static SaLoginParameter setIsWriteHeader(Boolean isWriteHeader) {
method setTokenSignTag (line 117) | public static SaLoginParameter setTokenSignTag(Map<String, Object> tok...
method create (line 125) | public static SaLoginParameter create() {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginModel.java
class SaLoginModel (line 27) | @Deprecated
FILE: sa-token-core/src/main/java/cn/dev33/satoken/stp/SaTokenInfo.java
class SaTokenInfo (line 42) | public class SaTokenInfo {
method getTokenName (line 82) | public String getTokenName() {
method setTokenName (line 89) | public void setTokenName(String tokenName) {
method getTokenValue (line 96) | public String getTokenValue() {
method setTokenValue (line 103) | public void setTokenValue(String tokenValue) {
method getIsLogin (line 110) | public Boolean getIsLogin() {
method setIsLogin (line 117) | public void setIsLogin(Boolean isLogin) {
method getLoginId (line 124) | public Object getLoginId() {
method setLoginId (line 131) | public void setLoginId(Object loginId) {
method getLoginType (line 138) | public String getLoginType() {
method setLoginType (line 145) | public void setLoginType(String loginType) {
method getTokenTimeout (line 152) | public long getTokenTimeout() {
method setTokenTimeout (line 159) | public void setTokenTimeout(long tokenTimeout) {
method getSessionTimeout (line 166) | public long getSessionTimeout() {
method setSessionTimeout (line 173) | public void setSessionTimeout(long sessionTimeout) {
method getTokenSessionTimeout (line 180) | public long getTokenSessionTimeout() {
method setTokenSessionTimeout (line 187) | public void setTokenSessionTimeout(long tokenSessionTimeout) {
method getTokenActiveTimeout (line 194) | public long getTokenActiveTimeout() {
method setTokenActiveTimeout (line 201) | public void setTokenActiveTimeout(long tokenActiveTimeout) {
method getLoginDeviceType (line 208) | public String getLoginDeviceType() {
method setLoginDeviceType (line 215) | public void setLoginDeviceType(String loginDeviceType) {
method getTag (line 222) | public String getTag() {
method setTag (line 229) | public void setTag(String tag) {
method toString (line 236) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/stp/StpInterface.java
type StpInterface (line 33) | public interface StpInterface {
method getPermissionList (line 42) | List<String> getPermissionList(Object loginId, String loginType);
method getRoleList (line 51) | List<String> getRoleList(Object loginId, String loginType);
method isDisabled (line 60) | default SaDisableWrapperInfo isDisabled(Object loginId, String service) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/stp/StpInterfaceDefaultImpl.java
class StpInterfaceDefaultImpl (line 29) | public class StpInterfaceDefaultImpl implements StpInterface {
method getPermissionList (line 31) | @Override
method getRoleList (line 36) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java
class StpLogic (line 64) | public class StpLogic {
method StpLogic (line 76) | public StpLogic(String loginType) {
method getLoginType (line 85) | public String getLoginType(){
method setLoginType (line 95) | public StpLogic setLoginType(String loginType){
method setConfig (line 119) | public StpLogic setConfig(SaTokenConfig config) {
method getConfig (line 129) | public SaTokenConfig getConfig() {
method getConfigOrGlobal (line 138) | public SaTokenConfig getConfigOrGlobal() {
method getTokenName (line 155) | public String getTokenName() {
method createTokenValue (line 168) | public String createTokenValue(Object loginId, String deviceType, long...
method setTokenValue (line 177) | public void setTokenValue(String tokenValue){
method setTokenValue (line 187) | public void setTokenValue(String tokenValue, int cookieTimeout){
method setTokenValue (line 197) | public void setTokenValue(String tokenValue, SaLoginParameter loginPar...
method setTokenValueToStorage (line 223) | public void setTokenValueToStorage(String tokenValue){
method setTokenValueToCookie (line 247) | public void setTokenValueToCookie(String tokenValue, int cookieTimeout){
method setTokenValueToCookie (line 258) | public void setTokenValueToCookie(String tokenValue, SaCookieConfig co...
method setTokenValueToResponseHeader (line 281) | public void setTokenValueToResponseHeader(String tokenValue){
method getTokenValue (line 296) | public String getTokenValue(){
method getTokenValue (line 306) | public String getTokenValue(boolean noPrefixThrowException){
method getTokenValueNotCut (line 344) | public String getTokenValueNotCut(){
method getTokenValueNotNull (line 382) | public String getTokenValueNotNull(){
method getTokenInfo (line 395) | public SaTokenInfo getTokenInfo() {
method login (line 420) | public void login(Object id) {
method login (line 430) | public void login(Object id, String deviceType) {
method login (line 440) | public void login(Object id, boolean isLastingCookie) {
method login (line 450) | public void login(Object id, long timeout) {
method login (line 460) | public void login(Object id, SaLoginParameter loginParameter) {
method createLoginSession (line 474) | public String createLoginSession(Object id) {
method createLoginSession (line 485) | public String createLoginSession(Object id, SaLoginParameter loginPara...
method distUsableToken (line 539) | protected String distUsableToken(Object id, SaLoginParameter loginPara...
method checkLoginArgs (line 607) | protected void checkLoginArgs(Object id, SaLoginParameter loginParamet...
method getOrCreateLoginSession (line 645) | public String getOrCreateLoginSession(Object id) {
method logout (line 658) | public void logout() {
method logout (line 665) | public void logout(SaLogoutParameter logoutParameter) {
method logoutByTokenValue (line 715) | public void logoutByTokenValue(String tokenValue) {
method logoutByTokenValue (line 725) | public void logoutByTokenValue(String tokenValue, SaLogoutParameter lo...
method kickoutByTokenValue (line 735) | public void kickoutByTokenValue(String tokenValue) {
method kickoutByTokenValue (line 746) | public void kickoutByTokenValue(String tokenValue, SaLogoutParameter l...
method replacedByTokenValue (line 756) | public void replacedByTokenValue(String tokenValue) {
method replacedByTokenValue (line 767) | public void replacedByTokenValue(String tokenValue, SaLogoutParameter ...
method _logoutByTokenValue (line 777) | public void _logoutByTokenValue(String tokenValue, SaLogoutParameter l...
method logout (line 832) | public void logout(Object loginId) {
method logout (line 842) | public void logout(Object loginId, String deviceType) {
method logout (line 852) | public void logout(Object loginId, SaLogoutParameter logoutParameter) {
method kickout (line 862) | public void kickout(Object loginId) {
method kickout (line 873) | public void kickout(Object loginId, String deviceType) {
method kickout (line 884) | public void kickout(Object loginId, SaLogoutParameter logoutParameter) {
method replaced (line 894) | public void replaced(Object loginId) {
method replaced (line 905) | public void replaced(Object loginId, String deviceType) {
method replaced (line 916) | public void replaced(Object loginId, SaLogoutParameter logoutParameter) {
method _logout (line 926) | public void _logout(Object loginId, SaLogoutParameter logoutParameter) {
method removeTerminalByLogout (line 962) | public void removeTerminalByLogout(SaSession session, SaTerminalInfo t...
method removeTerminalByKickout (line 971) | public void removeTerminalByKickout(SaSession session, SaTerminalInfo ...
method removeTerminalByReplaced (line 980) | public void removeTerminalByReplaced(SaSession session, SaTerminalInfo...
method _removeTerminal (line 990) | public void _removeTerminal(SaSession session, SaTerminalInfo terminal...
method logoutByMaxLoginCount (line 1036) | public void logoutByMaxLoginCount(Object loginId, SaSession session, S...
method isLogin (line 1066) | public boolean isLogin() {
method isLogin (line 1078) | public boolean isLogin(Object loginId) {
method checkLogin (line 1086) | public void checkLogin() {
method getLoginId (line 1096) | public Object getLoginId() {
method getLoginId (line 1146) | @SuppressWarnings("unchecked")
method getLoginIdDefaultNull (line 1167) | public Object getLoginIdDefaultNull() {
method getLoginIdAsString (line 1200) | public String getLoginIdAsString() {
method getLoginIdAsInt (line 1209) | public int getLoginIdAsInt() {
method getLoginIdAsLong (line 1218) | public long getLoginIdAsLong() {
method getLoginIdByToken (line 1228) | public Object getLoginIdByToken(String tokenValue) {
method getLoginIdByTokenNotThinkFreeze (line 1249) | public Object getLoginIdByTokenNotThinkFreeze(String tokenValue) {
method getLoginIdNotHandle (line 1272) | public String getLoginIdNotHandle(String tokenValue) {
method getExtra (line 1282) | public Object getExtra(String key) {
method getExtra (line 1293) | public Object getExtra(String tokenValue, String key) {
method isValidLoginId (line 1305) | public boolean isValidLoginId(Object loginId) {
method isValidToken (line 1315) | public boolean isValidToken(String tokenValue) {
method saveTokenToIdMapping (line 1327) | public void saveTokenToIdMapping(String tokenValue, Object loginId, lo...
method updateTokenToIdMapping (line 1337) | public void updateTokenToIdMapping(String tokenValue, Object loginId) {
method deleteTokenToIdMapping (line 1350) | public void deleteTokenToIdMapping(String tokenValue) {
method getSessionBySessionId (line 1366) | public SaSession getSessionBySessionId(String sessionId, boolean isCre...
method getSessionBySessionId (line 1411) | public SaSession getSessionBySessionId(String sessionId) {
method getSessionByLoginId (line 1423) | public SaSession getSessionByLoginId(Object loginId, boolean isCreate,...
method getSessionByLoginId (line 1443) | public SaSession getSessionByLoginId(Object loginId, boolean isCreate) {
method getSessionByLoginId (line 1453) | public SaSession getSessionByLoginId(Object loginId) {
method getSession (line 1463) | public SaSession getSession(boolean isCreate) {
method getSession (line 1472) | public SaSession getSession() {
method getTokenSessionByToken (line 1486) | public SaSession getTokenSessionByToken(String tokenValue, boolean isC...
method getTokenSessionByToken (line 1527) | public SaSession getTokenSessionByToken(String tokenValue) {
method getTokenSession (line 1537) | public SaSession getTokenSession(boolean isCreate) {
method getTokenSession (line 1548) | public SaSession getTokenSession() {
method getAnonTokenSession (line 1558) | public SaSession getAnonTokenSession(boolean isCreate) {
method getAnonTokenSession (line 1631) | public SaSession getAnonTokenSession() {
method deleteTokenSession (line 1640) | public void deleteTokenSession(String tokenValue) {
method setLastActiveToNow (line 1654) | protected void setLastActiveToNow(String tokenValue, Long activeTimeou...
method updateLastActiveToNow (line 1677) | public void updateLastActiveToNow(String tokenValue) {
method updateLastActiveToNow (line 1690) | public void updateLastActiveToNow() {
method clearLastActive (line 1699) | protected void clearLastActive(String tokenValue) {
method isFreeze (line 1708) | public boolean isFreeze(String tokenValue) {
method checkActiveTimeoutByConfig (line 1730) | public void checkActiveTimeoutByConfig(String tokenValue) {
method checkActiveTimeout (line 1753) | public void checkActiveTimeout(String tokenValue) {
method checkActiveTimeout (line 1762) | public void checkActiveTimeout() {
method getTokenUseActiveTimeout (line 1772) | public Long getTokenUseActiveTimeout(String tokenValue) {
method getTokenUseActiveTimeoutOrGlobalConfig (line 1793) | public long getTokenUseActiveTimeoutOrGlobalConfig(String tokenValue) {
method getTokenLastActiveTime (line 1807) | public long getTokenLastActiveTime(String tokenValue) {
method getTokenLastActiveTime (line 1831) | public long getTokenLastActiveTime() {
method getTokenTimeout (line 1843) | public long getTokenTimeout() {
method getTokenTimeout (line 1853) | public long getTokenTimeout(String token) {
method getTokenTimeoutByLoginId (line 1863) | public long getTokenTimeoutByLoginId(Object loginId) {
method getSessionTimeout (line 1872) | public long getSessionTimeout() {
method getSessionTimeoutByLoginId (line 1882) | public long getSessionTimeoutByLoginId(Object loginId) {
method getTokenSessionTimeout (line 1891) | public long getTokenSessionTimeout() {
method getTokenSessionTimeoutByTokenValue (line 1901) | public long getTokenSessionTimeoutByTokenValue(String tokenValue) {
method getTokenActiveTimeout (line 1910) | public long getTokenActiveTimeout() {
method getTokenActiveTimeoutByToken (line 1920) | public long getTokenActiveTimeoutByToken(String tokenValue) {
method renewTimeout (line 1960) | public void renewTimeout(long timeout) {
method renewTimeout (line 1982) | public void renewTimeout(String tokenValue, long timeout) {
method getRoleList (line 2029) | public List<String> getRoleList() {
method getRoleList (line 2039) | public List<String> getRoleList(Object loginId) {
method hasRole (line 2049) | public boolean hasRole(String role) {
method hasRole (line 2064) | public boolean hasRole(Object loginId, String role) {
method hasRoleAnd (line 2074) | public boolean hasRoleAnd(String... roleArray){
method hasRoleOr (line 2089) | public boolean hasRoleOr(String... roleArray){
method checkRole (line 2103) | public void checkRole(String role) {
method checkRoleAnd (line 2114) | public void checkRoleAnd(String... roleArray){
method checkRoleOr (line 2137) | public void checkRoleOr(String... roleArray){
method getPermissionList (line 2167) | public List<String> getPermissionList() {
method getPermissionList (line 2177) | public List<String> getPermissionList(Object loginId) {
method hasPermission (line 2187) | public boolean hasPermission(String permission) {
method hasPermission (line 2202) | public boolean hasPermission(Object loginId, String permission) {
method hasPermissionAnd (line 2212) | public boolean hasPermissionAnd(String... permissionArray){
method hasPermissionOr (line 2227) | public boolean hasPermissionOr(String... permissionArray){
method checkPermission (line 2241) | public void checkPermission(String permission) {
method checkPermissionAnd (line 2252) | public void checkPermissionAnd(String... permissionArray){
method checkPermissionOr (line 2275) | public void checkPermissionOr(String... permissionArray){
method getTokenValueByLoginId (line 2311) | public String getTokenValueByLoginId(Object loginId) {
method getTokenValueByLoginId (line 2326) | public String getTokenValueByLoginId(Object loginId, String deviceType) {
method getTokenValueListByLoginId (line 2337) | public List<String> getTokenValueListByLoginId(Object loginId) {
method getTokenValueListByLoginId (line 2348) | public List<String> getTokenValueListByLoginId(Object loginId, String ...
method getTerminalListByLoginId (line 2365) | public List<SaTerminalInfo> getTerminalListByLoginId(Object loginId) {
method getTerminalListByLoginId (line 2376) | public List<SaTerminalInfo> getTerminalListByLoginId(Object loginId, S...
method forEachTerminalList (line 2393) | public void forEachTerminalList(Object loginId, SaTwoParamFunction<SaS...
method getTerminalInfo (line 2409) | public SaTerminalInfo getTerminalInfo() {
method getTerminalInfoByToken (line 2419) | public SaTerminalInfo getTerminalInfoByToken(String tokenValue) {
method getLoginDeviceType (line 2459) | public String getLoginDeviceType() {
method getLoginDeviceTypeByToken (line 2469) | public String getLoginDeviceTypeByToken(String tokenValue) {
method getLoginDeviceId (line 2479) | public String getLoginDeviceId() {
method getLoginDeviceIdByToken (line 2489) | public String getLoginDeviceIdByToken(String tokenValue) {
method isTrustDeviceId (line 2499) | public boolean isTrustDeviceId(Object userId, String deviceId) {
method searchTokenValue (line 2523) | public List<String> searchTokenValue(String keyword, int start, int si...
method searchSessionId (line 2537) | public List<String> searchSessionId(String keyword, int start, int siz...
method searchTokenSessionId (line 2551) | public List<String> searchTokenSessionId(String keyword, int start, in...
method disable (line 2565) | public void disable(Object loginId, long time) {
method isDisable (line 2575) | public boolean isDisable(Object loginId) {
method checkDisable (line 2584) | public void checkDisable(Object loginId) {
method getDisableTime (line 2594) | public long getDisableTime(Object loginId) {
method untieDisable (line 2603) | public void untieDisable(Object loginId) {
method disable (line 2618) | public void disable(Object loginId, String service, long time) {
method isDisable (line 2629) | public boolean isDisable(Object loginId, String service) {
method checkDisable (line 2639) | public void checkDisable(Object loginId, String... services) {
method getDisableTime (line 2654) | public long getDisableTime(Object loginId, String service) {
method untieDisable (line 2664) | public void untieDisable(Object loginId, String... services) {
method disableLevel (line 2694) | public void disableLevel(Object loginId, int level, long time) {
method disableLevel (line 2706) | public void disableLevel(Object loginId, String service, int level, lo...
method isDisableLevel (line 2732) | public boolean isDisableLevel(Object loginId, int level) {
method isDisableLevel (line 2744) | public boolean isDisableLevel(Object loginId, String service, int leve...
method checkDisableLevel (line 2761) | public void checkDisableLevel(Object loginId, int level) {
method checkDisableLevel (line 2772) | public void checkDisableLevel(Object loginId, String service, int leve...
method getDisableLevel (line 2792) | public int getDisableLevel(Object loginId) {
method getDisableLevel (line 2803) | public int getDisableLevel(Object loginId, String service) {
method switchTo (line 2830) | public void switchTo(Object loginId) {
method endSwitch (line 2837) | public void endSwitch() {
method isSwitch (line 2846) | public boolean isSwitch() {
method getSwitchLoginId (line 2855) | public Object getSwitchLoginId() {
method switchTo (line 2865) | public void switchTo(Object loginId, SaFunction function) {
method openSafe (line 2882) | public void openSafe(long safeTime) {
method openSafe (line 2892) | public void openSafe(String service, long safeTime) {
method isSafe (line 2909) | public boolean isSafe() {
method isSafe (line 2919) | public boolean isSafe(String service) {
method isSafe (line 2930) | public boolean isSafe(String tokenValue, String service) {
method checkSafe (line 2950) | public void checkSafe() {
method checkSafe (line 2959) | public void checkSafe(String service) {
method getSafeTime (line 2977) | public long getSafeTime() {
method getSafeTime (line 2987) | public long getSafeTime(String service) {
method closeSafe (line 3001) | public void closeSafe() {
method closeSafe (line 3010) | public void closeSafe(String service) {
method splicingKeyTokenName (line 3032) | public String splicingKeyTokenName() {
method splicingKeyTokenValue (line 3042) | public String splicingKeyTokenValue(String tokenValue) {
method splicingKeySession (line 3052) | public String splicingKeySession(Object loginId) {
method splicingKeyTokenSession (line 3062) | public String splicingKeyTokenSession(String tokenValue) {
method splicingKeyLastActiveTime (line 3072) | public String splicingKeyLastActiveTime(String tokenValue) {
method splicingKeySwitch (line 3081) | public String splicingKeySwitch() {
method splicingKeyJustCreatedSave (line 3090) | public String splicingKeyJustCreatedSave() {
method splicingKeyDisable (line 3102) | public String splicingKeyDisable(Object loginId, String service) {
method splicingKeySafe (line 3113) | public String splicingKeySafe(String tokenValue, String service) {
method getSaTokenDao (line 3127) | public SaTokenDao getSaTokenDao() {
method isSupportShareToken (line 3136) | public boolean isSupportShareToken() {
method isOpenCheckActiveTimeout (line 3145) | public boolean isOpenCheckActiveTimeout() {
method getConfigOfCookieTimeout (line 3155) | public int getConfigOfCookieTimeout() {
method getConfigOfMaxTryTimes (line 3169) | public int getConfigOfMaxTryTimes(SaLoginParameter loginParameter) {
method hasElement (line 3180) | public boolean hasElement(List<String> list, String element) {
method isSupportExtra (line 3189) | public boolean isSupportExtra() {
method createSaLoginParameter (line 3198) | public SaLoginParameter createSaLoginParameter() {
method createSaLogoutParameter (line 3207) | public SaLogoutParameter createSaLogoutParameter() {
method getLoginDevice (line 3221) | @Deprecated
method getLoginDeviceByToken (line 3233) | @Deprecated
FILE: sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java
class StpUtil (line 35) | public class StpUtil {
method StpUtil (line 37) | private StpUtil() {}
method getLoginType (line 54) | public static String getLoginType(){
method setStpLogic (line 67) | public static void setStpLogic(StpLogic newStpLogic) {
method getStpLogic (line 84) | public static StpLogic getStpLogic() {
method getTokenName (line 96) | public static String getTokenName() {
method setTokenValue (line 105) | public static void setTokenValue(String tokenValue){
method setTokenValue (line 115) | public static void setTokenValue(String tokenValue, int cookieTimeout){
method setTokenValue (line 125) | public static void setTokenValue(String tokenValue, SaLoginParameter l...
method setTokenValueToStorage (line 134) | public static void setTokenValueToStorage(String tokenValue){
method getTokenValue (line 143) | public static String getTokenValue() {
method getTokenValueNotCut (line 152) | public static String getTokenValueNotCut(){
method getTokenInfo (line 161) | public static SaTokenInfo getTokenInfo() {
method login (line 175) | public static void login(Object id) {
method login (line 185) | public static void login(Object id, String deviceType) {
method login (line 195) | public static void login(Object id, boolean isLastingCookie) {
method login (line 205) | public static void login(Object id, long timeout) {
method login (line 215) | public static void login(Object id, SaLoginParameter loginParameter) {
method createLoginSession (line 225) | public static String createLoginSession(Object id) {
method createLoginSession (line 236) | public static String createLoginSession(Object id, SaLoginParameter lo...
method getOrCreateLoginSession (line 246) | public static String getOrCreateLoginSession(Object id) {
method logout (line 255) | public static void logout() {
method logout (line 262) | public static void logout(SaLogoutParameter logoutParameter) {
method logoutByTokenValue (line 271) | public static void logoutByTokenValue(String tokenValue) {
method logoutByTokenValue (line 281) | public static void logoutByTokenValue(String tokenValue, SaLogoutParam...
method kickoutByTokenValue (line 291) | public static void kickoutByTokenValue(String tokenValue) {
method kickoutByTokenValue (line 302) | public static void kickoutByTokenValue(String tokenValue, SaLogoutPara...
method replacedByTokenValue (line 312) | public static void replacedByTokenValue(String tokenValue) {
method replacedByTokenValue (line 323) | public static void replacedByTokenValue(String tokenValue, SaLogoutPar...
method logout (line 334) | public static void logout(Object loginId) {
method logout (line 344) | public static void logout(Object loginId, String deviceType) {
method logout (line 354) | public static void logout(Object loginId, SaLogoutParameter logoutPara...
method kickout (line 364) | public static void kickout(Object loginId) {
method kickout (line 375) | public static void kickout(Object loginId, String deviceType) {
method kickout (line 386) | public static void kickout(Object loginId, SaLogoutParameter logoutPar...
method replaced (line 396) | public static void replaced(Object loginId) {
method replaced (line 407) | public static void replaced(Object loginId, String deviceType) {
method replaced (line 418) | public static void replaced(Object loginId, SaLogoutParameter logoutPa...
method removeTerminalByLogout (line 429) | public static void removeTerminalByLogout(SaSession session, SaTermina...
method removeTerminalByKickout (line 438) | public static void removeTerminalByKickout(SaSession session, SaTermin...
method removeTerminalByReplaced (line 447) | public static void removeTerminalByReplaced(SaSession session, SaTermi...
method isLogin (line 459) | public static boolean isLogin() {
method isLogin (line 468) | public static boolean isLogin(Object loginId) {
method checkLogin (line 475) | public static void checkLogin() {
method getLoginId (line 484) | public static Object getLoginId() {
method getLoginId (line 495) | public static <T> T getLoginId(T defaultValue) {
method getLoginIdDefaultNull (line 504) | public static Object getLoginIdDefaultNull() {
method getLoginIdAsString (line 513) | public static String getLoginIdAsString() {
method getLoginIdAsInt (line 522) | public static int getLoginIdAsInt() {
method getLoginIdAsLong (line 531) | public static long getLoginIdAsLong() {
method getLoginIdByToken (line 541) | public static Object getLoginIdByToken(String tokenValue) {
method getLoginIdByTokenNotThinkFreeze (line 551) | public static Object getLoginIdByTokenNotThinkFreeze(String tokenValue) {
method getExtra (line 561) | public static Object getExtra(String key) {
method getExtra (line 572) | public static Object getExtra(String tokenValue, String key) {
method getSessionByLoginId (line 586) | public static SaSession getSessionByLoginId(Object loginId, boolean is...
method getSessionBySessionId (line 596) | public static SaSession getSessionBySessionId(String sessionId) {
method getSessionByLoginId (line 606) | public static SaSession getSessionByLoginId(Object loginId) {
method getSession (line 616) | public static SaSession getSession(boolean isCreate) {
method getSession (line 625) | public static SaSession getSession() {
method getTokenSessionByToken (line 638) | public static SaSession getTokenSessionByToken(String tokenValue) {
method getTokenSession (line 647) | public static SaSession getTokenSession() {
method getAnonTokenSession (line 656) | public static SaSession getAnonTokenSession() {
method updateLastActiveToNow (line 670) | public static void updateLastActiveToNow() {
method checkActiveTimeout (line 677) | public static void checkActiveTimeout() {
method getTokenLastActiveTime (line 686) | public static long getTokenLastActiveTime() {
method getTokenTimeout (line 698) | public static long getTokenTimeout() {
method getTokenTimeout (line 708) | public static long getTokenTimeout(String token) {
method getSessionTimeout (line 717) | public static long getSessionTimeout() {
method getTokenSessionTimeout (line 726) | public static long getTokenSessionTimeout() {
method getTokenActiveTimeout (line 735) | public static long getTokenActiveTimeout() {
method renewTimeout (line 744) | public static void renewTimeout(long timeout) {
method renewTimeout (line 754) | public static void renewTimeout(String tokenValue, long timeout) {
method getRoleList (line 766) | public static List<String> getRoleList() {
method getRoleList (line 776) | public static List<String> getRoleList(Object loginId) {
method hasRole (line 786) | public static boolean hasRole(String role) {
method hasRole (line 797) | public static boolean hasRole(Object loginId, String role) {
method hasRoleAnd (line 807) | public static boolean hasRoleAnd(String... roleArray){
method hasRoleOr (line 817) | public static boolean hasRoleOr(String... roleArray){
method checkRole (line 826) | public static void checkRole(String role) {
method checkRoleAnd (line 835) | public static void checkRoleAnd(String... roleArray){
method checkRoleOr (line 844) | public static void checkRoleOr(String... roleArray){
method getPermissionList (line 856) | public static List<String> getPermissionList() {
method getPermissionList (line 866) | public static List<String> getPermissionList(Object loginId) {
method hasPermission (line 876) | public static boolean hasPermission(String permission) {
method hasPermission (line 887) | public static boolean hasPermission(Object loginId, String permission) {
method hasPermissionAnd (line 897) | public static boolean hasPermissionAnd(String... permissionArray){
method hasPermissionOr (line 907) | public static boolean hasPermissionOr(String... permissionArray){
method checkPermission (line 916) | public static void checkPermission(String permission) {
method checkPermissionAnd (line 925) | public static void checkPermissionAnd(String... permissionArray) {
method checkPermissionOr (line 934) | public static void checkPermissionOr(String... permissionArray) {
method getTokenValueByLoginId (line 951) | public static String getTokenValueByLoginId(Object loginId) {
method getTokenValueByLoginId (line 966) | public static String getTokenValueByLoginId(Object loginId, String dev...
method getTokenValueListByLoginId (line 976) | public static List<String> getTokenValueListByLoginId(Object loginId) {
method getTokenValueListByLoginId (line 987) | public static List<String> getTokenValueListByLoginId(Object loginId, ...
method getTerminalListByLoginId (line 997) | public static List<SaTerminalInfo> getTerminalListByLoginId(Object log...
method getTerminalListByLoginId (line 1008) | public static List<SaTerminalInfo> getTerminalListByLoginId(Object log...
method forEachTerminalList (line 1018) | public static void forEachTerminalList(Object loginId, SaTwoParamFunct...
method getTerminalInfo (line 1027) | public static SaTerminalInfo getTerminalInfo() {
method getTerminalInfoByToken (line 1037) | public static SaTerminalInfo getTerminalInfoByToken(String tokenValue) {
method getLoginDeviceType (line 1046) | public static String getLoginDeviceType() {
method getLoginDeviceTypeByToken (line 1056) | public static String getLoginDeviceTypeByToken(String tokenValue) {
method getLoginDeviceId (line 1065) | public static String getLoginDeviceId() {
method getLoginDeviceIdByToken (line 1075) | public static String getLoginDeviceIdByToken(String tokenValue) {
method isTrustDeviceId (line 1084) | public static boolean isTrustDeviceId(Object userId, String deviceId) {
method searchTokenValue (line 1102) | public static List<String> searchTokenValue(String keyword, int start,...
method searchSessionId (line 1116) | public static List<String> searchSessionId(String keyword, int start, ...
method searchTokenSessionId (line 1130) | public static List<String> searchTokenSessionId(String keyword, int st...
method disable (line 1144) | public static void disable(Object loginId, long time) {
method isDisable (line 1154) | public static boolean isDisable(Object loginId) {
method checkDisable (line 1163) | public static void checkDisable(Object loginId) {
method getDisableTime (line 1173) | public static long getDisableTime(Object loginId) {
method untieDisable (line 1182) | public static void untieDisable(Object loginId) {
method disable (line 1197) | public static void disable(Object loginId, String service, long time) {
method isDisable (line 1208) | public static boolean isDisable(Object loginId, String service) {
method checkDisable (line 1218) | public static void checkDisable(Object loginId, String... services) {
method getDisableTime (line 1229) | public static long getDisableTime(Object loginId, String service) {
method untieDisable (line 1239) | public static void untieDisable(Object loginId, String... services) {
method disableLevel (line 1253) | public static void disableLevel(Object loginId, int level, long time) {
method disableLevel (line 1265) | public static void disableLevel(Object loginId, String service, int le...
method isDisableLevel (line 1276) | public static boolean isDisableLevel(Object loginId, int level) {
method isDisableLevel (line 1288) | public static boolean isDisableLevel(Object loginId, String service, i...
method checkDisableLevel (line 1298) | public static void checkDisableLevel(Object loginId, int level) {
method checkDisableLevel (line 1309) | public static void checkDisableLevel(Object loginId, String service, i...
method getDisableLevel (line 1319) | public static int getDisableLevel(Object loginId) {
method getDisableLevel (line 1330) | public static int getDisableLevel(Object loginId, String service) {
method switchTo (line 1342) | public static void switchTo(Object loginId) {
method endSwitch (line 1349) | public static void endSwitch() {
method isSwitch (line 1358) | public static boolean isSwitch() {
method switchTo (line 1368) | public static void switchTo(Object loginId, SaFunction function) {
method openSafe (line 1380) | public static void openSafe(long safeTime) {
method openSafe (line 1390) | public static void openSafe(String service, long safeTime) {
method isSafe (line 1399) | public static boolean isSafe() {
method isSafe (line 1409) | public static boolean isSafe(String service) {
method isSafe (line 1420) | public static boolean isSafe(String tokenValue, String service) {
method checkSafe (line 1427) | public static void checkSafe() {
method checkSafe (line 1436) | public static void checkSafe(String service) {
method getSafeTime (line 1445) | public static long getSafeTime() {
method getSafeTime (line 1455) | public static long getSafeTime(String service) {
method closeSafe (line 1462) | public static void closeSafe() {
method closeSafe (line 1471) | public static void closeSafe(String service) {
method createSaLoginParameter (line 1483) | public static SaLoginParameter createSaLoginParameter() {
method getLoginDevice (line 1496) | @Deprecated
method getLoginDeviceByToken (line 1508) | @Deprecated
FILE: sa-token-core/src/main/java/cn/dev33/satoken/stp/parameter/SaLoginParameter.java
class SaLoginParameter (line 42) | public class SaLoginParameter {
method SaLoginParameter (line 142) | public SaLoginParameter() {
method SaLoginParameter (line 145) | public SaLoginParameter(SaTokenConfig config) {
method setDefaultValues (line 155) | public SaLoginParameter setDefaultValues(SaTokenConfig config) {
method setExtra (line 188) | public SaLoginParameter setExtra(String key, Object value) {
method getExtra (line 201) | public Object getExtra(String key) {
method haveExtraData (line 212) | public boolean haveExtraData() {
method setTerminalExtra (line 222) | public SaLoginParameter setTerminalExtra(String key, Object value) {
method getTerminalExtra (line 235) | public Object getTerminalExtra(String key) {
method haveTerminalExtraData (line 246) | public boolean haveTerminalExtraData() {
method getCookieTimeout (line 254) | public int getCookieTimeout() {
method create (line 269) | public static SaLoginParameter create() {
method setupCookieConfig (line 278) | public SaLoginParameter setupCookieConfig(SaParamFunction<SaCookieConf...
method getDeviceType (line 290) | public String getDeviceType() {
method setDeviceType (line 298) | public SaLoginParameter setDeviceType(String deviceType) {
method getDeviceId (line 308) | public String getDeviceId() {
method setDeviceId (line 317) | public SaLoginParameter setDeviceId(String deviceId) {
method getReplacedRange (line 327) | public SaReplacedRange getReplacedRange() {
method setReplacedRange (line 337) | public SaLoginParameter setReplacedRange(SaReplacedRange replacedRange) {
method getOverflowLogoutMode (line 347) | public SaLogoutMode getOverflowLogoutMode() {
method setOverflowLogoutMode (line 357) | public SaLoginParameter setOverflowLogoutMode(SaLogoutMode overflowLog...
method getIsLastingCookie (line 365) | public Boolean getIsLastingCookie() {
method setIsLastingCookie (line 373) | public SaLoginParameter setIsLastingCookie(Boolean isLastingCookie) {
method getTimeout (line 381) | public long getTimeout() {
method setTimeout (line 389) | public SaLoginParameter setTimeout(long timeout) {
method getActiveTimeout (line 397) | public Long getActiveTimeout() {
method setActiveTimeout (line 405) | public SaLoginParameter setActiveTimeout(long activeTimeout) {
method getIsConcurrent (line 413) | public Boolean getIsConcurrent() {
method setIsConcurrent (line 421) | public SaLoginParameter setIsConcurrent(Boolean isConcurrent) {
method getIsShare (line 429) | public Boolean getIsShare() {
method setIsShare (line 437) | public SaLoginParameter setIsShare(Boolean isShare) {
method getMaxLoginCount (line 445) | public int getMaxLoginCount() {
method setMaxLoginCount (line 453) | public SaLoginParameter setMaxLoginCount(int maxLoginCount) {
method getMaxTryTimes (line 461) | public int getMaxTryTimes() {
method setMaxTryTimes (line 469) | public SaLoginParameter setMaxTryTimes(int maxTryTimes) {
method getExtraData (line 477) | public Map<String, Object> getExtraData() {
method setExtraData (line 485) | public SaLoginParameter setExtraData(Map<String, Object> extraData) {
method getToken (line 493) | public String getToken() {
method setToken (line 501) | public SaLoginParameter setToken(String token) {
method getIsWriteHeader (line 509) | public Boolean getIsWriteHeader() {
method setIsWriteHeader (line 517) | public SaLoginParameter setIsWriteHeader(Boolean isWriteHeader) {
method getTerminalExtraData (line 527) | public Map<String, Object> getTerminalExtraData() {
method setTerminalExtraData (line 537) | public SaLoginParameter setTerminalExtraData(Map<String, Object> termi...
method getRightNowCreateTokenSession (line 547) | public Boolean getRightNowCreateTokenSession() {
method setRightNowCreateTokenSession (line 557) | public SaLoginParameter setRightNowCreateTokenSession(Boolean rightNow...
method getCookie (line 565) | public SaCookieConfig getCookie() {
method setCookie (line 573) | public SaLoginParameter setCookie(SaCookieConfig cookie) {
method getReplacedLoginExitMode (line 583) | public SaReplacedLoginExitMode getReplacedLoginExitMode() {
method setReplacedLoginExitMode (line 592) | public SaLoginParameter setReplacedLoginExitMode(SaReplacedLoginExitMo...
method toString (line 600) | @Override
method getDevice (line 631) | @Deprecated
method setDevice (line 641) | @Deprecated
FILE: sa-token-core/src/main/java/cn/dev33/satoken/stp/parameter/SaLogoutParameter.java
class SaLogoutParameter (line 34) | public class SaLogoutParameter {
method SaLogoutParameter (line 78) | public SaLogoutParameter() {
method SaLogoutParameter (line 81) | public SaLogoutParameter(SaTokenConfig config) {
method setDefaultValues (line 91) | public SaLogoutParameter setDefaultValues(SaTokenConfig config) {
method create (line 102) | public static SaLogoutParameter create() {
method getIsKeepTokenSession (line 113) | public Boolean getIsKeepTokenSession() {
method setIsKeepTokenSession (line 122) | public SaLogoutParameter setIsKeepTokenSession(Boolean isKeepTokenSess...
method getIsKeepFreezeOps (line 133) | public Boolean getIsKeepFreezeOps() {
method setIsKeepFreezeOps (line 144) | public SaLogoutParameter setIsKeepFreezeOps(Boolean isKeepFreezeOps) {
method getDeviceType (line 155) | public String getDeviceType() {
method setDeviceType (line 166) | public SaLogoutParameter setDeviceType(String deviceType) {
method getDeviceId (line 177) | public String getDeviceId() {
method setDeviceId (line 188) | public SaLogoutParameter setDeviceId(String deviceId) {
method getMode (line 198) | public SaLogoutMode getMode() {
method setMode (line 208) | public SaLogoutParameter setMode(SaLogoutMode mode) {
method getRange (line 219) | public SaLogoutRange getRange() {
method setRange (line 230) | public SaLogoutParameter setRange(SaLogoutRange range) {
method toString (line 238) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/stp/parameter/enums/SaLogoutMode.java
type SaLogoutMode (line 24) | public enum SaLogoutMode {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/stp/parameter/enums/SaLogoutRange.java
type SaLogoutRange (line 24) | public enum SaLogoutRange {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/stp/parameter/enums/SaReplacedLoginExitMode.java
type SaReplacedLoginExitMode (line 23) | public enum SaReplacedLoginExitMode {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/stp/parameter/enums/SaReplacedRange.java
type SaReplacedRange (line 24) | public enum SaReplacedRange {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/strategy/SaAnnotationStrategy.java
class SaAnnotationStrategy (line 33) | public final class SaAnnotationStrategy {
method SaAnnotationStrategy (line 35) | private SaAnnotationStrategy() {
method registerDefaultAnnotationHandler (line 55) | public void registerDefaultAnnotationHandler() {
method registerAnnotationHandler (line 69) | public void registerAnnotationHandler(SaAnnotationHandlerInterface<?> ...
method registerAnnotationHandlerToFirst (line 77) | public void registerAnnotationHandlerToFirst(SaAnnotationHandlerInterf...
method removeAnnotationHandler (line 88) | public void removeAnnotationHandler(Class<?> cls) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/strategy/SaFirewallStrategy.java
class SaFirewallStrategy (line 32) | public final class SaFirewallStrategy {
method SaFirewallStrategy (line 44) | private SaFirewallStrategy() {
method registerHook (line 61) | public void registerHook(SaFirewallCheckHook checkHook) {
method registerHookToFirst (line 71) | public void registerHookToFirst(SaFirewallCheckHook checkHook) {
method registerHookToSecond (line 80) | public void registerHookToSecond(SaFirewallCheckHook checkHook) {
method removeHook (line 89) | public void removeHook(Class<? extends SaFirewallCheckHook> hookClass) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/strategy/SaStrategy.java
class SaStrategy (line 46) | public final class SaStrategy {
method SaStrategy (line 48) | private SaStrategy() {
method setCreateToken (line 203) | public SaStrategy setCreateToken(SaCreateTokenFunction createToken) {
method setCreateSession (line 214) | public SaStrategy setCreateSession(SaCreateSessionFunction createSessi...
method setHasElement (line 225) | public SaStrategy setHasElement(SaHasElementFunction hasElement) {
method setGenerateUniqueToken (line 236) | public SaStrategy setGenerateUniqueToken(SaGenerateUniqueTokenFunction...
method setCreateStpLogic (line 247) | public SaStrategy setCreateStpLogic(SaCreateStpLogicFunction createStp...
method setAutoRenew (line 258) | public SaStrategy setAutoRenew(SaAutoRenewFunction autoRenew) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/strategy/hooks/SaFirewallCheckHook.java
type SaFirewallCheckHook (line 27) | @FunctionalInterface
method execute (line 37) | void execute(SaRequest req, SaResponse res, Object extArg);
FILE: sa-token-core/src/main/java/cn/dev33/satoken/strategy/hooks/SaFirewallCheckHookForBlackPath.java
class SaFirewallCheckHookForBlackPath (line 32) | public class SaFirewallCheckHookForBlackPath implements SaFirewallCheckH...
method resetConfig (line 48) | public void resetConfig(String... paths) {
method execute (line 60) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/strategy/hooks/SaFirewallCheckHookForDirectoryTraversal.java
class SaFirewallCheckHookForDirectoryTraversal (line 28) | public class SaFirewallCheckHookForDirectoryTraversal implements SaFirew...
method execute (line 42) | @Override
method isPathValid (line 55) | public static boolean isPathValid(String path) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/strategy/hooks/SaFirewallCheckHookForHeader.java
class SaFirewallCheckHookForHeader (line 32) | public class SaFirewallCheckHookForHeader implements SaFirewallCheckHook {
method SaFirewallCheckHookForHeader (line 44) | public SaFirewallCheckHookForHeader() {
method resetConfig (line 51) | public void resetConfig(String... notAllowHeaderNames) {
method execute (line 63) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/strategy/hooks/SaFirewallCheckHookForHost.java
class SaFirewallCheckHookForHost (line 33) | public class SaFirewallCheckHookForHost implements SaFirewallCheckHook {
method resetConfig (line 55) | public void resetConfig(boolean isCheckHost, String... allowHosts) {
method execute (line 68) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/strategy/hooks/SaFirewallCheckHookForHttpMethod.java
class SaFirewallCheckHookForHttpMethod (line 33) | public class SaFirewallCheckHookForHttpMethod implements SaFirewallCheck...
method SaFirewallCheckHookForHttpMethod (line 50) | public SaFirewallCheckHookForHttpMethod() {
method resetConfig (line 68) | public void resetConfig(boolean isCheckMethod, String... methods) {
method execute (line 81) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/strategy/hooks/SaFirewallCheckHookForParameter.java
class SaFirewallCheckHookForParameter (line 32) | public class SaFirewallCheckHookForParameter implements SaFirewallCheckH...
method SaFirewallCheckHookForParameter (line 44) | public SaFirewallCheckHookForParameter() {
method resetConfig (line 51) | public void resetConfig(String... notAllowParameterNames) {
method execute (line 63) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/strategy/hooks/SaFirewallCheckHookForPathBannedCharacter.java
class SaFirewallCheckHookForPathBannedCharacter (line 29) | public class SaFirewallCheckHookForPathBannedCharacter implements SaFire...
method resetConfig (line 45) | public void resetConfig(boolean bannedPercentage) {
method execute (line 56) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/strategy/hooks/SaFirewallCheckHookForPathDangerCharacter.java
class SaFirewallCheckHookForPathDangerCharacter (line 32) | public class SaFirewallCheckHookForPathDangerCharacter implements SaFire...
method resetConfig (line 61) | public void resetConfig(String... character) {
method execute (line 72) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/strategy/hooks/SaFirewallCheckHookForWhitePath.java
class SaFirewallCheckHookForWhitePath (line 32) | public class SaFirewallCheckHookForWhitePath implements SaFirewallCheckH...
method resetConfig (line 48) | public void resetConfig(String... paths) {
method execute (line 60) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/temp/SaTempTemplate.java
class SaTempTemplate (line 39) | public class SaTempTemplate implements SaTtlMethods {
method SaTempTemplate (line 61) | public SaTempTemplate(){
method SaTempTemplate (line 69) | public SaTempTemplate(String namespace){
method createToken (line 87) | public String createToken(Object value, long timeout) {
method createToken (line 98) | public String createToken(Object value, long timeout, boolean isRecord...
method saveToken (line 123) | public void saveToken(String token, Object value, long timeout) {
method createTempTokenValue (line 133) | public String createTempTokenValue(Object value) {
method randomTempToken (line 147) | public String randomTempToken(Object value) {
method parseToken (line 159) | public Object parseToken(String token) {
method parseToken (line 171) | public<T> T parseToken(String token, Class<T> cs) {
method parseToken (line 188) | public<T> T parseToken(String token, String cutPrefix, Class<T> cs) {
method getTimeout (line 214) | public long getTimeout(String token) {
method deleteToken (line 225) | public void deleteToken(String token) {
method adjustIndex (line 254) | public Map<String, Long> adjustIndex(Object value, SaSession session) {
method getTempTokenList (line 297) | public List<String> getTempTokenList(Object value) {
method addTempTokenIndex (line 309) | protected void addTempTokenIndex(SaSession session, String token, long...
method deleteTempTokenIndex (line 322) | protected void deleteTempTokenIndex(SaSession session, String token) {
method _getValue (line 333) | protected Object _getValue(String token) {
method _deleteToken (line 337) | protected void _deleteToken(String token) {
method _getTimeout (line 341) | protected long _getTimeout(String token) {
method checkCutPrefixLength (line 354) | protected static void checkCutPrefixLength(String cutPrefix) {
method splicingTempTokenSaveKey (line 365) | public String splicingTempTokenSaveKey(String token) {
method getJwtSecretKey (line 372) | public String getJwtSecretKey() {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/temp/SaTempUtil.java
class SaTempUtil (line 32) | public class SaTempUtil {
method SaTempUtil (line 34) | private SaTempUtil() {
method createToken (line 46) | public static String createToken(Object value, long timeout) {
method createToken (line 57) | public static String createToken(Object value, long timeout, boolean i...
method saveToken (line 67) | public static void saveToken(String token, Object value, long timeout) {
method parseToken (line 78) | public static Object parseToken(String token) {
method parseToken (line 90) | public static<T> T parseToken(String token, Class<T> cs) {
method parseToken (line 107) | public static<T> T parseToken(String token, String cutPrefix, Class<T>...
method getTimeout (line 118) | public static long getTimeout(String token) {
method deleteToken (line 129) | public static void deleteToken(String token) {
method getTempTokenList (line 141) | public static List<String> getTempTokenList(Object value) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/util/SaFoxUtil.java
class SaFoxUtil (line 40) | public class SaFoxUtil {
method SaFoxUtil (line 42) | private SaFoxUtil() {
method printSaToken (line 48) | public static void printSaToken() {
method getRandomString (line 69) | public static String getRandomString(int length) {
method getRandomNumber (line 86) | public static int getRandomNumber(int min, int max) {
method isEmpty (line 95) | public static boolean isEmpty(Object str) {
method isNotEmpty (line 104) | public static boolean isNotEmpty(Object str) {
method isEmpty (line 115) | @Deprecated
method isEmptyArray (line 126) | public static <T> boolean isEmptyArray(T[] array) {
method isEmptyList (line 135) | public static boolean isEmptyList(List<?> list) {
method equals (line 145) | public static boolean equals(Object a, Object b) {
method notEquals (line 155) | public static boolean notEquals(Object a, Object b) {
method getMarking28 (line 163) | public static String getMarking28() {
method formatDate (line 172) | public static String formatDate(Date date){
method formatDate (line 181) | public static String formatDate(ZonedDateTime zonedDateTime) {
method formatAfterDate (line 190) | public static String formatAfterDate(long ms) {
method searchList (line 208) | public static List<String> searchList(Collection<String> dataList, Str...
method searchList (line 236) | public static List<String> searchList(List<String> list, int start, in...
method vagueMatch (line 273) | public static boolean vagueMatch(String patt, String str) {
method vagueMatchMethod (line 297) | private static boolean vagueMatchMethod( String pattern, String str) {
method isWrapperType (line 326) | public static boolean isWrapperType(Class<?> cs) {
method isBasicType (line 336) | public static boolean isBasicType(Class<?> cs) {
method getValueByType (line 347) | @SuppressWarnings("unchecked")
method mapToObject (line 387) | public static <T> T mapToObject(Map<String, Object> map, Class<T> claz...
method joinParam (line 416) | public static String joinParam(String url, String paramStr) {
method joinParam (line 454) | public static String joinParam(String url, String key, Object value) {
method joinSharpParam (line 468) | public static String joinSharpParam(String url, String paramStr) {
method joinSharpParam (line 506) | public static String joinSharpParam(String url, String key, Object val...
method spliceTwoUrl (line 522) | public static String spliceTwoUrl(String url1, String url2) {
method arrayJoin (line 545) | public static String arrayJoin(String[] arr) {
method isUrl (line 569) | public static boolean isUrl(String str) {
method encodeUrl (line 581) | public static String encodeUrl(String url) {
method decoderUrl (line 594) | public static String decoderUrl(String url) {
method convertStringToList (line 607) | public static List<String> convertStringToList(String str) {
method convertListToString (line 627) | public static String convertListToString(List<?> list) {
method convertStringToArray (line 646) | public static String[] convertStringToArray(String str) {
method convertArrayToString (line 656) | public static String convertArrayToString(String[] arr) {
method emptyList (line 668) | public static <T>List<T> emptyList() {
method toList (line 677) | public static List<String> toList(String... str) {
method toArray (line 686) | public static String[] toArray(List<String> list) {
method translateLogLevelToInt (line 697) | public static int translateLogLevelToInt(String level) {
method translateLogLevelToString (line 710) | public static String translateLogLevelToString(int level) {
method isCanColorLog (line 721) | @SuppressWarnings("all")
method list1ContainList2AllElement (line 759) | public static boolean list1ContainList2AllElement(List<String> list1, ...
method list1ContainList2AnyElement (line 780) | public static boolean list1ContainList2AnyElement(List<String> list1, ...
method list1RemoveByList2 (line 798) | public static List<String> list1RemoveByList2(List<String> list1, List...
method hasNonPrintableASCII (line 817) | public static boolean hasNonPrintableASCII(String str) {
method valueToString (line 836) | public static String valueToString(Object value) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/util/SaHexUtil.java
class SaHexUtil (line 24) | public class SaHexUtil {
method bytesToHex (line 34) | public static String bytesToHex(byte[] bytes) {
method hexToBytes (line 51) | public static byte[] hexToBytes(String hexString) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/util/SaResult.java
class SaResult (line 37) | public class SaResult extends LinkedHashMap<String, Object> implements S...
method SaResult (line 51) | public SaResult() {
method SaResult (line 60) | public SaResult(int code, String msg, Object data) {
method SaResult (line 70) | public SaResult(Map<String, ?> map) {
method getCode (line 78) | public Integer getCode() {
method getMsg (line 85) | public String getMsg() {
method getData (line 92) | public Object getData() {
method setCode (line 101) | public SaResult setCode(int code) {
method setMsg (line 110) | public SaResult setMsg(String msg) {
method setData (line 119) | public SaResult setData(Object data) {
method set (line 130) | public SaResult set(String key, Object data) {
method get (line 142) | public <T> T get(String key, Class<T> cs) {
method setMap (line 151) | public SaResult setMap(Map<String, ?> map) {
method setJsonString (line 165) | public SaResult setJsonString(String jsonString) {
method removeDefaultFields (line 174) | public SaResult removeDefaultFields() {
method removeNonDefaultFields (line 185) | public SaResult removeNonDefaultFields() {
method ok (line 199) | public static SaResult ok() {
method ok (line 202) | public static SaResult ok(String msg) {
method code (line 205) | public static SaResult code(int code) {
method data (line 208) | public static SaResult data(Object data) {
method error (line 213) | public static SaResult error() {
method error (line 216) | public static SaResult error(String msg) {
method notLogin (line 221) | public static SaResult notLogin() {
method notPermission (line 226) | public static SaResult notPermission() {
method get (line 233) | public static SaResult get(int code, String msg, Object data) {
method empty (line 238) | public static SaResult empty() {
method toString (line 245) | @Override
method transValue (line 262) | private String transValue(Object value) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/util/SaSugar.java
class SaSugar (line 28) | public class SaSugar {
method get (line 44) | public static <R> R get(Supplier<R> lambda) {
method exe (line 60) | public static void exe(SaFunction lambda) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenConsts.java
class SaTokenConsts (line 29) | public class SaTokenConsts {
method SaTokenConsts (line 31) | private SaTokenConsts() {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/util/SaTtlMethods.java
type SaTtlMethods (line 28) | public interface SaTtlMethods {
method newTokenValueList (line 34) | default List<String> newTokenValueList() {
method newTokenIndexMap (line 42) | default Map<String, Long> newTokenIndexMap() {
method getMaxTtl (line 51) | default long getMaxTtl(ArrayList<Long> ttlList) {
method getMaxTtlByExpireTime (line 70) | default long getMaxTtlByExpireTime(Collection<Long> expireTimeList) {
method expireTimeToTtl (line 90) | default long expireTimeToTtl(long expireTime) {
method ttlToExpireTime (line 109) | default long ttlToExpireTime(long ttl) {
FILE: sa-token-core/src/main/java/cn/dev33/satoken/util/SaValue2Box.java
class SaValue2Box (line 25) | public class SaValue2Box {
method SaValue2Box (line 42) | public SaValue2Box(Object value1, Object value2) {
method SaValue2Box (line 51) | public SaValue2Box(String valueString) {
method getValue1 (line 72) | public Object getValue1() {
method getValue2 (line 80) | public Object getValue2() {
method setValue1 (line 88) | public void setValue1(Object value1) {
method setValue2 (line 96) | public void setValue2(Object value2) {
method value1IsEmpty (line 104) | public boolean value1IsEmpty() {
method value2IsEmpty (line 112) | public boolean value2IsEmpty() {
method getValue1AsString (line 120) | public String getValue1AsString() {
method getValue2AsString (line 128) | public String getValue2AsString() {
method getValue1AsLong (line 136) | public long getValue1AsLong() {
method getValue2AsLong (line 144) | public long getValue2AsLong() {
method getValue1AsLong (line 152) | public Long getValue1AsLong(Long defaultValue) {
method getValue2AsLong (line 164) | public Long getValue2AsLong(Long defaultValue) {
method isNotValueState (line 176) | public boolean isNotValueState() {
method isSingleValueState (line 184) | public boolean isSingleValueState() {
method isDoubleValueState (line 192) | public boolean isDoubleValueState() {
method toString (line 208) | @Override
FILE: sa-token-core/src/main/java/cn/dev33/satoken/util/StrFormatter.java
class StrFormatter (line 28) | public class StrFormatter {
method format (line 72) | public static String format(String strPattern, Object... argArray) {
method formatWith (line 91) | public static String formatWith(String strPattern, String placeHolder,...
FILE: sa-token-demo/sa-token-demo-alone-redis-cluster/src/main/java/com/pj/SaTokenAloneRedisClusterApplication.java
class SaTokenAloneRedisClusterApplication (line 13) | @SpringBootApplication
method main (line 16) | public static void main(String[] args) {
FILE: sa-token-demo/sa-token-demo-alone-redis-cluster/src/main/java/com/pj/test/AjaxJson.java
class AjaxJson (line 10) | public class AjaxJson implements Serializable{
method getCode (line 30) | public int getCode() {
method setMsg (line 37) | public AjaxJson setMsg(String msg) {
method getMsg (line 41) | public String getMsg() {
method setData (line 48) | public AjaxJson setData(Object data) {
method getData (line 56) | @SuppressWarnings("unchecked")
method AjaxJson (line 63) | public AjaxJson(int code, String msg, Object data, Long dataCount) {
method getSuccess (line 71) | public static AjaxJson getSuccess() {
method getSuccess (line 74) | public static AjaxJson getSuccess(String msg) {
method getSuccess (line 77) | public static AjaxJson getSuccess(String msg, Object data) {
method getSuccessData (line 80) | public static AjaxJson getSuccessData(Object data) {
method getSuccessArray (line 83) | public static AjaxJson getSuccessArray(Object... data) {
method getError (line 88) | public static AjaxJson getError() {
method getError (line 91) | public static AjaxJson getError(String msg) {
method getWarning (line 96) | public static AjaxJson getWarning() {
method getWarning (line 99) | public static AjaxJson getWarning(String msg) {
method getNotLogin (line 104) | public static AjaxJson getNotLogin() {
method getNotJur (line 109) | public static AjaxJson getNotJur(String msg) {
method get (line 114) | public static AjaxJson get(int code, String msg){
method getPageData (line 119) | public static AjaxJson getPageData(Long dataCount, Object data){
method getByLine (line 124) | public static AjaxJson getByLine(int line){
method getByBoolean (line 132) | public static AjaxJson getByBoolean(boolean b){
method toString (line 139) | @SuppressWarnings("rawtypes")
FILE: sa-token-demo/sa-token-demo-alone-redis-cluster/src/main/java/com/pj/test/TestController.java
class TestController (line 16) | @RestController
method login (line 24) | @RequestMapping("login")
method test (line 32) | @RequestMapping("test")
FILE: sa-token-demo/sa-token-demo-alone-redis-sb4/src/main/java/com/pj/SaTokenAloneRedisSb4Application.java
class SaTokenAloneRedisSb4Application (line 12) | @SpringBootApplication
method main (line 15) | public static void main(String[] args) {
FILE: sa-token-demo/sa-token-demo-alone-redis-sb4/src/main/java/com/pj/test/TestController.java
class TestController (line 17) | @RestController
method login (line 25) | @RequestMapping("login")
method test (line 33) | @RequestMapping("test")
FILE: sa-token-demo/sa-token-demo-alone-redis/src/main/java/com/pj/SaTokenAloneRedisApplication.java
class SaTokenAloneRedisApplication (line 13) | @SpringBootApplication
method main (line 16) | public static void main(String[] args) {
FILE: sa-token-demo/sa-token-demo-alone-redis/src/main/java/com/pj/test/AjaxJson.java
class AjaxJson (line 10) | public class AjaxJson implements Serializable{
method getCode (line 30) | public int getCode() {
method setMsg (line 37) | public AjaxJson setMsg(String msg) {
method getMsg (line 41) | public String getMsg() {
method setData (line 48) | public AjaxJson setData(Object data) {
method getData (line 56) | @SuppressWarnings("unchecked")
method AjaxJson (line 63) | public AjaxJson(int code, String msg, Object data, Long dataCount) {
method getSuccess (line 71) | public static AjaxJson getSuccess() {
method getSuccess (line 74) | public static AjaxJson getSuccess(String msg) {
method getSuccess (line 77) | public static AjaxJson getSuccess(String msg, Object data) {
method getSuccessData (line 80) | public static AjaxJson getSuccessData(Object data) {
method getSuccessArray (line 83) | public static AjaxJson getSuccessArray(Object... data) {
method getError (line 88) | public static AjaxJson getError() {
method getError (line 91) | public static AjaxJson getError(String msg) {
method getWarning (line 96) | public static AjaxJson getWarning() {
method getWarning (line 99) | public static AjaxJson getWarning(String msg) {
method getNotLogin (line 104) | public static AjaxJson getNotLogin() {
method getNotJur (line 109) | public static AjaxJson getNotJur(String msg) {
method get (line 114) | public static AjaxJson get(int code, String msg){
method getPageData (line 119) | public static AjaxJson getPageData(Long dataCount, Object data){
method getByLine (line 124) | public static AjaxJson getByLine(int line){
method getByBoolean (line 132) | public static AjaxJson getByBoolean(boolean b){
method toString (line 139) | @SuppressWarnings("rawtypes")
FILE: sa-token-demo/sa-token-demo-alone-redis/src/main/java/com/pj/test/TestController.java
class TestController (line 16) | @RestController
method login (line 24) | @RequestMapping("login")
method test (line 32) | @RequestMapping("test")
FILE: sa-token-demo/sa-token-demo-apikey/src/main/java/com/pj/SaTokenApiKeyApplication.java
class SaTokenApiKeyApplication (line 8) | @SpringBootApplication
method main (line 11) | public static void main(String[] args) {
FILE: sa-token-demo/sa-token-demo-apikey/src/main/java/com/pj/mock/SaApiKeyDataLoaderImpl.java
class SaApiKeyDataLoaderImpl (line 14) | public class SaApiKeyDataLoaderImpl implements SaApiKeyDataLoader {
method getIsRecordIndex (line 20) | @Override
method getApiKeyModelFromDatabase (line 26) | @Override
FILE: sa-token-demo/sa-token-demo-apikey/src/main/java/com/pj/mock/SaApiKeyMockMapper.java
class SaApiKeyMockMapper (line 15) | @Component
method getApiKeyModel (line 38) | public ApiKeyModel getApiKeyModel(String apiKey) {
FILE: sa-token-demo/sa-token-demo-apikey/src/main/java/com/pj/satoken/GlobalException.java
class GlobalException (line 14) | @RestControllerAdvice
method handlerException (line 18) | @ExceptionHandler
FILE: sa-token-demo/sa-token-demo-apikey/src/main/java/com/pj/satoken/SaTokenConfigure.java
class SaTokenConfigure (line 20) | @Configuration
method addInterceptors (line 26) | @Override
method getSaServletFilter (line 34) | @Bean
FILE: sa-token-demo/sa-token-demo-apikey/src/main/java/com/pj/test/ApiKeyController.java
class ApiKeyController (line 17) | @RestController
method myApiKeyList (line 21) | @RequestMapping("/myApiKeyList")
method createApiKey (line 28) | @RequestMapping("/createApiKey")
method updateApiKey (line 36) | @RequestMapping("/updateApiKey")
method deleteApiKey (line 51) | @RequestMapping("/deleteApiKey")
method deleteMyAllApiKey (line 59) | @RequestMapping("/deleteMyAllApiKey")
FILE: sa-token-demo/sa-token-demo-apikey/src/main/java/com/pj/test/ApiKeyResourcesController.java
class ApiKeyResourcesController (line 16) | @RestController
method akRes1 (line 20) | @SaCheckApiKey
method akRes2 (line 29) | @SaCheckApiKey(scope = "userinfo")
method akRes3 (line 38) | @SaCheckApiKey(scope = {"userinfo", "chat"})
method akRes4 (line 47) | @SaCheckApiKey(scope = {"userinfo", "chat"}, mode = SaMode.OR)
FILE: sa-token-demo/sa-token-demo-apikey/src/main/java/com/pj/test/LoginController.java
class LoginController (line 14) | @RestController
method login (line 18) | @RequestMapping("login")
method getLoginId (line 25) | @RequestMapping("getLoginId")
method logout (line 31) | @RequestMapping("logout")
FILE: sa-token-demo/sa-token-demo-apikey/src/main/resources/static/common.js
function ajax (line 5) | function ajax(path, data, successFn, errorFn) {
function getParam (line 38) | function getParam(name, defaultValue) {
function serializeToQueryString (line 51) | function serializeToQueryString(obj) {
function randomString (line 59) | function randomString(len) {
function showMsg (line 71) | function showMsg(message) {
function formatDateTime (line 120) | function formatDateTime(date) {
FILE: sa-token-demo/sa-token-demo-async/src/main/java/com/pj/SaTokenAsyncApplication.java
class SaTokenAsyncApplication (line 15) | @EnableAsync // 启用异步
method main (line 20) | public static void main(String[] args) {
FILE: sa-token-demo/sa-token-demo-async/src/main/java/com/pj/current/GlobalException.java
class GlobalException (line 10) | @RestControllerAdvice
method handlerException (line 14) | @ExceptionHandler
FILE: sa-token-demo/sa-token-demo-async/src/main/java/com/pj/satoken/SaTokenConfigure.java
class SaTokenConfigure (line 17) | @Configuration
method addInterceptors (line 23) | @Override
method getSaServletFilter (line 32) | @Bean
FILE: sa-token-demo/sa-token-demo-async/src/main/java/com/pj/test/TestController.java
class TestController (line 25) | @RestController
method login (line 33) | @RequestMapping("login")
method isLogin (line 40) | @RequestMapping("isLogin")
method logout (line 47) | @RequestMapping("logout")
method isLogin2 (line 54) | @RequestMapping("isLogin2")
method isLogin3 (line 68) | @RequestMapping("isLogin3")
method isLogin4 (line 82) | @Async
method scheduledMethod (line 93) | @Scheduled(cron = "0 * * * * ?") // 一分钟执行一次
FILE: sa-token-demo/sa-token-demo-beetl/src/main/java/com/pj/SaTokenBeetlDemoApplication.java
class SaTokenBeetlDemoApplication (line 8) | @SpringBootApplication
method main (line 11) | public static void main(String[] args) {
FILE: sa-token-demo/sa-token-demo-beetl/src/main/java/com/pj/satoken/SaTokenConfigure.java
class SaTokenConfigure (line 15) | @Configuration
method beetlTemplateCustomize (line 20) | @Bean
FILE: sa-token-demo/sa-token-demo-beetl/src/main/java/com/pj/satoken/StpInterfaceImpl.java
class StpInterfaceImpl (line 13) | @Component // 打开此注解,保证此类被springboot扫描,即可完成sa-token的自定义权限验证扩展
method getPermissionList (line 19) | @Override
method getRoleList (line 35) | @Override
FILE: sa-token-demo/sa-token-demo-beetl/src/main/java/com/pj/test/GlobalException.java
class GlobalException (line 13) | @RestControllerAdvice
method handlerException (line 17) | @ExceptionHandler
FILE: sa-token-demo/sa-token-demo-beetl/src/main/java/com/pj/test/TestController.java
class TestController (line 15) | @RestController
method index (line 19) | @RequestMapping("/")
method login (line 25) | @RequestMapping("login")
method logout (line 33) | @RequestMapping("logout")
FILE: sa-token-demo/sa-token-demo-bom-import/src/main/java/com/pj/SaTokenDemoApplication.java
class SaTokenDemoApplication (line 13) | @SpringBootApplication
method main (line 16) | public static void main(String[] args) {
method getStpLogicJwt (line 22) | @Bean
FILE: sa-token-demo/sa-token-demo-bom-import/src/main/java/com/pj/current/GlobalException.java
class GlobalException (line 10) | @RestControllerAdvice
method handlerException (line 14) | @ExceptionHandler
FILE: sa-token-demo/sa-token-demo-bom-import/src/main/java/com/pj/test/TestController.java
class TestController (line 13) | @RestController
method test (line 18) | @RequestMapping("test")
method test2 (line 26) | @RequestMapping("test2")
FILE: sa-token-demo/sa-token-demo-caffeine/src/main/java/com/pj/SaTokenDemoApplication.java
class SaTokenDemoApplication (line 12) | @SpringBootApplication
method main (line 15) | public static void main(String[] args) {
FILE: sa-token-demo/sa-token-demo-caffeine/src/main/java/com/pj/current/GlobalException.java
class GlobalException (line 10) | @RestControllerAdvice
method handlerException (line 14) | @ExceptionHandler
FILE: sa-token-demo/sa-token-demo-caffeine/src/main/java/com/pj/test/LoginController.java
class LoginController (line 14) | @RestController
method doLogin (line 19) | @RequestMapping("doLogin")
method isLogin (line 30) | @RequestMapping("isLogin")
method tokenInfo (line 36) | @RequestMapping("tokenInfo")
method logout (line 42) | @RequestMapping("logout")
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/SaTokenCaseApplication.java
class SaTokenCaseApplication (line 12) | @SpringBootApplication
method main (line 15) | public static void main(String[] args) {
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/cases/more/SaCheckELController.java
class SaCheckELController (line 16) | @RestController
method test1 (line 21) | @SaCheckEL("stp.checkLogin()")
method test2 (line 28) | @SaCheckEL("stp.checkRole('dev-admin')")
method test3 (line 35) | @SaCheckEL("stp.checkPermission('user:edit')")
method test4 (line 42) | @SaCheckEL("stp.checkSafe()")
method test5 (line 49) | @SaCheckEL("NEED( #name.length() > 3 )")
method test6 (line 56) | @SaCheckEL("NEED( #name !=null && #name.length() > 3, 'name长度不够' )")
method test7 (line 63) | @SaCheckEL("NEED( stp.isLogin() or (#id != null and #id > 10010) )")
method test8 (line 70) | @SaCheckEL("NEED( stp.getSession().get('name') == 'zhangsan' )")
method test9 (line 77) | @SaCheckEL("stpUser.checkLogin()")
method test10 (line 87) | @SaCheckEL("stp.checkPermission( this.permissionCode )")
method test11 (line 94) | @SaIgnore
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/cases/plugin/TempTokenController.java
class TempTokenController (line 15) | @RestController
method create (line 20) | @RequestMapping("create")
method create2 (line 28) | @RequestMapping("create2")
method create3 (line 39) | @RequestMapping("create3")
method create4 (line 50) | @RequestMapping("create4")
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/cases/test/TestController.java
class TestController (line 12) | @RestController
method test (line 17) | @RequestMapping("test")
method test2 (line 24) | @RequestMapping("test2")
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/cases/up/DisableController.java
class DisableController (line 15) | @RestController
method login (line 30) | @RequestMapping("login")
method logout (line 40) | @RequestMapping("logout")
method disable (line 47) | @RequestMapping("disable")
method untieDisable (line 59) | @RequestMapping("untieDisable")
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/cases/up/HttpBasicController.java
class HttpBasicController (line 14) | @RestController
method login (line 27) | @RequestMapping("getInfo")
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/cases/up/MutexLoginController.java
class MutexLoginController (line 14) | @RestController
method login (line 49) | @RequestMapping("login")
method isLogin (line 60) | @RequestMapping("isLogin")
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/cases/up/NotCookieController.java
class NotCookieController (line 16) | @RestController
method doLogin (line 21) | @RequestMapping("doLogin")
method doLogin2 (line 32) | @RequestMapping("doLogin2")
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/cases/up/RememberMeController.java
class RememberMeController (line 15) | @RestController
method doLogin (line 20) | @RequestMapping("doLogin")
method doLogin2 (line 30) | @RequestMapping("doLogin2")
method doLogin3 (line 40) | @RequestMapping("doLogin3")
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/cases/up/SafeAuthController.java
class SafeAuthController (line 15) | @RestController
method deleteProject (line 33) | @RequestMapping("deleteProject")
method openSafe (line 50) | @RequestMapping("openSafe")
method closeSafe (line 65) | @RequestMapping("closeSafe")
method getClientSecret (line 75) | @RequestMapping("getClientSecret")
method openClientSafe (line 85) | @RequestMapping("openClientSafe")
method isClientSafe (line 102) | @RequestMapping("isClientSafe")
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/cases/up/SearchSessionController.java
class SearchSessionController (line 21) | @RestController
method login (line 39) | @RequestMapping("login")
method getList (line 56) | @RequestMapping("getList")
method logout (line 73) | @RequestMapping("logout")
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/cases/up/SecureController.java
class SecureController (line 16) | @RestController
method digest (line 21) | @RequestMapping("digest")
method aes (line 36) | @RequestMapping("aes")
method base64 (line 75) | @RequestMapping("base64")
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/cases/up/SwitchToController.java
class SwitchToController (line 15) | @RestController
method switchTo (line 25) | @RequestMapping("switchTo")
method switchTo2 (line 44) | @RequestMapping("switchTo2")
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/cases/use/AtCheckController.java
class AtCheckController (line 19) | @RestController
method checkLogin (line 35) | @SaCheckLogin
method checkPermission (line 44) | @SaCheckPermission("user.add")
method checkPermission2 (line 53) | @SaCheckPermission(value = {"user.add", "user.delete", "user.update"},...
method checkPermission3 (line 62) | @SaCheckPermission(value = {"user.add", "user.delete", "user.update"},...
method checkRole (line 71) | @SaCheckRole("super-admin")
method userAdd (line 80) | @RequestMapping("userAdd")
method ignore (line 88) | @SaIgnore
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/cases/use/JurAuthController.java
class JurAuthController (line 17) | @RestController
method getPermission (line 32) | @RequestMapping("getPermission")
method checkPermission (line 49) | @RequestMapping("checkPermission")
method checkRole (line 68) | @RequestMapping("checkRole")
method wildcardPermission (line 87) | @RequestMapping("wildcardPermission")
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/cases/use/KickoutController.java
class KickoutController (line 15) | @RestController
method logout (line 25) | @RequestMapping("logout")
method kickout (line 36) | @RequestMapping("kickout")
method kickoutByTokenValue (line 52) | @RequestMapping("kickoutByTokenValue")
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/cases/use/LoginAuthController.java
class LoginAuthController (line 16) | @RestController
method doLogin (line 21) | @RequestMapping("doLogin")
method isLogin (line 40) | @RequestMapping("isLogin")
method checkLogin (line 48) | @RequestMapping("checkLogin")
method getLoginId (line 58) | @RequestMapping("getLoginId")
method tokenInfo (line 89) | @RequestMapping("tokenInfo")
method logout (line 123) | @RequestMapping("logout")
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/cases/use/RouterCheckController.java
class RouterCheckController (line 14) | @RestController
method checkLogin (line 18) | @RequestMapping({
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/cases/use/SaSessionController.java
class SaSessionController (line 22) | @RestController
method getValue (line 32) | @RequestMapping("getValue")
method getModel (line 67) | @RequestMapping("getModel")
method customSession (line 86) | @RequestMapping("customSession")
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/current/GlobalException.java
class GlobalException (line 17) | @RestControllerAdvice
method handlerException (line 21) | @ExceptionHandler(NotLoginException.class)
method handlerException (line 32) | @ExceptionHandler(NotPermissionException.class)
method handlerException (line 39) | @ExceptionHandler(NotRoleException.class)
method handlerException (line 46) | @ExceptionHandler(NotSafeException.class)
method handlerException (line 53) | @ExceptionHandler(DisableServiceException.class)
method handlerException (line 60) | @ExceptionHandler(NotHttpBasicAuthException.class)
method handlerException (line 67) | @ExceptionHandler(Exception.class)
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/current/NotFoundHandle.java
class NotFoundHandle (line 18) | @RestController
method error (line 21) | @RequestMapping("/error")
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/model/SysUser.java
class SysUser (line 11) | public class SysUser implements Serializable {
method SysUser (line 18) | public SysUser() {
method SysUser (line 21) | public SysUser(long id, String name, int age) {
method getId (line 47) | public long getId() {
method setId (line 54) | public void setId(long id) {
method getName (line 61) | public String getName() {
method setName (line 68) | public void setName(String name) {
method getAge (line 75) | public int getAge() {
method setAge (line 82) | public void setAge(int age) {
method toString (line 86) | @Override
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/MySaTempTemplate.java
class MySaTempTemplate (line 12) | public class MySaTempTemplate extends SaTempTemplate {
method createToken (line 14) | @Override
method parseToken (line 20) | @Override
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/MySaTokenListener.java
class MySaTokenListener (line 13) | public class MySaTokenListener implements SaTokenListener {
method doLogin (line 16) | @Override
method doLogout (line 22) | @Override
method doKickout (line 28) | @Override
method doReplaced (line 34) | @Override
method doDisable (line 40) | @Override
method doUntieDisable (line 46) | @Override
method doOpenSafe (line 52) | @Override
method doCloseSafe (line 58) | @Override
method doCreateSession (line 64) | @Override
method doLogoutSession (line 70) | @Override
method doRenewTimeout (line 76) | @Override
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/SaLogForSlf4j.java
class SaLogForSlf4j (line 15) | public class SaLogForSlf4j implements SaLog {
method trace (line 19) | @Override
method debug (line 24) | @Override
method info (line 29) | @Override
method warn (line 34) | @Override
method error (line 39) | @Override
method fatal (line 44) | @Override
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/SaTokenConfigure.java
class SaTokenConfigure (line 26) | @Configuration
method addInterceptors (line 32) | @Override
method getSaServletFilter (line 71) | @Bean
method corsHandle (line 119) | @Bean
method rewriteSaStrategy (line 142) | @PostConstruct
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/StpInterfaceImpl.java
class StpInterfaceImpl (line 15) | @Component // 打开此注解,保证此类被springboot扫描,即可完成sa-token的自定义权限验证扩展
method getPermissionList (line 21) | @Override
method getRoleList (line 37) | @Override
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/StpUserUtil.java
class StpUserUtil (line 22) | public class StpUserUtil {
method StpUserUtil (line 24) | private StpUserUtil() {}
method getLoginType (line 41) | public static String getLoginType(){
method setStpLogic (line 54) | public static void setStpLogic(StpLogic newStpLogic) {
method getStpLogic (line 71) | public static StpLogic getStpLogic() {
method getTokenName (line 83) | public static String getTokenName() {
method setTokenValue (line 92) | public static void setTokenValue(String tokenValue){
method setTokenValue (line 102) | public static void setTokenValue(String tokenValue, int cookieTimeout){
method setTokenValue (line 112) | public static void setTokenValue(String tokenValue, SaLoginParameter l...
method getTokenValue (line 121) | public static String getTokenValue() {
method getTokenValueNotCut (line 130) | public static String getTokenValueNotCut(){
method getTokenInfo (line 139) | public static SaTokenInfo getTokenInfo() {
method login (line 153) | public static void login(Object id) {
method login (line 163) | public static void login(Object id, String deviceType) {
method login (line 173) | public static void login(Object id, boolean isLastingCookie) {
method login (line 183) | public static void login(Object id, long timeout) {
method login (line 193) | public static void login(Object id, SaLoginParameter loginParameter) {
method createLoginSession (line 203) | public static String createLoginSession(Object id) {
method createLoginSession (line 214) | public static String createLoginSession(Object id, SaLoginParameter lo...
method getOrCreateLoginSession (line 224) | public static String getOrCreateLoginSession(Object id) {
method logout (line 233) | public static void logout() {
method logout (line 240) | public static void logout(SaLogoutParameter logoutParameter) {
method logoutByTokenValue (line 249) | public static void logoutByTokenValue(String tokenValue) {
method logoutByTokenValue (line 259) | public static void logoutByTokenValue(String tokenValue, SaLogoutParam...
method kickoutByTokenValue (line 269) | public static void kickoutByTokenValue(String tokenValue) {
method kickoutByTokenValue (line 280) | public static void kickoutByTokenValue(String tokenValue, SaLogoutPara...
method replacedByTokenValue (line 290) | public static void replacedByTokenValue(String tokenValue) {
method replacedByTokenValue (line 301) | public static void replacedByTokenValue(String tokenValue, SaLogoutPar...
method logout (line 312) | public static void logout(Object loginId) {
method logout (line 322) | public static void logout(Object loginId, String deviceType) {
method logout (line 332) | public static void logout(Object loginId, SaLogoutParameter logoutPara...
method kickout (line 342) | public static void kickout(Object loginId) {
method kickout (line 353) | public static void kickout(Object loginId, String deviceType) {
method kickout (line 364) | public static void kickout(Object loginId, SaLogoutParameter logoutPar...
method replaced (line 374) | public static void replaced(Object loginId) {
method replaced (line 385) | public static void replaced(Object loginId, String deviceType) {
method replaced (line 396) | public static void replaced(Object loginId, SaLogoutParameter logoutPa...
method removeTerminalByLogout (line 407) | public static void removeTerminalByLogout(SaSession session, SaTermina...
method removeTerminalByKickout (line 416) | public static void removeTerminalByKickout(SaSession session, SaTermin...
method removeTerminalByReplaced (line 425) | public static void removeTerminalByReplaced(SaSession session, SaTermi...
method isLogin (line 437) | public static boolean isLogin() {
method isLogin (line 446) | public static boolean isLogin(Object loginId) {
method checkLogin (line 453) | public static void checkLogin() {
method getLoginId (line 462) | public static Object getLoginId() {
method getLoginId (line 473) | public static <T> T getLoginId(T defaultValue) {
method getLoginIdDefaultNull (line 482) | public static Object getLoginIdDefaultNull() {
method getLoginIdAsString (line 491) | public static String getLoginIdAsString() {
method getLoginIdAsInt (line 500) | public static int getLoginIdAsInt() {
method getLoginIdAsLong (line 509) | public static long getLoginIdAsLong() {
method getLoginIdByToken (line 519) | public static Object getLoginIdByToken(String tokenValue) {
method getLoginIdByTokenNotThinkFreeze (line 529) | public Object getLoginIdByTokenNotThinkFreeze(String tokenValue) {
method getExtra (line 539) | public static Object getExtra(String key) {
method getExtra (line 550) | public static Object getExtra(String tokenValue, String key) {
method getSessionByLoginId (line 564) | public static SaSession getSessionByLoginId(Object loginId, boolean is...
method getSessionBySessionId (line 574) | public static SaSession getSessionBySessionId(String sessionId) {
method getSessionByLoginId (line 584) | public static SaSession getSessionByLoginId(Object loginId) {
method getSession (line 594) | public static SaSession getSession(boolean isCreate) {
method getSession (line 603) | public static SaSession getSession() {
method getTokenSessionByToken (line 616) | public static SaSession getTokenSessionByToken(String tokenValue) {
method getTokenSession (line 625) | public static SaSession getTokenSession() {
method getAnonTokenSession (line 634) | public static SaSession getAnonTokenSession() {
method updateLastActiveToNow (line 648) | public static void updateLastActiveToNow() {
method checkActiveTimeout (line 655) | public static void checkActiveTimeout() {
method getTokenTimeout (line 667) | public static long getTokenTimeout() {
method getTokenTimeout (line 677) | public static long getTokenTimeout(String token) {
method getSessionTimeout (line 686) | public static long getSessionTimeout() {
method getTokenSessionTimeout (line 695) | public static long getTokenSessionTimeout() {
method getTokenActiveTimeout (line 704) | public static long getTokenActiveTimeout() {
method renewTimeout (line 713) | public static void renewTimeout(long timeout) {
method renewTimeout (line 723) | public static void renewTimeout(String tokenValue, long timeout) {
method getRoleList (line 735) | public static List<String> getRoleList() {
method getRoleList (line 745) | public static List<String> getRoleList(Object loginId) {
method hasRole (line 755) | public static boolean hasRole(String role) {
method hasRole (line 766) | public static boolean hasRole(Object loginId, String role) {
method hasRoleAnd (line 776) | public static boolean hasRoleAnd(String... roleArray){
method hasRoleOr (line 786) | public static boolean hasRoleOr(String... roleArray){
method checkRole (line 795) | public static void checkRole(String role) {
method checkRoleAnd (line 804) | public static void checkRoleAnd(String... roleArray){
method checkRoleOr (line 813) | public static void checkRoleOr(String... roleArray){
method getPermissionList (line 825) | public static List<String> getPermissionList() {
method getPermissionList (line 835) | public static List<String> getPermissionList(Object loginId) {
method hasPermission (line 845) | public static boolean hasPermission(String permission) {
method hasPermission (line 856) | public static boolean hasPermission(Object loginId, String permission) {
method hasPermissionAnd (line 866) | public static boolean hasPermissionAnd(String... permissionArray){
method hasPermissionOr (line 876) | public static boolean hasPermissionOr(String... permissionArray){
method checkPermission (line 885) | public static void checkPermission(String permission) {
method checkPermissionAnd (line 894) | public static void checkPermissionAnd(String... permissionArray) {
method checkPermissionOr (line 903) | public static void checkPermissionOr(String... permissionArray) {
method getTokenValueByLoginId (line 920) | public static String getTokenValueByLoginId(Object loginId) {
method getTokenValueByLoginId (line 935) | public static String getTokenValueByLoginId(Object loginId, String dev...
method getTokenValueListByLoginId (line 945) | public static List<String> getTokenValueListByLoginId(Object loginId) {
method getTokenValueListByLoginId (line 956) | public static List<String> getTokenValueListByLoginId(Object loginId, ...
method getTerminalListByLoginId (line 966) | public static List<SaTerminalInfo> getTerminalListByLoginId(Object log...
method getTerminalListByLoginId (line 977) | public static List<SaTerminalInfo> getTerminalListByLoginId(Object log...
method forEachTerminalList (line 987) | public static void forEachTerminalList(Object loginId, SaTwoParamFunct...
method getLoginDeviceType (line 996) | public static String getLoginDeviceType() {
method getLoginDeviceTypeByToken (line 1006) | public static String getLoginDeviceTypeByToken(String tokenValue) {
method getTokenLastActiveTime (line 1015) | public static long getTokenLastActiveTime() {
method isTrustDeviceId (line 1024) | public static boolean isTrustDeviceId(Object userId, String deviceId) {
method searchTokenValue (line 1042) | public static List<String> searchTokenValue(String keyword, int start,...
method searchSessionId (line 1056) | public static List<String> searchSessionId(String keyword, int start, ...
method searchTokenSessionId (line 1070) | public static List<String> searchTokenSessionId(String keyword, int st...
method disable (line 1084) | public static void disable(Object loginId, long time) {
method isDisable (line 1094) | public static boolean isDisable(Object loginId) {
method checkDisable (line 1103) | public static void checkDisable(Object loginId) {
method getDisableTime (line 1113) | public static long getDisableTime(Object loginId) {
method untieDisable (line 1122) | public static void untieDisable(Object loginId) {
method disable (line 1137) | public static void disable(Object loginId, String service, long time) {
method isDisable (line 1148) | public static boolean isDisable(Object loginId, String service) {
method checkDisable (line 1158) | public static void checkDisable(Object loginId, String... services) {
method getDisableTime (line 1169) | public static long getDisableTime(Object loginId, String service) {
method untieDisable (line 1179) | public static void untieDisable(Object loginId, String... services) {
method disableLevel (line 1193) | public static void disableLevel(Object loginId, int level, long time) {
method disableLevel (line 1205) | public static void disableLevel(Object loginId, String service, int le...
method isDisableLevel (line 1216) | public static boolean isDisableLevel(Object loginId, int level) {
method isDisableLevel (line 1228) | public static boolean isDisableLevel(Object loginId, String service, i...
method checkDisableLevel (line 1238) | public static void checkDisableLevel(Object loginId, int level) {
method checkDisableLevel (line 1249) | public static void checkDisableLevel(Object loginId, String service, i...
method getDisableLevel (line 1259) | public static int getDisableLevel(Object loginId) {
method getDisableLevel (line 1270) | public static int getDisableLevel(Object loginId, String service) {
method switchTo (line 1282) | public static void switchTo(Object loginId) {
method endSwitch (line 1289) | public static void endSwitch() {
method isSwitch (line 1298) | public static boolean isSwitch() {
method switchTo (line 1308) | public static void switchTo(Object loginId, SaFunction function) {
method openSafe (line 1320) | public static void openSafe(long safeTime) {
method openSafe (line 1330) | public static void openSafe(String service, long safeTime) {
method isSafe (line 1339) | public static boolean isSafe() {
method isSafe (line 1349) | public static boolean isSafe(String service) {
method isSafe (line 1360) | public static boolean isSafe(String tokenValue, String service) {
method checkSafe (line 1367) | public static void checkSafe() {
method checkSafe (line 1376) | public static void checkSafe(String service) {
method getSafeTime (line 1385) | public static long getSafeTime() {
method getSafeTime (line 1395) | public static long getSafeTime(String service) {
method closeSafe (line 1402) | public static void closeSafe() {
method closeSafe (line 1411) | public static void closeSafe(String service) {
method createSaLoginParameter (line 1423) | public static SaLoginParameter createSaLoginParameter() {
method getLoginDevice (line 1436) | @Deprecated
method getLoginDeviceByToken (line 1448) | @Deprecated
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/custom_annotation/handler/CheckAccountHandler.java
class CheckAccountHandler (line 17) | @Component
method getHandlerAnnotationClass (line 21) | @Override
method checkMethod (line 27) | @Override
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/custom_annotation/handler/SaUserCheckLoginHandler.java
class SaUserCheckLoginHandler (line 16) | @Component
method getHandlerAnnotationClass (line 19) | @Override
method checkMethod (line 24) | @Override
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/custom_annotation/handler/SaUserCheckPermissionHandler.java
class SaUserCheckPermissionHandler (line 16) | @Component
method getHandlerAnnotationClass (line 19) | @Override
method checkMethod (line 24) | @Override
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/custom_annotation/handler/SaUserCheckRoleHandler.java
class SaUserCheckRoleHandler (line 16) | @Component
method getHandlerAnnotationClass (line 19) | @Override
method checkMethod (line 24) | @Override
FILE: sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/custom_annotation/handler/SaUserCheckSafeHandler.java
class SaUserCheckSafeHandler (line 16) | @Component
method getHandlerAnnotationClass (line 19) | @Override
method checkMethod (line 24) | @Override
FILE: sa-token-demo/sa-token-demo-device-lock-h5/common.js
function ajax (line 5) | function ajax(path, data, successFn) {
function getLocalDeviceId (line 27) | function getLocalDeviceId() {
function getParam (line 41) | function getParam(name, defaultValue){
function serializeToQueryString (line 52) | function serializeToQueryString(obj) {
function randomString (line 60) | function randomString(len) {
FILE: sa-token-demo/sa-token-demo-device-lock/src/main/java/com/pj/SaTokenDeviceLockApplication.java
class SaTokenDeviceLockApplication (line 13) | @SpringBootApplication
method main (line 16) | public static void main(String[] args) {
FILE: sa-token-demo/sa-token-demo-device-lock/src/main/java/com/pj/current/GlobalException.java
class GlobalException (line 13) | @RestControllerAdvice
method handlerException (line 16) | @ExceptionHandler
FILE: sa-token-demo/sa-token-demo-device-lock/src/main/java/com/pj/current/NotFoundHandle.java
class NotFoundHandle (line 18) | @RestController
method error (line 21) | @RequestMapping("/error")
FILE: sa-token-demo/sa-token-demo-device-lock/src/main/java/com/pj/satoken/SaTokenConfigure.java
class SaTokenConfigure (line 20) | @Configuration
method addInterceptors (line 26) | @Override
method getSaServletFilter (line 35) | @Bean
FILE: sa-token-demo/sa-token-demo-device-lock/src/main/java/com/pj/test/LoginController.java
class LoginController (line 17) | @RestController
method doLogin (line 25) | @RequestMapping("doLogin")
method isLogin (line 45) | @RequestMapping("isLogin")
method logout (line 51) | @RequestMapping("logout")
method getPhone (line 58) | @RequestMapping("getPhone")
method sendCode (line 66) | @RequestMapping("sendCode")
method checkCode (line 75) | @RequestMapping("checkCode")
method login (line 85) | private SaResult login(long userId, String deviceId) {
FILE: sa-token-demo/sa-token-demo-device-lock/src/main/java/com/pj/test/SysUserMockDao.java
class SysUserMockDao (line 11) | @Service
method getPhoneByUserId (line 15) | public String getPhoneByUserId(long userId) {
method getUserIdByName (line 20) | public long getUserIdByName(String name) {
FILE: sa-token-demo/sa-token-demo-device-lock/src/main/java/com/pj/util/DeviceLockCheckUtil.java
class DeviceLockCheckUtil (line 11) | public class DeviceLockCheckUtil {
method setDeviceIdToUserId (line 18) | public static void setDeviceIdToUserId(String deviceId, long userId) {
method getUserIdByDeviceId (line 29) | public static long getUserIdByDeviceId(String deviceId) {
method saveKeyPrefix (line 38) | public static Object saveKeyPrefix() {
FILE: sa-token-demo/sa-token-demo-device-lock/src/main/java/com/pj/util/PhoneCodeUtil.java
class PhoneCodeUtil (line 12) | public class PhoneCodeUtil {
method sendCode (line 15) | public static void sendCode(String phone) {
method checkCode (line 22) | public static void checkCode(String phone, String code) {
FILE: sa-token-demo/sa-token-demo-dubbo/sa-token-demo-dubbo-consumer/src/main/java/com/pj/DubboConsumerApplication.java
class DubboConsumerApplication (line 13) | @EnableDubbo
method main (line 17) | public static void main(String[] args) {
FILE: sa-token-demo/sa-token-demo-dubbo/sa-token-demo-dubbo-consumer/src/main/java/com/pj/controller/TestController.java
class TestController (line 10) | @RestController
method test (line 17) | @RequestMapping("test")
method test2 (line 29) | @RequestMapping("test2")
method test3 (line 45) | @RequestMapping("test3")
method test4 (line 62) | @RequestMapping("test4")
FILE: sa-token-demo/sa-token-demo-dubbo/sa-token-demo-dubbo-consumer/src/main/java/com/pj/service/DemoService.java
type DemoService (line 3) | public interface DemoService {
method doLogin (line 9) | void doLogin(Object loginId);
method isLogin (line 14) | void isLogin(String str);
FILE: sa-token-demo/sa-token-demo-dubbo/sa-token-demo-dubbo-provider/src/main/java/com/pj/DubboProviderApplication.java
class DubboProviderApplication (line 13) | @EnableDubbo
method main (line 17) | public static void main(String[] args) {
FILE: sa-token-demo/sa-token-demo-dubbo/sa-token-demo-dubbo-provider/src/main/java/com/pj/controller/TestController.java
class TestController (line 10) | @RestController
method test (line 17) | @RequestMapping("test")
FILE: sa-token-demo/sa-token-demo-dubbo/sa-token-demo-dubbo-provider/src/main/java/com/pj/service/DemoService.java
type DemoService (line 3) | public interface DemoService {
method doLogin (line 9) | void doLogin(Object loginId);
method isLogin (line 14) | void isLogin(String str);
FILE: sa-token-demo/sa-token-demo-dubbo/sa-token-demo-dubbo-provider/src/main/java/com/pj/service/DemoServiceImpl.java
class DemoServiceImpl (line 7) | @DubboService()
method doLogin (line 10) | @Override
method isLogin (line 15) | @Override
FILE: sa-token-demo/sa-token-demo-dubbo/sa-token-demo-dubbo3-consumer/src/main/java/com/pj/Dubbo3ConsumerApplication.java
class Dubbo3ConsumerApplication (line 13) | @EnableDubbo
method main (line 17) | public static void main(String[] args) {
FILE: sa-token-demo/sa-token-demo-dubbo/sa-token-demo-dubbo3-consumer/src/main/java/com/pj/controller/TestController.java
class TestController (line 10) | @RestController
method test (line 17) | @RequestMapping("test")
method test2 (line 29) | @RequestMapping("test2")
method test3 (line 45) | @RequestMapping("test3")
method test4 (line 62) | @RequestMapping("test4")
FILE: sa-token-demo/sa-token-demo-dubbo/sa-token-demo-dubbo3-consumer/src/main/java/com/pj/service/DemoService.java
type DemoService (line 3) | public interface DemoService {
method doLogin (line 9) | void doLogin(Object loginId);
method isLogin (line 14) | void isLogin(String str);
FILE: sa-token-demo/sa-token-demo-dubbo/sa-token-demo-dubbo3-provider/src/main/java/com/pj/Dubbo3ProviderApplication.java
class Dubbo3ProviderApplication (line 13) | @EnableDubbo
method main (line 17) | public static void main(String[] args) throws Exception {
FILE: sa-token-demo/sa-token-demo-dubbo/sa-token-demo-dubbo3-provider/src/main/java/com/pj/controller/TestController.java
class TestController (line 10) | @RestController
method test (line 26) | @RequestMapping("test")
FILE: sa-token-demo/sa-token-demo-dubbo/sa-token-demo-dubbo3-provider/src/main/java/com/pj/service/DemoService.java
type DemoService (line 3) | public interface DemoService {
method doLogin (line 9) | void doLogin(Object loginId);
method isLogin (line 14) | void isLogin(String str);
FILE: sa-token-demo/sa-token-demo-dubbo/sa-token-demo-dubbo3-provider/src/main/java/com/pj/service/DemoServiceImpl.java
class DemoServiceImpl (line 7) | @DubboService()
method doLogin (line 10) | @Override
method isLogin (line 15) | @Override
FILE: sa-token-demo/sa-token-demo-freemarker/src/main/java/com/pj/SaTokenFreemarkerDemoApplication.java
class SaTokenFreemarkerDemoApplication (line 10) | @SpringBootApplication
method main (line 13) | public static void main(String[] args) {
FILE: sa-token-demo/sa-token-demo-freemarker/src/main/java/com/pj/satoken/SaTokenConfigure.java
class SaTokenConfigure (line 18) | @Configuration
method setSaTokenTemplateModel (line
Condensed preview — 1492 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,563K chars).
[
{
"path": ".agents/skills/README.md",
"chars": 2382,
"preview": "# Agent Skills\n\n本目录存放用于辅助 Sa-Token 项目开发的 Agent Skills。这些 skills 封装了项目特定的知识和操作规范,可在对话中直接调用。\n\n## Skill 列表\n\n| Skill 名称 | 功能"
},
{
"path": ".agents/skills/commit-message/SKILL.md",
"chars": 2363,
"preview": "---\nname: commit-message\ndescription: 根据 git 变更生成符合 Sa-Token 项目风格的 commit message。遵循 Conventional Commits 格式,以中文为主。当用户要求"
},
{
"path": ".agents/skills/commit-message/examples.md",
"chars": 1535,
"preview": "# Commit Message 示例\n\n基于 Sa-Token 项目近期提交整理,遵循 Conventional Commits + 50/72 规则。\n\n## feat - 新增功能\n\n```\nfeat: 添加 sa-token-jac"
},
{
"path": ".agents/skills/commit-message/reference.md",
"chars": 611,
"preview": "# Commit Message 规范参考\n\n基于 Conventional Commits 与业界最佳实践整理。\n\n## 核心规则\n\n| 规则 | 说明 |\n|------|------|\n| 50 字规则 | subject 不超过 5"
},
{
"path": ".agents/skills/organize-update-log/SKILL.md",
"chars": 2588,
"preview": "---\nname: organize-update-log\ndescription: 根据 git 提交记录生成符合 Sa-Token 项目规范的更新日志内容。适用于分析指定版本之后的提交、提取变更并格式化为 update-log.md 风"
},
{
"path": ".agents/skills/organize-update-log/format-reference.md",
"chars": 2676,
"preview": "# 更新日志格式参考\n\n本文档提供 `sa-token-doc/more/update-log.md` 的格式细节与示例,供生成更新日志时参考。\n\n## 版本标题格式\n\n```markdown\n### v1.44.0 @2025-6-7\n`"
},
{
"path": ".agents/skills/remove-redundancy-import/SKILL.md",
"chars": 1639,
"preview": "---\nname: remove-redundancy-import\ndescription: 检查 Java 类中未被引用的冗余 import 并移除。先输出待审阅计划,用户确认后执行。适用于用户要求清理冗余导包、优化 import、或执"
},
{
"path": ".agents/skills/remove-redundancy-import/reference.md",
"chars": 1312,
"preview": "# 冗余 import 检测规则\n\n## 解析步骤\n\n### 1. 提取 package\n\n匹配 `package\\s+([\\w.]+)\\s*;`,得到当前文件所在包。\n\n### 2. 提取 import\n\n匹配以下模式(每行一条):\n\n-"
},
{
"path": ".agents/skills/remove-redundancy-import/scan_redundant_imports.py",
"chars": 2991,
"preview": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"\n冗余 import 扫描脚本\n按 reference.md 规则扫描项目内 Java 文件,输出待移除的冗余 import 列表。\n用法:"
},
{
"path": ".agents/skills/upgrade-version/SKILL.md",
"chars": 2177,
"preview": "---\nname: upgrade-version\ndescription: 将 Sa-Token 项目版本号升级到指定新版本。每次调用时先读取当前版本并提示用户,待用户输入目标版本后再执行批量修改。修改范围:pom.xml、核心常量、De"
},
{
"path": ".gitee/ISSUE_TEMPLATE.md",
"chars": 72,
"preview": "请在以下地址复制 issue 模板进行提交:\nhttps://sa-token.cc/doc.html#/fun/issue-template\n"
},
{
"path": ".github/ISSUE_TEMPLATE/bug反馈.md",
"chars": 178,
"preview": "---\nname: bug反馈\nabout: 当你明确框架存在 bug 时,选择这个模板提交\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n### 使用版本:\n\n\n### 报错信息:\n\n\n### 希望结果"
},
{
"path": ".github/ISSUE_TEMPLATE/功能提问.md",
"chars": 121,
"preview": "---\nname: 功能提问\nabout: 对框架的某个功能看不明白时,选择这个模板提交\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n### 对以下问题有疑问:\n\n\n< 备注:请尽量详细描述问题所在 >"
},
{
"path": ".github/ISSUE_TEMPLATE/建议增加新功能.md",
"chars": 140,
"preview": "---\nname: 建议增加新功能\nabout: 当你有一个好 idea 时,选择这个模板提交\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n### 建议增加的新功能:\n\n\n### 应用场景阐述:\n\n\n<"
},
{
"path": ".github/ISSUE_TEMPLATE/预期不符.md",
"chars": 214,
"preview": "---\nname: 预期不符\nabout: 当框架的运行结果和你的预期不一致时,选择这个模板提交\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n### 使用版本:\n\n\n### 涉及的功能模块:\n\n\n###"
},
{
"path": ".gitignore",
"chars": 188,
"preview": "target/\n\nnode_modules/\nbin/\n.settings/\nunpackage/\n.classpath\n.project\n*.iml\n\n.factorypath\n/.factorypath\n\n.idea/\n.vscode/"
},
{
"path": "LICENSE",
"chars": 11346,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "MEMO/1--统一定义properties尝试失败.md",
"chars": 1995,
"preview": "\n## 未完成目标\n\t\n\t\n### 1、尝试将所有 `<properties>` 依赖版本号定义在同一个 pom.xml 里。 **[❌失败]**\n\n**尝试1:将所有 `<properties>` 定义在 `sa-token-depend"
},
{
"path": "MEMO/2--2026-3-1_诡异调试记录.txt",
"chars": 2287,
"preview": "\n2026-3-1 调试记录\n\n启动 SaOAuth2ServerApplication,报错空指针:SaOAuth2ServerController 文件的 SaOAuth2Strategy.instance.notLoginView 空"
},
{
"path": "MEMO/3--sa-token_最新版所有依赖.txt",
"chars": 10924,
"preview": " <!-- sa-token-bom -->\n <dependency>\n <groupId>cn.dev33</groupId>\n <artifactId>sa-to"
},
{
"path": "README.md",
"chars": 10994,
"preview": "<p align=\"center\">\n\t<img alt=\"logo\" src=\"https://sa-token.cc/logo.png\" width=\"150\" height=\"150\">\n</p>\n<h1 align=\"center\""
},
{
"path": "mvn clean.bat",
"chars": 3063,
"preview": "\n:: 整体clean\ncall mvn clean\n\n\n:: demo模块clean\ncd sa-token-demo\n\ncd sa-token-demo-alone-redis & call mvn clean & cd ..\ncd s"
},
{
"path": "mvn test.bat",
"chars": 103,
"preview": "\n:: 整体test\ncall mvn clean test\n\n\n:: 最后打印\necho;\necho;\necho ----------- test end ----------- \necho;\npause"
},
{
"path": "pom.xml",
"chars": 6663,
"preview": "<?xml version='1.0' encoding='utf-8'?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\txmlns:xsi=\"http://www.w3.org/"
},
{
"path": "preview-doc.bat",
"chars": 115,
"preview": ":: 运行前需要安装 browser-sync: \n:: npm install -g browser-sync\n\ncd sa-token-doc & browser-sync start --server --files \"\"\n"
},
{
"path": "sa-token-bom/pom.xml",
"chars": 16078,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\txmlns:xsi=\"http://www.w3.org/"
},
{
"path": "sa-token-core/pom.xml",
"chars": 792,
"preview": "<?xml version='1.0' encoding='utf-8'?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\txmlns:xsi=\"http://www.w3.org/"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/SaManager.java",
"chars": 10174,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckDisable.java",
"chars": 1516,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckHttpBasic.java",
"chars": 1334,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckHttpDigest.java",
"chars": 1490,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckLogin.java",
"chars": 1140,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckOr.java",
"chars": 1991,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckPermission.java",
"chars": 1668,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckRole.java",
"chars": 1291,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckSafe.java",
"chars": 1291,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaIgnore.java",
"chars": 1082,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaMode.java",
"chars": 786,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaAnnotationHandlerInterface.java",
"chars": 1362,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaCheckDisableHandler.java",
"chars": 1572,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaCheckHttpBasicHandler.java",
"chars": 1370,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaCheckHttpDigestHandler.java",
"chars": 2051,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaCheckLoginHandler.java",
"chars": 1376,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaCheckOrHandler.java",
"chars": 3277,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaCheckPermissionHandler.java",
"chars": 2232,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaCheckRoleHandler.java",
"chars": 1620,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaCheckSafeHandler.java",
"chars": 1399,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/annotation/handler/SaIgnoreHandler.java",
"chars": 1287,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/application/ApplicationInfo.java",
"chars": 1189,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/application/SaApplication.java",
"chars": 2573,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/application/SaGetValueInterface.java",
"chars": 3346,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/application/SaSetValueInterface.java",
"chars": 1763,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/config/SaCookieConfig.java",
"chars": 4185,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java",
"chars": 22497,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfigFactory.java",
"chars": 3387,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/context/SaHolder.java",
"chars": 1891,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/context/SaTokenContext.java",
"chars": 1812,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/context/SaTokenContextDefaultImpl.java",
"chars": 2413,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/context/SaTokenContextForReadOnly.java",
"chars": 1209,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/context/SaTokenContextForThreadLocal.java",
"chars": 1689,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/context/SaTokenContextForThreadLocalStaff.java",
"chars": 2646,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/context/mock/SaRequestForMock.java",
"chars": 2838,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/context/mock/SaResponseForMock.java",
"chars": 1639,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/context/mock/SaStorageForMock.java",
"chars": 1422,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/context/mock/SaTokenContextMockUtil.java",
"chars": 1913,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaCookie.java",
"chars": 6782,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaRequest.java",
"chars": 4129,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaResponse.java",
"chars": 2435,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaStorage.java",
"chars": 1126,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaTokenContextModelBox.java",
"chars": 1103,
"preview": "package cn.dev33.satoken.context.model;\n\n/**\n * Box 盒子类,用于存储 [ SaRequest、SaResponse、SaStorage ] 三个包装对象\n *\n * @author cli"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/context/model/package-info.java",
"chars": 776,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/dao/SaTokenDao.java",
"chars": 4246,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/dao/SaTokenDaoDefaultImpl.java",
"chars": 2526,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/dao/auto/SaTokenDaoByObjectFollowString.java",
"chars": 2520,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/dao/auto/SaTokenDaoBySessionFollowObject.java",
"chars": 2156,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/dao/auto/SaTokenDaoByStringFollowObject.java",
"chars": 1453,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/dao/timedcache/SaMapPackage.java",
"chars": 1095,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/dao/timedcache/SaMapPackageForConcurrentHashMap.java",
"chars": 1300,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/dao/timedcache/SaTimedCache.java",
"chars": 4573,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/error/SaErrorCode.java",
"chars": 3570,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/exception/ApiDisabledException.java",
"chars": 1216,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/exception/BackResultException.java",
"chars": 1088,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/exception/DisableServiceException.java",
"chars": 2549,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/exception/FirewallCheckException.java",
"chars": 1081,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/exception/InvalidContextException.java",
"chars": 1070,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/exception/NotHttpBasicAuthException.java",
"chars": 1056,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/exception/NotHttpDigestAuthException.java",
"chars": 1064,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/exception/NotImplException.java",
"chars": 988,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/exception/NotLoginException.java",
"chars": 3336,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/exception/NotPermissionException.java",
"chars": 1465,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/exception/NotRoleException.java",
"chars": 1390,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/exception/NotSafeException.java",
"chars": 1760,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/exception/NotWebContextException.java",
"chars": 1017,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/exception/RequestPathInvalidException.java",
"chars": 1113,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/exception/SaJsonConvertException.java",
"chars": 990,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/exception/SaTokenContextException.java",
"chars": 1058,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/exception/SaTokenException.java",
"chars": 2949,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/exception/SaTokenPluginException.java",
"chars": 1298,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/exception/SameTokenInvalidException.java",
"chars": 1012,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/exception/StopMatchException.java",
"chars": 969,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/exception/TotpAuthException.java",
"chars": 1023,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/filter/SaFilter.java",
"chars": 1952,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/filter/SaFilterAuthStrategy.java",
"chars": 863,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/filter/SaFilterErrorStrategy.java",
"chars": 1020,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/fun/IsRunFunction.java",
"chars": 1301,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/fun/SaFunction.java",
"chars": 809,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/fun/SaParamFunction.java",
"chars": 842,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/fun/SaParamRetFunction.java",
"chars": 870,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/fun/SaRetFunction.java",
"chars": 833,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/fun/SaRetGenericFunction.java",
"chars": 842,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/fun/SaRouteFunction.java",
"chars": 1068,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/fun/SaTwoParamFunction.java",
"chars": 877,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/fun/hooks/SaTokenPluginHookFunction.java",
"chars": 943,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaAutoRenewFunction.java",
"chars": 948,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaCheckELRootMapExtendFunction.java",
"chars": 928,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaCheckElementAnnotationFunction.java",
"chars": 965,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaCheckMethodAnnotationFunction.java",
"chars": 947,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaCheckOrAnnotationFunction.java",
"chars": 956,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaCorsHandleFunction.java",
"chars": 1141,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaCreateSessionFunction.java",
"chars": 956,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaCreateStpLogicFunction.java",
"chars": 952,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaCreateTokenFunction.java",
"chars": 912,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaFirewallCheckFailHandleFunction.java",
"chars": 1160,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaFirewallCheckFunction.java",
"chars": 1045,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaGenerateUniqueTokenFunction.java",
"chars": 1444,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaGetAnnotationFunction.java",
"chars": 1033,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaHasElementFunction.java",
"chars": 940,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaIsAnnotationPresentFunction.java",
"chars": 1030,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/fun/strategy/SaRouteMatchFunction.java",
"chars": 906,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/http/SaHttpTemplate.java",
"chars": 994,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/http/SaHttpTemplateDefaultImpl.java",
"chars": 1334,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/http/SaHttpUtil.java",
"chars": 1179,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/httpauth/basic/SaHttpBasicAccount.java",
"chars": 2187,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/httpauth/basic/SaHttpBasicTemplate.java",
"chars": 2826,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/httpauth/basic/SaHttpBasicUtil.java",
"chars": 1784,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/httpauth/digest/SaHttpDigestModel.java",
"chars": 6572,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/httpauth/digest/SaHttpDigestTemplate.java",
"chars": 9817,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/httpauth/digest/SaHttpDigestUtil.java",
"chars": 2387,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/json/SaJsonTemplate.java",
"chars": 1374,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/json/SaJsonTemplateDefaultImpl.java",
"chars": 1589,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenEventCenter.java",
"chars": 7977,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListener.java",
"chars": 3535,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListenerForLog.java",
"chars": 4315,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/listener/SaTokenListenerForSimple.java",
"chars": 1969,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/log/SaLog.java",
"chars": 1495,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/log/SaLogForConsole.java",
"chars": 3751,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/model/wrapperInfo/SaDisableWrapperInfo.java",
"chars": 3087,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/plugin/SaTokenPlugin.java",
"chars": 822,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginHolder.java",
"chars": 11097,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/plugin/SaTokenPluginHookModel.java",
"chars": 1227,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/router/SaHttpMethod.java",
"chars": 1950,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/router/SaRouter.java",
"chars": 8013,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/router/SaRouterStaff.java",
"chars": 6467,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/same/SaSameTemplate.java",
"chars": 4264,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/same/SaSameUtil.java",
"chars": 2204,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/secure/BCrypt.java",
"chars": 28710,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/secure/SaBase32Util.java",
"chars": 3515,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/secure/SaBase64Util.java",
"chars": 1710,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/secure/SaSecureUtil.java",
"chars": 13516,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/secure/totp/SaTotpTemplate.java",
"chars": 5001,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/secure/totp/SaTotpUtil.java",
"chars": 2781,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/serializer/SaSerializerTemplate.java",
"chars": 1412,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/serializer/impl/SaSerializerTemplateForJdk.java",
"chars": 2173,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/serializer/impl/SaSerializerTemplateForJdkUseBase64.java",
"chars": 1056,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/serializer/impl/SaSerializerTemplateForJdkUseHex.java",
"chars": 1047,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/serializer/impl/SaSerializerTemplateForJdkUseISO_8859_1.java",
"chars": 1095,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/serializer/impl/SaSerializerTemplateForJson.java",
"chars": 1561,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/session/SaSession.java",
"chars": 11275,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/session/SaSessionCustomUtil.java",
"chars": 2966,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/session/SaTerminalInfo.java",
"chars": 4819,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/session/raw/SaRawSessionDelegator.java",
"chars": 1797,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/session/raw/SaRawSessionUtil.java",
"chars": 2563,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginConfig.java",
"chars": 3270,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/stp/SaLoginModel.java",
"chars": 896,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/stp/SaTokenInfo.java",
"chars": 5216,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/stp/StpInterface.java",
"chars": 1548,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/stp/StpInterfaceDefaultImpl.java",
"chars": 1139,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/stp/StpLogic.java",
"chars": 81582,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/stp/StpUtil.java",
"chars": 32164,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/stp/parameter/SaLoginParameter.java",
"chars": 14410,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/stp/parameter/SaLogoutParameter.java",
"chars": 5592,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/stp/parameter/enums/SaLogoutMode.java",
"chars": 837,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/stp/parameter/enums/SaLogoutRange.java",
"chars": 852,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/stp/parameter/enums/SaReplacedLoginExitMode.java",
"chars": 877,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/stp/parameter/enums/SaReplacedRange.java",
"chars": 824,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/strategy/SaAnnotationStrategy.java",
"chars": 4816,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/strategy/SaFirewallStrategy.java",
"chars": 3357,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/strategy/SaStrategy.java",
"chars": 6068,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/strategy/hooks/SaFirewallCheckHook.java",
"chars": 1048,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/strategy/hooks/SaFirewallCheckHookForBlackPath.java",
"chars": 1917,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/strategy/hooks/SaFirewallCheckHookForDirectoryTraversal.java",
"chars": 3608,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/strategy/hooks/SaFirewallCheckHookForHeader.java",
"chars": 1978,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/strategy/hooks/SaFirewallCheckHookForHost.java",
"chars": 2136,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/strategy/hooks/SaFirewallCheckHookForHttpMethod.java",
"chars": 2722,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/strategy/hooks/SaFirewallCheckHookForParameter.java",
"chars": 2023,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/strategy/hooks/SaFirewallCheckHookForPathBannedCharacter.java",
"chars": 2065,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/strategy/hooks/SaFirewallCheckHookForPathDangerCharacter.java",
"chars": 2411,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/strategy/hooks/SaFirewallCheckHookForWhitePath.java",
"chars": 1865,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/temp/SaTempTemplate.java",
"chars": 8578,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
},
{
"path": "sa-token-core/src/main/java/cn/dev33/satoken/temp/SaTempUtil.java",
"chars": 3311,
"preview": "/*\n * Copyright 2020-2099 sa-token.cc\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may n"
}
]
// ... and 1292 more files (download for full content)
About this extraction
This page contains the full source code of the dromara/Sa-Token GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1492 files (4.8 MB), approximately 1.4M tokens, and a symbol index with 7953 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.