From 6592b625233efa2e6ecfe7827700d850fbd3145e Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Fri, 21 Oct 2022 11:27:29 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=96=87=E6=A1=A3..?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitee/ISSUE_TEMPLATE.md | 2 +- .github/ISSUE_TEMPLATE.md | 2 +- README.md | 43 +++++---- .../dev33/satoken/config/SaTokenConfig.java | 2 +- .../cn/dev33/satoken/util/SaTokenConsts.java | 2 +- .../sa-token-demo-alone-redis/pom.xml | 2 +- sa-token-demo/sa-token-demo-case/pom.xml | 2 +- sa-token-demo/sa-token-demo-jwt/pom.xml | 2 +- .../sa-token-demo-oauth2-client/pom.xml | 2 +- .../src/main/resources/templates/index.html | 2 +- .../sa-token-demo-oauth2-server/pom.xml | 2 +- .../sa-token-demo-quick-login/pom.xml | 2 +- sa-token-demo/sa-token-demo-solon/pom.xml | 2 +- .../sa-token-demo-springboot-redis/pom.xml | 2 +- .../sa-token-demo-springboot/pom.xml | 2 +- .../sa-token-demo-sso-server-h5/login.js | 2 +- .../sa-token-demo-sso-server/pom.xml | 2 +- .../src/main/resources/static/sa-res/login.js | 2 +- .../sa-token-demo-sso1-client/pom.xml | 2 +- .../sa-token-demo-sso2-client/pom.xml | 2 +- .../sa-token-demo-sso3-client/pom.xml | 2 +- sa-token-demo/sa-token-demo-test/pom.xml | 2 +- .../src/main/resources/application.yml | 2 +- sa-token-demo/sa-token-demo-thymeleaf/pom.xml | 2 +- sa-token-demo/sa-token-demo-webflux/pom.xml | 2 +- .../sa-token-demo-websocket-spring/pom.xml | 2 +- sa-token-demo/sa-token-demo-websocket/pom.xml | 2 +- sa-token-doc/README.md | 88 ++++++++++--------- sa-token-doc/doc.html | 4 +- sa-token-doc/index.html | 8 +- sa-token-doc/micro/gateway-auth.md | 4 +- sa-token-doc/micro/id-token.md | 8 +- sa-token-doc/micro/import-intro.md | 8 +- sa-token-doc/oauth2/oauth2-server.md | 6 +- sa-token-doc/sso/sso-server.md | 4 +- sa-token-doc/sso/sso-type1.md | 4 +- sa-token-doc/sso/sso-type2.md | 4 +- sa-token-doc/start/download.md | 18 ++-- sa-token-doc/start/example.md | 11 ++- sa-token-doc/start/new-version.md | 4 +- sa-token-doc/start/webflux-example.md | 4 +- sa-token-doc/use/config.md | 6 +- .../src/main/resources/static/sa-res/login.js | 2 +- .../core/context/model/SaCookieTest.java | 6 +- .../satoken/core/util/SaFoxUtilTest.java | 42 ++++----- 45 files changed, 167 insertions(+), 159 deletions(-) diff --git a/.gitee/ISSUE_TEMPLATE.md b/.gitee/ISSUE_TEMPLATE.md index 17b29a20..8c2f41de 100644 --- a/.gitee/ISSUE_TEMPLATE.md +++ b/.gitee/ISSUE_TEMPLATE.md @@ -1,2 +1,2 @@ 请在以下地址复制 issue 模板进行提交: -https://sa-token.dev33.cn/doc.html#/fun/issue-template +https://sa-token.cc/doc.html#/fun/issue-template diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 17b29a20..8c2f41de 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,2 +1,2 @@ 请在以下地址复制 issue 模板进行提交: -https://sa-token.dev33.cn/doc.html#/fun/issue-template +https://sa-token.cc/doc.html#/fun/issue-template diff --git a/README.md b/README.md index 5ae7d794..f1f2d1f4 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

- logo + logo

Sa-Token v1.31.0

一个轻量级 Java 权限认证框架,让鉴权变得简单、优雅!

@@ -16,7 +16,7 @@ --- ## 前言: -- [在线文档:http://sa-token.dev33.cn/](http://sa-token.dev33.cn/) +- [在线文档:https://sa-token.cc](https://sa-token.cc) - 注:学习测试请拉取 master 分支,dev 为正在开发的分支,有很多特性并不稳定。 @@ -27,26 +27,33 @@ **Sa-Token** 是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。 -登录认证示例: +Sa-Token 旨在以简单、优雅的方式完成系统的权限认证部分,以登录认证为例,你只需要: ``` java -// 会话登录:参数指定在当前客户端登录的账号id +// 会话登录,参数填登录人的账号id StpUtil.login(10001); - -// 会话校验:在需要校验登录处调用以下方法,如果会话未登录会抛出 `NotLoginException` 异常 -StpUtil.checkLogin(); - -// 会话注销:在当前客户端退出已登录的会话 -StpUtil.logout(); ``` -踢人下线: +无需实现任何接口,无需创建任何配置文件,只需要这一句静态代码的调用,便可以完成会话登录认证。 + +如果一个接口需要登录后才能访问,我们只需调用以下代码: + +``` java +// 校验当前客户端是否已经登录,如果未登录则抛出 `NotLoginException` 异常 +StpUtil.checkLogin(); +``` + +在 Sa-Token 中,大多数功能都可以一行代码解决: + +踢人下线示例: + ``` java // 将账号id为 10077 的会话踢下线 StpUtil.kickout(10077); ``` -权限认证示例: +权限认证: + ``` java // 注解鉴权:只有具备 `user:add` 权限的会话才可以进入方法 @SaCheckPermission("user:add") @@ -70,6 +77,8 @@ registry.addInterceptor(new SaInterceptor(handler -> { })).addPathPatterns("/**"); ``` +当你受够 Shiro、SpringSecurity 等框架的三拜九叩之后,你就会明白,相对于这些传统老牌框架,Sa-Token 的 API 设计是多么的简单、优雅! + ## Sa-Token 功能模块一览 @@ -115,13 +124,13 @@ Sa-Token-SSO 由简入难划分为三种模式,解决不同架构下的 SSO | 系统架构 | 采用模式 | 简介 | 文档链接 | | :-------- | :-------- | :-------- | :-------- | -| 前端同域 + 后端同 Redis | 模式一 | 共享Cookie同步会话 | [文档](http://sa-token.dev33.cn/doc.html#/sso/sso-type1)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso1-client) | -| 前端不同域 + 后端同 Redis | 模式二 | URL重定向传播会话 | [文档](http://sa-token.dev33.cn/doc.html#/sso/sso-type2)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso2-client) | -| 前端不同域 + 后端 不同Redis | 模式三 | Http请求获取会话 | [文档](http://sa-token.dev33.cn/doc.html#/sso/sso-type3)、[示例](https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-sso3-client) | +| 前端同域 + 后端同 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。PS:这里并不需要把所有项目的数据都放在同一个Redis中,Sa-Token提供了 **`[权限缓存与业务缓存分离]`** 的解决方案,详情戳:[Alone独立Redis插件](http://sa-token.dev33.cn/doc.html#/plugin/alone-redis) +2. 后端同Redis:就是指多个系统可以连接同一个Redis。PS:这里并不需要把所有项目的数据都放在同一个Redis中,Sa-Token提供了 **`[权限缓存与业务缓存分离]`** 的解决方案,详情戳:[Alone独立Redis插件](https://sa-token.cc/doc.html#/plugin/alone-redis) 3. 如果既无法做到前端同域,也无法做到后端同Redis,那么只能走模式三,Http请求获取会话(Sa-Token对SSO提供了完整的封装,你只需要按照示例从文档上复制几段代码便可以轻松集成) ## Sa-Token-OAuth2 授权认证 @@ -134,7 +143,7 @@ Sa-OAuth2 模块分为四种授权模式,解决不同场景下的授权需求 | 密码式(Password) | Client直接拿着用户的账号密码换取授权 Token | | 客户端凭证(Client Credentials)| Server 端针对 Client 级别的 Token,代表应用自身的资源授权 | -详细参考文档:[http://sa-token.dev33.cn/doc.html#/oauth2/readme](http://sa-token.dev33.cn/doc.html#/oauth2/readme) +详细参考文档:[https://sa-token.cc/doc.html#/oauth2/readme](https://sa-token.cc/doc.html#/oauth2/readme) ## 使用 Sa-Token 的开源项目 diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java index 48b6ac71..068a4eb2 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java @@ -5,7 +5,7 @@ import java.io.Serializable; /** * Sa-Token 配置类 Model *

- * 你可以通过yml、properties、java代码等形式配置本类参数,具体请查阅官方文档: http://sa-token.dev33.cn/ + * 你可以通过yml、properties、java代码等形式配置本类参数,具体请查阅官方文档: https://sa-token.cc/ * * @author kong * diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenConsts.java b/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenConsts.java index ad45165d..59af034c 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenConsts.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenConsts.java @@ -30,7 +30,7 @@ public class SaTokenConsts { /** * Sa-Token 开发文档地址 */ - public static final String DEV_DOC_URL = "http://sa-token.dev33.cn"; + public static final String DEV_DOC_URL = "https://sa-token.cc"; // =================== 常量key标记 =================== diff --git a/sa-token-demo/sa-token-demo-alone-redis/pom.xml b/sa-token-demo/sa-token-demo-alone-redis/pom.xml index 4770482a..18112cde 100644 --- a/sa-token-demo/sa-token-demo-alone-redis/pom.xml +++ b/sa-token-demo/sa-token-demo-alone-redis/pom.xml @@ -31,7 +31,7 @@ spring-boot-starter-aop - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-case/pom.xml b/sa-token-demo/sa-token-demo-case/pom.xml index ed81e8c5..fc713fb2 100644 --- a/sa-token-demo/sa-token-demo-case/pom.xml +++ b/sa-token-demo/sa-token-demo-case/pom.xml @@ -32,7 +32,7 @@ spring-boot-starter-aop - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-jwt/pom.xml b/sa-token-demo/sa-token-demo-jwt/pom.xml index dac7baec..d0b5b6a0 100644 --- a/sa-token-demo/sa-token-demo-jwt/pom.xml +++ b/sa-token-demo/sa-token-demo-jwt/pom.xml @@ -27,7 +27,7 @@ spring-boot-starter-web - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-oauth2-client/pom.xml b/sa-token-demo/sa-token-demo-oauth2-client/pom.xml index 6aa42c0b..eef67c6e 100644 --- a/sa-token-demo/sa-token-demo-oauth2-client/pom.xml +++ b/sa-token-demo/sa-token-demo-oauth2-client/pom.xml @@ -28,7 +28,7 @@ spring-boot-starter-web - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-oauth2-client/src/main/resources/templates/index.html b/sa-token-demo/sa-token-demo-oauth2-client/src/main/resources/templates/index.html index 9d5b3121..9bcfde53 100644 --- a/sa-token-demo/sa-token-demo-oauth2-client/src/main/resources/templates/index.html +++ b/sa-token-demo/sa-token-demo-oauth2-client/src/main/resources/templates/index.html @@ -91,7 +91,7 @@

更多资料请参考 Sa-Token 官方文档地址: - http://sa-token.dev33.cn/ + https://sa-token.cc/

diff --git a/sa-token-demo/sa-token-demo-oauth2-server/pom.xml b/sa-token-demo/sa-token-demo-oauth2-server/pom.xml index 0acb237b..a4e8beb9 100644 --- a/sa-token-demo/sa-token-demo-oauth2-server/pom.xml +++ b/sa-token-demo/sa-token-demo-oauth2-server/pom.xml @@ -28,7 +28,7 @@ spring-boot-starter-web - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-quick-login/pom.xml b/sa-token-demo/sa-token-demo-quick-login/pom.xml index 2d1a05ac..42e01ad3 100644 --- a/sa-token-demo/sa-token-demo-quick-login/pom.xml +++ b/sa-token-demo/sa-token-demo-quick-login/pom.xml @@ -27,7 +27,7 @@ spring-boot-starter-web - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-solon/pom.xml b/sa-token-demo/sa-token-demo-solon/pom.xml index 970ddb34..26c88b5c 100644 --- a/sa-token-demo/sa-token-demo-solon/pom.xml +++ b/sa-token-demo/sa-token-demo-solon/pom.xml @@ -21,7 +21,7 @@ 1.10.4 - + cn.dev33 sa-token-solon-plugin diff --git a/sa-token-demo/sa-token-demo-springboot-redis/pom.xml b/sa-token-demo/sa-token-demo-springboot-redis/pom.xml index 2fefd3c9..49fa16a4 100644 --- a/sa-token-demo/sa-token-demo-springboot-redis/pom.xml +++ b/sa-token-demo/sa-token-demo-springboot-redis/pom.xml @@ -32,7 +32,7 @@ spring-boot-starter-aop - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-springboot/pom.xml b/sa-token-demo/sa-token-demo-springboot/pom.xml index f52afcb2..b5fdd415 100644 --- a/sa-token-demo/sa-token-demo-springboot/pom.xml +++ b/sa-token-demo/sa-token-demo-springboot/pom.xml @@ -32,7 +32,7 @@ spring-boot-starter-aop - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-sso-server-h5/login.js b/sa-token-demo/sa-token-demo-sso-server-h5/login.js index 0b87ab7c..e43a4f48 100644 --- a/sa-token-demo/sa-token-demo-sso-server-h5/login.js +++ b/sa-token-demo/sa-token-demo-sso-server-h5/login.js @@ -98,5 +98,5 @@ function getParam(name, defaultValue){ } // 打印信息 -var str = "This page is provided by Sa-Token, Please refer to: " + "http://sa-token.dev33.cn/"; +var str = "This page is provided by Sa-Token, Please refer to: " + "https://sa-token.cc/"; console.log(str); diff --git a/sa-token-demo/sa-token-demo-sso-server/pom.xml b/sa-token-demo/sa-token-demo-sso-server/pom.xml index ce7fd481..8f8fcea6 100644 --- a/sa-token-demo/sa-token-demo-sso-server/pom.xml +++ b/sa-token-demo/sa-token-demo-sso-server/pom.xml @@ -27,7 +27,7 @@ spring-boot-starter-web - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-sso-server/src/main/resources/static/sa-res/login.js b/sa-token-demo/sa-token-demo-sso-server/src/main/resources/static/sa-res/login.js index f581ee78..e474f430 100644 --- a/sa-token-demo/sa-token-demo-sso-server/src/main/resources/static/sa-res/login.js +++ b/sa-token-demo/sa-token-demo-sso-server/src/main/resources/static/sa-res/login.js @@ -61,5 +61,5 @@ $('[name=name],[name=pwd]').bind('keypress', function(event){ $("[name=name]").focus(); // 打印信息 -var str = "This page is provided by Sa-Token, Please refer to: " + "http://sa-token.dev33.cn/"; +var str = "This page is provided by Sa-Token, Please refer to: " + "https://sa-token.cc/"; console.log(str); diff --git a/sa-token-demo/sa-token-demo-sso1-client/pom.xml b/sa-token-demo/sa-token-demo-sso1-client/pom.xml index 3d02ec19..afac6355 100644 --- a/sa-token-demo/sa-token-demo-sso1-client/pom.xml +++ b/sa-token-demo/sa-token-demo-sso1-client/pom.xml @@ -27,7 +27,7 @@ spring-boot-starter-web - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-sso2-client/pom.xml b/sa-token-demo/sa-token-demo-sso2-client/pom.xml index 2c0ec337..5aa3882c 100644 --- a/sa-token-demo/sa-token-demo-sso2-client/pom.xml +++ b/sa-token-demo/sa-token-demo-sso2-client/pom.xml @@ -27,7 +27,7 @@ spring-boot-starter-web - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-sso3-client/pom.xml b/sa-token-demo/sa-token-demo-sso3-client/pom.xml index dabc819d..365eaa7c 100644 --- a/sa-token-demo/sa-token-demo-sso3-client/pom.xml +++ b/sa-token-demo/sa-token-demo-sso3-client/pom.xml @@ -27,7 +27,7 @@ spring-boot-starter-web - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-test/pom.xml b/sa-token-demo/sa-token-demo-test/pom.xml index d8db946a..b4c7e569 100644 --- a/sa-token-demo/sa-token-demo-test/pom.xml +++ b/sa-token-demo/sa-token-demo-test/pom.xml @@ -32,7 +32,7 @@ spring-boot-starter-aop - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-test/src/main/resources/application.yml b/sa-token-demo/sa-token-demo-test/src/main/resources/application.yml index cb63067a..b38fe0af 100644 --- a/sa-token-demo/sa-token-demo-test/src/main/resources/application.yml +++ b/sa-token-demo/sa-token-demo-test/src/main/resources/application.yml @@ -2,7 +2,7 @@ server: port: 8081 -# sa-token配置 +############## Sa-Token 配置 (文档: https://sa-token.cc) ############## sa-token: # token名称 (同时也是cookie名称) token-name: satoken diff --git a/sa-token-demo/sa-token-demo-thymeleaf/pom.xml b/sa-token-demo/sa-token-demo-thymeleaf/pom.xml index e11b5134..de1c725d 100644 --- a/sa-token-demo/sa-token-demo-thymeleaf/pom.xml +++ b/sa-token-demo/sa-token-demo-thymeleaf/pom.xml @@ -37,7 +37,7 @@ spring-boot-starter-thymeleaf - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-webflux/pom.xml b/sa-token-demo/sa-token-demo-webflux/pom.xml index 784bb3e0..e3f7d5ad 100644 --- a/sa-token-demo/sa-token-demo-webflux/pom.xml +++ b/sa-token-demo/sa-token-demo-webflux/pom.xml @@ -31,7 +31,7 @@ spring-boot-starter-aop - + cn.dev33 sa-token-reactor-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-websocket-spring/pom.xml b/sa-token-demo/sa-token-demo-websocket-spring/pom.xml index e9f4a5e4..5978ac6b 100644 --- a/sa-token-demo/sa-token-demo-websocket-spring/pom.xml +++ b/sa-token-demo/sa-token-demo-websocket-spring/pom.xml @@ -38,7 +38,7 @@ spring-boot-starter-websocket - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-demo/sa-token-demo-websocket/pom.xml b/sa-token-demo/sa-token-demo-websocket/pom.xml index f64edcf6..558905e6 100644 --- a/sa-token-demo/sa-token-demo-websocket/pom.xml +++ b/sa-token-demo/sa-token-demo-websocket/pom.xml @@ -38,7 +38,7 @@ spring-boot-starter-websocket - + cn.dev33 sa-token-spring-boot-starter diff --git a/sa-token-doc/README.md b/sa-token-doc/README.md index 83c6b963..a3b1e62a 100644 --- a/sa-token-doc/README.md +++ b/sa-token-doc/README.md @@ -1,5 +1,5 @@

- logo + logo

Sa-Token v1.31.0

一个轻量级 Java 权限认证框架,让鉴权变得简单、优雅!
@@ -16,7 +16,7 @@ --- ## 前言:️️ -为了保证新同学不迷路,请允许我唠叨一下:无论您从何处看到本篇文章,最新开发文档永远在:[http://sa-token.dev33.cn/](http://sa-token.dev33.cn/), +为了保证新同学不迷路,请允许我唠叨一下:无论您从何处看到本篇文章,最新开发文档永远在:[https://sa-token.cc](https://sa-token.cc), 建议收藏在浏览器书签,如果您已经身处本网站下,则请忽略此条说明。 本文档将会尽力讲解每个功能的设计原因、应用场景,用心阅读文档,你学习到的将不止是 `Sa-Token` 框架本身,更是绝大多数场景下权限设计的最佳实践。 @@ -27,71 +27,68 @@ **Sa-Token** 是一个轻量级 Java 权限认证框架,主要解决:**登录认证**、**权限认证**、**单点登录**、**OAuth2.0**、**分布式Session会话**、**微服务网关鉴权** 等一系列权限相关问题。 -Sa-Token 的 API 设计非常简单,有多简单呢?以登录认证为例,你只需要: +Sa-Token 旨在以简单、优雅的方式完成系统的权限认证部分,以登录认证为例,你只需要: ``` java -// 在登录时写入当前会话的账号id +// 会话登录,参数填登录人的账号id StpUtil.login(10001); +``` -// 然后在需要校验登录处调用以下方法: -// 如果当前会话未登录,这句代码会抛出 `NotLoginException` 异常 +无需实现任何接口,无需创建任何配置文件,只需要这一句静态代码的调用,便可以完成会话登录认证。 + +如果一个接口需要登录后才能访问,我们只需调用以下代码: + +``` java +// 校验当前客户端是否已经登录,如果未登录则抛出 `NotLoginException` 异常 StpUtil.checkLogin(); ``` -至此,我们已经借助 Sa-Token 完成登录认证! +在 Sa-Token 中,大多数功能都可以一行代码解决: -此时的你小脑袋可能飘满了问号,就这么简单?自定义 Realm 呢?全局过滤器呢?我不用写各种配置文件吗? +踢人下线示例: -没错,在 Sa-Token 中,登录认证就是如此简单,不需要任何的复杂前置工作,只需这一行简单的API调用,就可以完成会话登录认证! - -当你受够 Shiro、SpringSecurity 等框架的三拜九叩之后,你就会明白,相对于这些传统老牌框架,Sa-Token 的 API 设计是多么的简单、优雅! - -权限认证示例(只有具备 `user:add` 权限的会话才可以进入请求) ``` java +// 将账号id为 10077 的会话踢下线 +StpUtil.kickout(10077); +``` + +权限认证: + +``` java +// 注解鉴权:只有具备 `user:add` 权限的会话才可以进入方法 @SaCheckPermission("user:add") -@RequestMapping("/user/insert") public String insert(SysUser user) { - // ... - return "用户增加"; + // ... + return "用户增加"; } ``` -将某个账号踢下线(待到对方再次访问系统时会抛出`NotLoginException`异常) +路由拦截鉴权: + ``` java -// 将账号id为 10001 的会话踢下线 -StpUtil.kickout(10001); +// 根据路由划分模块,不同模块不同鉴权 +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("/**"); ``` -在 Sa-Token 中,绝大多数功能都可以 **一行代码** 完成: -``` java -StpUtil.login(10001); // 标记当前会话登录的账号id -StpUtil.getLoginId(); // 获取当前会话登录的账号id -StpUtil.isLogin(); // 获取当前会话是否已经登录, 返回true或false -StpUtil.logout(); // 当前会话注销登录 -StpUtil.kickout(10001); // 将账号为10001的会话踢下线 -StpUtil.hasRole("super-admin"); // 查询当前账号是否含有指定角色标识, 返回true或false -StpUtil.hasPermission("user:add"); // 查询当前账号是否含有指定权限, 返回true或false -StpUtil.getSession(); // 获取当前账号id的Session -StpUtil.getSessionByLoginId(10001); // 获取账号id为10001的Session -StpUtil.getTokenValueByLoginId(10001); // 获取账号id为10001的token令牌值 -StpUtil.login(10001, "PC"); // 指定设备类型登录,常用于“同端互斥登录” -StpUtil.kickout(10001, "PC"); // 指定账号指定设备类型踢下线 (不同端不受影响) -StpUtil.openSafe(120); // 在当前会话开启二级认证,有效期为120秒 -StpUtil.checkSafe(); // 校验当前会话是否处于二级认证有效期内,校验失败会抛出异常 -StpUtil.switchTo(10044); // 将当前会话身份临时切换为其它账号 -``` - -即使不运行测试,相信您也能意会到绝大多数 API 的用法。 - +当你受够 Shiro、SpringSecurity 等框架的三拜九叩之后,你就会明白,相对于这些传统老牌框架,Sa-Token 的 API 设计是多么的简单、优雅! ## Sa-Token 功能一览 +Sa-Token 目前主要五大功能模块:登录认证、权限认证、单点登录、OAuth2.0、微服务鉴权。 + - **登录认证** —— 单端登录、多端登录、同端互斥登录、七天内免登录 - **权限认证** —— 权限认证、角色认证、会话二级认证 - **Session会话** —— 全端共享Session、单端独享Session、自定义Session - **踢人下线** —— 根据账号id踢人下线、根据Token值踢人下线 -- **账号封禁** —— 指定天数封禁、永久封禁、设定解封时间 +- **账号封禁** —— 登录封禁、按照业务分类封禁、按照处罚阶梯封禁 - **持久层扩展** —— 可集成Redis、Memcached等专业缓存中间件,重启数据不丢失 - **分布式会话** —— 提供jwt集成、共享数据中心两种分布式会话方案 - **微服务网关鉴权** —— 适配Gateway、ShenYu、Zuul等常见网关的路由拦截认证 @@ -100,13 +97,13 @@ StpUtil.switchTo(10044); // 将当前会话身份临时切换为其它账号 - **二级认证** —— 在已登录的基础上再次认证,保证安全性 - **Basic认证** —— 一行代码接入 Http Basic 认证 - **独立Redis** —— 将权限缓存与业务缓存分离 -- **临时Token验证** —— 解决短时间的Token授权问题 +- **临时Token认证** —— 解决短时间的Token授权问题 - **模拟他人账号** —— 实时操作任意用户状态数据 - **临时身份切换** —— 将会话身份临时切换为其它账号 - **前后台分离** —— APP、小程序等不支持Cookie的终端 - **同端互斥登录** —— 像QQ一样手机电脑同时在线,但是两个手机上互斥登录 - **多账号认证体系** —— 比如一个商城项目的user表和admin表分开鉴权 -- **花式token生成** —— 内置六种Token风格,还可:自定义Token生成策略、自定义Token前缀 +- **Token风格定制** —— 内置六种Token风格,还可:自定义Token生成策略、自定义Token前缀 - **注解式鉴权** —— 优雅的将鉴权与业务代码分离 - **路由拦截式鉴权** —— 根据路由拦截鉴权,可适配restful模式 - **自动续签** —— 提供两种Token过期策略,灵活搭配使用,还可自动续签 @@ -117,6 +114,10 @@ StpUtil.switchTo(10044); // 将当前会话身份临时切换为其它账号 - **开箱即用** —— 提供SpringMVC、WebFlux等常见web框架starter集成包,真正的开箱即用 - **更多功能正在集成中...** —— 如有您有好想法或者建议,欢迎加群交流 +功能结构图: + +![sa-token-js](https://color-test.oss-cn-qingdao.aliyuncs.com/sa-token/x/sa-token-js4.png 's-w') + ## 开源仓库 Star 趋势 @@ -133,6 +134,7 @@ StpUtil.switchTo(10044); // 将当前会话身份临时切换为其它账号 参考:[Sa-Token 生态](/more/link) + ## 交流群 QQ交流群:614714762 [点击加入](https://jq.qq.com/?_wv=1027&k=F96A2mrl) diff --git a/sa-token-doc/doc.html b/sa-token-doc/doc.html index 32e5c236..6190bbf7 100644 --- a/sa-token-doc/doc.html +++ b/sa-token-doc/doc.html @@ -246,8 +246,8 @@ diff --git a/sa-token-doc/index.html b/sa-token-doc/index.html index 4f62bf9f..826e9f58 100644 --- a/sa-token-doc/index.html +++ b/sa-token-doc/index.html @@ -360,7 +360,7 @@ - + @@ -533,7 +533,7 @@ @@ -655,8 +655,8 @@ diff --git a/sa-token-doc/micro/gateway-auth.md b/sa-token-doc/micro/gateway-auth.md index fc2308db..aa9c8a01 100644 --- a/sa-token-doc/micro/gateway-auth.md +++ b/sa-token-doc/micro/gateway-auth.md @@ -17,7 +17,7 @@ ``` xml - + cn.dev33 sa-token-reactor-spring-boot-starter @@ -37,7 +37,7 @@ ``` ``` gradle -// Sa-Token 权限认证(Reactor响应式集成),在线文档:http://sa-token.dev33.cn/ +// Sa-Token 权限认证(Reactor响应式集成),在线文档:https://sa-token.cc implementation 'cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}' // Sa-Token 整合 Redis (使用 jackson 序列化方式) diff --git a/sa-token-doc/micro/id-token.md b/sa-token-doc/micro/id-token.md index 95c0c098..187e33a9 100644 --- a/sa-token-doc/micro/id-token.md +++ b/sa-token-doc/micro/id-token.md @@ -26,7 +26,7 @@ Sa-Token提供两种解决方案: ``` xml - + cn.dev33 sa-token-reactor-spring-boot-starter @@ -46,7 +46,7 @@ Sa-Token提供两种解决方案: ``` ``` gradle -// Sa-Token 权限认证(Reactor响应式集成),在线文档:http://sa-token.dev33.cn/ +// Sa-Token 权限认证(Reactor响应式集成),在线文档:https://sa-token.cc implementation 'cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}' // Sa-Token 整合 Redis (使用 jackson 序列化方式) @@ -59,7 +59,7 @@ implementation 'org.apache.commons:commons-pool2' ``` xml - + cn.dev33 sa-token-spring-boot-starter @@ -79,7 +79,7 @@ implementation 'org.apache.commons:commons-pool2' ``` ``` gradle -// Sa-Token 权限认证,在线文档:http://sa-token.dev33.cn/ +// Sa-Token 权限认证,在线文档:https://sa-token.cc implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' // Sa-Token 整合 Redis (使用 jackson 序列化方式) diff --git a/sa-token-doc/micro/import-intro.md b/sa-token-doc/micro/import-intro.md index 3de0327c..72389e39 100644 --- a/sa-token-doc/micro/import-intro.md +++ b/sa-token-doc/micro/import-intro.md @@ -12,7 +12,7 @@ ``` xml - + cn.dev33 sa-token-spring-boot-starter @@ -21,7 +21,7 @@ ``` ``` gradle -// Sa-Token 权限认证,在线文档:http://sa-token.dev33.cn/ +// Sa-Token 权限认证,在线文档:https://sa-token.cc implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' ``` @@ -29,7 +29,7 @@ implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' ``` xml - + cn.dev33 sa-token-reactor-spring-boot-starter @@ -38,7 +38,7 @@ implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' ``` ``` gradle -// Sa-Token 权限认证(Reactor响应式集成),在线文档:http://sa-token.dev33.cn/ +// Sa-Token 权限认证(Reactor响应式集成),在线文档:https://sa-token.cc implementation 'cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}' ``` diff --git a/sa-token-doc/oauth2/oauth2-server.md b/sa-token-doc/oauth2/oauth2-server.md index e4fc2e88..688d656d 100644 --- a/sa-token-doc/oauth2/oauth2-server.md +++ b/sa-token-doc/oauth2/oauth2-server.md @@ -16,7 +16,7 @@ ``` xml - + cn.dev33 sa-token-spring-boot-starter @@ -32,7 +32,7 @@ ``` ``` gradle -// Sa-Token 权限认证,在线文档:http://sa-token.dev33.cn/ +// Sa-Token 权限认证,在线文档:https://sa-token.cc implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' // Sa-Token-OAuth2.0 模块 @@ -154,7 +154,7 @@ public class SaOAuth2ServerApplication { 1、由于暂未搭建Client端,我们可以使用Sa-Token官网作为重定向URL进行测试: ``` url -http://sa-oauth-server.com:8001/oauth2/authorize?response_type=code&client_id=1001&redirect_uri=http://sa-token.dev33.cn/&scope=userinfo +http://sa-oauth-server.com:8001/oauth2/authorize?response_type=code&client_id=1001&redirect_uri=https://sa-token.cc&scope=userinfo ``` 2、由于首次访问,我们在OAuth-Server端暂未登录,会被转发到登录视图 diff --git a/sa-token-doc/sso/sso-server.md b/sa-token-doc/sso/sso-server.md index 7588c5e9..3814b582 100644 --- a/sa-token-doc/sso/sso-server.md +++ b/sa-token-doc/sso/sso-server.md @@ -12,7 +12,7 @@ ``` xml - + cn.dev33 sa-token-spring-boot-starter @@ -52,7 +52,7 @@ ``` ``` gradle -// Sa-Token 权限认证,在线文档:http://sa-token.dev33.cn/ +// Sa-Token 权限认证,在线文档:https://sa-token.cc implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' // Sa-Token 插件:整合SSO diff --git a/sa-token-doc/sso/sso-type1.md b/sa-token-doc/sso/sso-type1.md index 441d551f..87520f57 100644 --- a/sa-token-doc/sso/sso-type1.md +++ b/sa-token-doc/sso/sso-type1.md @@ -73,7 +73,7 @@ sa-token.cookie.domain=stp.com ``` xml - + cn.dev33 sa-token-spring-boot-starter @@ -106,7 +106,7 @@ sa-token.cookie.domain=stp.com ``` ``` gradle -// Sa-Token 权限认证,在线文档:http://sa-token.dev33.cn/ +// Sa-Token 权限认证,在线文档:https://sa-token.cc implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' // Sa-Token 插件:整合SSO diff --git a/sa-token-doc/sso/sso-type2.md b/sa-token-doc/sso/sso-type2.md index 159b9be9..9cbfe3be 100644 --- a/sa-token-doc/sso/sso-type2.md +++ b/sa-token-doc/sso/sso-type2.md @@ -72,7 +72,7 @@ sa-token.cookie.domain=stp.com ``` xml - + cn.dev33 sa-token-spring-boot-starter @@ -105,7 +105,7 @@ sa-token.cookie.domain=stp.com ``` ``` gradle -// Sa-Token 权限认证,在线文档:http://sa-token.dev33.cn/ +// Sa-Token 权限认证,在线文档:https://sa-token.cc implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' // Sa-Token 插件:整合SSO diff --git a/sa-token-doc/start/download.md b/sa-token-doc/start/download.md index 045efb0a..54b5e19d 100644 --- a/sa-token-doc/start/download.md +++ b/sa-token-doc/start/download.md @@ -12,7 +12,7 @@ 如果你使用的框架基于 ServletAPI 构建( SpringMVC、SpringBoot等 ),请引入此包 ``` xml - + cn.dev33 sa-token-spring-boot-starter @@ -23,7 +23,7 @@ 注:如果你使用的框架基于 Reactor 模型构建(Netty、WebFlux、ShenYu、SC Gateway等),请引入此包 ``` xml - + cn.dev33 sa-token-reactor-spring-boot-starter @@ -34,7 +34,7 @@ 参考:[Solon官网](https://solon.noear.org/) ``` xml - + cn.dev33 sa-token-solon-plugin @@ -45,7 +45,7 @@ 参考:[JFinal官网](https://jfinal.com/) ``` xml - + cn.dev33 sa-token-jfinal-plugin @@ -56,7 +56,7 @@ 参考:[Jboot官网](http://www.jboot.com.cn/) ``` xml - + cn.dev33 sa-token-jboot-plugin @@ -67,7 +67,7 @@ 参考:[quarkus-sa-token](https://github.com/quarkiverse/quarkus-sa-token) ``` xml - + io.quarkiverse.satoken quarkus-satoken-resteasy @@ -78,7 +78,7 @@ 注:如果你的项目没有使用Spring,但是Web框架是基于 ServletAPI 规范的,可以引入此包 ``` xml - + cn.dev33 sa-token-servlet @@ -90,7 +90,7 @@ 注:如果你的项目既没有使用 SpringMVC、WebFlux,也不是基于 ServletAPI 规范,那么可以引入core核心包 ``` xml - + cn.dev33 sa-token-core @@ -152,7 +152,7 @@ implementation 'cn.dev33:sa-token-core:${sa.top.version}' ## 测试版 更多内测版本了解:[Sa-Token 最新版本](https://gitee.com/dromara/sa-token/blob/dev/sa-token-doc/start/new-version.md) -Maven依赖一直无法加载成功?[参考解决方案](https://sa-token.dev33.cn/doc.html#/start/maven-pull) +Maven依赖一直无法加载成功?[参考解决方案](https://sa-token.cc/doc.html#/start/maven-pull) ## jar包下载 [点击下载:sa-token-1.6.0.jar](https://oss.dev33.cn/sa-token/sa-token-1.6.0.jar) diff --git a/sa-token-doc/start/example.md b/sa-token-doc/start/example.md index 889995b2..ebafc551 100644 --- a/sa-token-doc/start/example.md +++ b/sa-token-doc/start/example.md @@ -16,7 +16,7 @@ ``` xml - + cn.dev33 sa-token-spring-boot-starter @@ -25,16 +25,15 @@ ``` ``` gradle -// Sa-Token 权限认证,在线文档:http://sa-token.dev33.cn/ +// Sa-Token 权限认证,在线文档:https://sa-token.cc implementation 'cn.dev33:sa-token-spring-boot-starter:${sa.top.version}' ``` +Maven依赖一直无法加载成功?[参考解决方案](https://sa-token.cc/doc.html#/start/maven-pull) 更多内测版本了解:[Sa-Token最新版本](https://gitee.com/dromara/sa-token/blob/dev/sa-token-doc/start/new-version.md) -Maven依赖一直无法加载成功?[参考解决方案](https://sa-token.dev33.cn/doc.html#/start/maven-pull) - ### 3、设置配置文件 你可以**零配置启动项目** ,但同时你也可以在 `application.yml` 中增加如下配置,定制性使用框架: @@ -46,7 +45,7 @@ server: # 端口 port: 8081 -############## Sa-Token 配置 ############## +############## Sa-Token 配置 (文档: https://sa-token.cc) ############## sa-token: # token名称 (同时也是cookie名称) token-name: satoken @@ -69,7 +68,7 @@ sa-token: # 端口 server.port=8081 -############## Sa-Token 配置 ############## +############## Sa-Token 配置 (文档: https://sa-token.cc) ############## # token名称 (同时也是cookie名称) sa-token.token-name=satoken diff --git a/sa-token-doc/start/new-version.md b/sa-token-doc/start/new-version.md index 1c4fc906..477e5649 100644 --- a/sa-token-doc/start/new-version.md +++ b/sa-token-doc/start/new-version.md @@ -1,6 +1,6 @@ # Sa-Token 最新版本 -在线文档:[https://sa-token.dev33.cn/](https://sa-token.dev33.cn/) +在线文档:[https://sa-token.cc/](https://sa-token.cc/) --- @@ -16,7 +16,7 @@ v1.31.0 正式版,可上生产: ``` -Maven依赖一直无法加载成功?[参考解决方案](https://sa-token.dev33.cn/doc.html#/start/maven-pull) +Maven依赖一直无法加载成功?[参考解决方案](https://sa-token.cc/doc.html#/start/maven-pull) --- diff --git a/sa-token-doc/start/webflux-example.md b/sa-token-doc/start/webflux-example.md index 0c46033a..435c4ec6 100644 --- a/sa-token-doc/start/webflux-example.md +++ b/sa-token-doc/start/webflux-example.md @@ -19,7 +19,7 @@ ``` xml - + cn.dev33 sa-token-reactor-spring-boot-starter @@ -28,7 +28,7 @@ ``` ``` gradle -// Sa-Token 权限认证(Reactor响应式集成),在线文档:http://sa-token.dev33.cn/ +// Sa-Token 权限认证(Reactor响应式集成),在线文档:https://sa-token.cc implementation 'cn.dev33:sa-token-reactor-spring-boot-starter:${sa.top.version}' ``` diff --git a/sa-token-doc/use/config.md b/sa-token-doc/use/config.md index 40db73b8..4464305f 100644 --- a/sa-token-doc/use/config.md +++ b/sa-token-doc/use/config.md @@ -10,8 +10,7 @@ ``` yaml -############## Sa-Token 配置 ############## -############## 在线参考:https://sa-token.dev33.cn/doc.html#/use/config ############## +############## Sa-Token 配置 (文档: https://sa-token.cc) ############## sa-token: # token名称 (同时也是cookie名称) token-name: satoken @@ -31,8 +30,7 @@ sa-token: ``` properties -############## Sa-Token 配置 ############## -############## 在线参考:https://sa-token.dev33.cn/doc.html#/use/config ############## +############## Sa-Token 配置 (文档: https://sa-token.cc) ############## # token名称 (同时也是cookie名称) sa-token.token-name=satoken diff --git a/sa-token-plugin/sa-token-quick-login/src/main/resources/static/sa-res/login.js b/sa-token-plugin/sa-token-quick-login/src/main/resources/static/sa-res/login.js index 5e619d17..5d79d67a 100644 --- a/sa-token-plugin/sa-token-quick-login/src/main/resources/static/sa-res/login.js +++ b/sa-token-plugin/sa-token-quick-login/src/main/resources/static/sa-res/login.js @@ -61,5 +61,5 @@ $('[name=name],[name=pwd]').bind('keypress', function(event){ $("[name=name]").focus(); // 打印信息 -var str = "This page is provided by Sa-Token, Please refer to: " + "http://sa-token.dev33.cn/"; +var str = "This page is provided by Sa-Token, Please refer to: " + "https://sa-token.cc/"; console.log(str); diff --git a/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/context/model/SaCookieTest.java b/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/context/model/SaCookieTest.java index 8c223cab..207135f1 100644 --- a/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/context/model/SaCookieTest.java +++ b/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/context/model/SaCookieTest.java @@ -16,7 +16,7 @@ public class SaCookieTest { @Test public void test() { SaCookie cookie = new SaCookie("satoken", "xxxx-xxxx-xxxx-xxxx") - .setDomain("https://sa-token.dev33.cn/") + .setDomain("https://sa-token.cc/") .setMaxAge(-1) .setPath("/") .setSameSite("Lax") @@ -25,13 +25,13 @@ public class SaCookieTest { Assertions.assertEquals(cookie.getName(), "satoken"); Assertions.assertEquals(cookie.getValue(), "xxxx-xxxx-xxxx-xxxx"); - Assertions.assertEquals(cookie.getDomain(), "https://sa-token.dev33.cn/"); + Assertions.assertEquals(cookie.getDomain(), "https://sa-token.cc/"); Assertions.assertEquals(cookie.getMaxAge(), -1); Assertions.assertEquals(cookie.getPath(), "/"); Assertions.assertEquals(cookie.getSameSite(), "Lax"); Assertions.assertEquals(cookie.getHttpOnly(), true); Assertions.assertEquals(cookie.getSecure(), true); - Assertions.assertEquals(cookie.toHeaderValue(), "satoken=xxxx-xxxx-xxxx-xxxx; Domain=https://sa-token.dev33.cn/; Path=/; Secure; HttpOnly; sameSite=Lax"); + Assertions.assertEquals(cookie.toHeaderValue(), "satoken=xxxx-xxxx-xxxx-xxxx; Domain=https://sa-token.cc/; Path=/; Secure; HttpOnly; sameSite=Lax"); Assertions.assertNotNull(cookie.toString()); } diff --git a/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/util/SaFoxUtilTest.java b/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/util/SaFoxUtilTest.java index f8e7baa6..ad9abb05 100644 --- a/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/util/SaFoxUtilTest.java +++ b/sa-token-test/sa-token-springboot-test/src/test/java/cn/dev33/satoken/core/util/SaFoxUtilTest.java @@ -166,49 +166,49 @@ public class SaFoxUtilTest { @Test public void joinParam() { // 参数为空时,返回原url - Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn", null), "https://sa-token.dev33.cn"); - Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn", ""), "https://sa-token.dev33.cn"); + Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc", null), "https://sa-token.cc"); + Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc", ""), "https://sa-token.cc"); // url为空时,视为空字符串 Assertions.assertEquals(SaFoxUtil.joinParam(null, "id=1"), "?id=1"); Assertions.assertEquals(SaFoxUtil.joinParam("", "id=1"), "?id=1"); // 各种情况的测试 - Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn", "id=1"), "https://sa-token.dev33.cn?id=1"); - Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn?", "id=1"), "https://sa-token.dev33.cn?id=1"); - Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn?name=zhang", "id=1"), "https://sa-token.dev33.cn?name=zhang&id=1"); - Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn?name=zhang&", "id=1"), "https://sa-token.dev33.cn?name=zhang&id=1"); + Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc", "id=1"), "https://sa-token.cc?id=1"); + Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc?", "id=1"), "https://sa-token.cc?id=1"); + Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc?name=zhang", "id=1"), "https://sa-token.cc?name=zhang&id=1"); + Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc?name=zhang&", "id=1"), "https://sa-token.cc?name=zhang&id=1"); // 重载方法测试 - Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn?name=zhang&", "id", 1), "https://sa-token.dev33.cn?name=zhang&id=1"); + Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc?name=zhang&", "id", 1), "https://sa-token.cc?name=zhang&id=1"); // url或key为null时,不拼接 Assertions.assertEquals(SaFoxUtil.joinParam(null, "id", 1), null); - Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn", null, 1), "https://sa-token.dev33.cn"); + Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc", null, 1), "https://sa-token.cc"); // value为null时,会拼接出一个null字符串 - Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.dev33.cn", "id", null), "https://sa-token.dev33.cn?id=null"); + Assertions.assertEquals(SaFoxUtil.joinParam("https://sa-token.cc", "id", null), "https://sa-token.cc?id=null"); } @Test public void joinSharpParam() { // 参数为空时,返回原url - Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn", null), "https://sa-token.dev33.cn"); - Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn", ""), "https://sa-token.dev33.cn"); + Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc", null), "https://sa-token.cc"); + Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc", ""), "https://sa-token.cc"); // url为空时,视为空字符串 Assertions.assertEquals(SaFoxUtil.joinSharpParam(null, "id=1"), "#id=1"); Assertions.assertEquals(SaFoxUtil.joinSharpParam("", "id=1"), "#id=1"); // 各种情况的测试 - Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn", "id=1"), "https://sa-token.dev33.cn#id=1"); - Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn#", "id=1"), "https://sa-token.dev33.cn#id=1"); - Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn#name=zhang", "id=1"), "https://sa-token.dev33.cn#name=zhang&id=1"); - Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn#name=zhang&", "id=1"), "https://sa-token.dev33.cn#name=zhang&id=1"); + Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc", "id=1"), "https://sa-token.cc#id=1"); + Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc#", "id=1"), "https://sa-token.cc#id=1"); + Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc#name=zhang", "id=1"), "https://sa-token.cc#name=zhang&id=1"); + Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc#name=zhang&", "id=1"), "https://sa-token.cc#name=zhang&id=1"); // 重载方法测试 - Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn#name=zhang&", "id", 1), "https://sa-token.dev33.cn#name=zhang&id=1"); + Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc#name=zhang&", "id", 1), "https://sa-token.cc#name=zhang&id=1"); // url或key为null时,不拼接 Assertions.assertEquals(SaFoxUtil.joinSharpParam(null, "id", 1), null); - Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn", null, 1), "https://sa-token.dev33.cn"); + Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc", null, 1), "https://sa-token.cc"); // value为null时,会拼接出一个null字符串 - Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.dev33.cn", "id", null), "https://sa-token.dev33.cn#id=null"); + Assertions.assertEquals(SaFoxUtil.joinSharpParam("https://sa-token.cc", "id", null), "https://sa-token.cc#id=null"); } @Test @@ -233,7 +233,7 @@ public class SaFoxUtilTest { @Test public void isUrl() { - Assertions.assertTrue(SaFoxUtil.isUrl("https://sa-token.dev33.cn")); + Assertions.assertTrue(SaFoxUtil.isUrl("https://sa-token.cc")); Assertions.assertTrue(SaFoxUtil.isUrl("https://www.baidu.com/")); Assertions.assertFalse(SaFoxUtil.isUrl(null)); @@ -246,8 +246,8 @@ public class SaFoxUtilTest { @Test public void encodeUrl() { - Assertions.assertEquals(SaFoxUtil.encodeUrl("https://sa-token.dev33.cn"), "https%3A%2F%2Fsa-token.dev33.cn"); - Assertions.assertEquals(SaFoxUtil.decoderUrl("https%3A%2F%2Fsa-token.dev33.cn"), "https://sa-token.dev33.cn"); + Assertions.assertEquals(SaFoxUtil.encodeUrl("https://sa-token.cc"), "https%3A%2F%2Fsa-token.cc"); + Assertions.assertEquals(SaFoxUtil.decoderUrl("https%3A%2F%2Fsa-token.cc"), "https://sa-token.cc"); } @Test