mirror of
https://gitee.com/dromara/sa-token.git
synced 2026-02-27 16:50:24 +08:00
代码添加行号
This commit is contained in:
@@ -21,38 +21,38 @@
|
|||||||
|
|
||||||
|
|
||||||
``` java
|
``` java
|
||||||
// 全局异常拦截(拦截项目中的NotLoginException异常)
|
// 全局异常拦截(拦截项目中的NotLoginException异常)
|
||||||
@ExceptionHandler(NotLoginException.class)
|
@ExceptionHandler(NotLoginException.class)
|
||||||
public AjaxJson handlerNotLoginException(NotLoginException nle, HttpServletRequest request, HttpServletResponse response)
|
public AjaxJson handlerNotLoginException(NotLoginException nle, HttpServletRequest request, HttpServletResponse response)
|
||||||
throws Exception {
|
throws Exception {
|
||||||
|
|
||||||
// 打印堆栈,以供调试
|
// 打印堆栈,以供调试
|
||||||
nle.printStackTrace();
|
nle.printStackTrace();
|
||||||
|
|
||||||
// 判断场景值,定制化异常信息
|
// 判断场景值,定制化异常信息
|
||||||
String message = "";
|
String message = "";
|
||||||
if(nle.getType().equals(NotLoginException.NOT_TOKEN)) {
|
if(nle.getType().equals(NotLoginException.NOT_TOKEN)) {
|
||||||
message = "未提供token";
|
message = "未提供token";
|
||||||
}
|
|
||||||
else if(nle.getType().equals(NotLoginException.INVALID_TOKEN)) {
|
|
||||||
message = "token无效";
|
|
||||||
}
|
|
||||||
else if(nle.getType().equals(NotLoginException.TOKEN_TIMEOUT)) {
|
|
||||||
message = "token已过期";
|
|
||||||
}
|
|
||||||
else if(nle.getType().equals(NotLoginException.BE_REPLACED)) {
|
|
||||||
message = "token已被顶下线";
|
|
||||||
}
|
|
||||||
else if(nle.getType().equals(NotLoginException.KICK_OUT)) {
|
|
||||||
message = "token已被踢下线";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
message = "当前会话未登录";
|
|
||||||
}
|
|
||||||
|
|
||||||
// 返回给前端
|
|
||||||
return AjaxJson.getError(message);
|
|
||||||
}
|
}
|
||||||
|
else if(nle.getType().equals(NotLoginException.INVALID_TOKEN)) {
|
||||||
|
message = "token无效";
|
||||||
|
}
|
||||||
|
else if(nle.getType().equals(NotLoginException.TOKEN_TIMEOUT)) {
|
||||||
|
message = "token已过期";
|
||||||
|
}
|
||||||
|
else if(nle.getType().equals(NotLoginException.BE_REPLACED)) {
|
||||||
|
message = "token已被顶下线";
|
||||||
|
}
|
||||||
|
else if(nle.getType().equals(NotLoginException.KICK_OUT)) {
|
||||||
|
message = "token已被踢下线";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
message = "当前会话未登录";
|
||||||
|
}
|
||||||
|
|
||||||
|
// 返回给前端
|
||||||
|
return AjaxJson.getError(message);
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
<br/>
|
<br/>
|
||||||
|
|||||||
@@ -34,10 +34,10 @@
|
|||||||
|
|
||||||
例如以下代码:
|
例如以下代码:
|
||||||
``` java
|
``` java
|
||||||
// 先检查是否已过期
|
// 先检查是否已过期
|
||||||
StpUtil.checkActivityTimeout();
|
StpUtil.checkActivityTimeout();
|
||||||
// 检查通过后继续续签
|
// 检查通过后继续续签
|
||||||
StpUtil.updateLastActivityToNow();
|
StpUtil.updateLastActivityToNow();
|
||||||
```
|
```
|
||||||
|
|
||||||
同时,你还可以关闭框架的自动续签(在配置文件中配置 `autoRenew=false` ),此时续签操作完全由开发者控制,框架不再自动进行任何续签操作
|
同时,你还可以关闭框架的自动续签(在配置文件中配置 `autoRenew=false` ),此时续签操作完全由开发者控制,框架不再自动进行任何续签操作
|
||||||
|
|||||||
@@ -77,8 +77,22 @@
|
|||||||
].join('');
|
].join('');
|
||||||
return html + footer;
|
return html + footer;
|
||||||
});
|
});
|
||||||
|
// 每次路由切换时数据全部加载完成后调用,没有参数。
|
||||||
|
hook.doneEach(function() {
|
||||||
|
$('pre code').each(function(){
|
||||||
|
var lines = $(this).text().split('\n').length;
|
||||||
|
var $numbering = $('<ul/>').addClass('code-line-box');
|
||||||
|
$(this)
|
||||||
|
.addClass('has-numbering')
|
||||||
|
.parent()
|
||||||
|
.append($numbering);
|
||||||
|
for(i=1;i<=lines;i++){
|
||||||
|
$numbering.append($('<li/>').text(i));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<script src="https://unpkg.zhimg.com/docsify@4.9.4/lib/docsify.min.js"></script>
|
<script src="https://unpkg.zhimg.com/docsify@4.9.4/lib/docsify.min.js"></script>
|
||||||
@@ -86,6 +100,8 @@
|
|||||||
<script src="https://unpkg.zhimg.com/prismjs@1.19.0/components/prism-java.min.js"></script>
|
<script src="https://unpkg.zhimg.com/prismjs@1.19.0/components/prism-java.min.js"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/docsify/lib/plugins/search.min.js"></script>
|
<script src="https://cdn.jsdelivr.net/npm/docsify/lib/plugins/search.min.js"></script>
|
||||||
|
|
||||||
|
<script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
|
||||||
|
|
||||||
<!-- 搜索引擎自动提交 -->
|
<!-- 搜索引擎自动提交 -->
|
||||||
<script>
|
<script>
|
||||||
(function() {
|
(function() {
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
/* 调整一下左侧树的样式 */
|
||||||
body{font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;}
|
body{font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;}
|
||||||
.logo-box {position: absolute;left: 30px;top: 10px;cursor: pointer;color: #000;}
|
.logo-box {position: absolute;left: 30px;top: 10px;cursor: pointer;color: #000;}
|
||||||
.logo-box img {width: 50px;height: 50px;vertical-align: middle;}
|
.logo-box img {width: 50px;height: 50px;vertical-align: middle;}
|
||||||
@@ -12,18 +13,18 @@ body{font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu
|
|||||||
.main-box .markdown-section{max-width: 1000px;}
|
.main-box .markdown-section{max-width: 1000px;}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 左侧树优化 */
|
/* 调整一下左侧树的字体样式 */
|
||||||
.sidebar .sidebar-nav>ul>li>p{font-size: 1.2em; margin-top: 10px;}
|
.sidebar .sidebar-nav>ul>li>p{font-size: 1.2em; margin-top: 10px;}
|
||||||
.sidebar ul li a{color: #222;}
|
.sidebar ul li a{color: #222;}
|
||||||
.sidebar .sidebar-nav>ul>li>ul>li>a{/* color: #222; */font-size: 16px; /* font-weight: 700; */}
|
.sidebar .sidebar-nav>ul>li>ul>li>a{/* color: #222; */font-size: 16px; /* font-weight: 700; */}
|
||||||
|
|
||||||
|
|
||||||
/* ============== 样式优化 ================ */
|
/* ============== 代码样式优化 ================ */
|
||||||
|
|
||||||
/* 背景变黑 */
|
/* 背景变黑 */
|
||||||
.main-box [data-lang]{padding: 0px !important; border-radius: 8px; overflow: hidden;}
|
.main-box [data-lang]{padding: 0px !important; border-radius: 4px;overflow-x: auto; overflow-y: hidden;}
|
||||||
.main-box [class^="lang-"]{border: 0px red solid; padding: 1.5em 1.2em;/* background-color: #282828; */ background-color: #090300; color: #FFF;}
|
.main-box [v-pre] code{border: 0px red solid; border-radius: 0px; /* background-color: #282828; */ background-color: #111; color: #FFF;}
|
||||||
.main-box [data-lang]{overflow: auto;}
|
.main-box [v-pre] code{padding: 1.5em 1.3em; margin-left: 40px !important;}
|
||||||
/* .main-box h2{margin-top: 70px;} */
|
/* .main-box h2{margin-top: 70px;} */
|
||||||
|
|
||||||
/* xml语言样式优化 */
|
/* xml语言样式优化 */
|
||||||
@@ -32,7 +33,7 @@ body{font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu
|
|||||||
.lang-xml .token.attr-value{color: #A6E22E;}
|
.lang-xml .token.attr-value{color: #A6E22E;}
|
||||||
|
|
||||||
/* java语言样式优化 */
|
/* java语言样式优化 */
|
||||||
.main-box .lang-java{color: #01a252; opacity: 1;}
|
.main-box .lang-java{color: #01a252 !important;; opacity: 1;}
|
||||||
.lang-java .token.keyword{color: #db2d20;}
|
.lang-java .token.keyword{color: #db2d20;}
|
||||||
.lang-java .token.namespace,.lang-java .token.namespace *{color: #01A252; opacity: 1;}
|
.lang-java .token.namespace,.lang-java .token.namespace *{color: #01A252; opacity: 1;}
|
||||||
.lang-java .token.class-name,.lang-java .cm-variable{color: #55b5db; opacity: 1;}
|
.lang-java .token.class-name,.lang-java .cm-variable{color: #55b5db; opacity: 1;}
|
||||||
@@ -41,7 +42,7 @@ body{font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu
|
|||||||
.lang-java .token.punctuation{color: #ddd;}
|
.lang-java .token.punctuation{color: #ddd;}
|
||||||
|
|
||||||
/* js语言样式优化 */
|
/* js语言样式优化 */
|
||||||
.main-box .lang-js{color: #01a252;}
|
.main-box .lang-js{color: #01a252 !important;}
|
||||||
.lang-js .token.comment{color: #CDAB53;}
|
.lang-js .token.comment{color: #CDAB53;}
|
||||||
/* .lang-js .token.string{color: #fded02;} */
|
/* .lang-js .token.string{color: #fded02;} */
|
||||||
.lang-js .token.string{color: #ddd;}
|
.lang-js .token.string{color: #ddd;}
|
||||||
@@ -54,3 +55,9 @@ body{font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu
|
|||||||
@media screen and (min-width: 800px) {
|
@media screen and (min-width: 800px) {
|
||||||
#main table tr th{min-width: 150px;}
|
#main table tr th{min-width: 150px;}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 代码行号盒子样式 */
|
||||||
|
.code-line-box {list-style-type: none; border-right: 1px solid #000; position: absolute; top: 0; left: 0; width: 40px;}
|
||||||
|
.code-line-box {padding: calc(1.5em + 1px) 0px !important; padding-bottom: calc(1.5em + 20px) !important; margin: 0px !important;}
|
||||||
|
.code-line-box {line-height: inherit !important; background-color: #111; color: #aaa;font-weight: 400;font-size: 0.85em;text-align: center;}
|
||||||
|
.code-line-box {font-family: source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace;}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
#### 集成sa-token的开源项目:
|
#### 集成sa-token的开源项目:
|
||||||
|
|
||||||
[**[ sa-plus ]** 一个基于springboot架构的快速开发框架,内置代码生成器](https://gitee.com/sz6/sa-plus)
|
[[sa-plus] 一个基于springboot架构的快速开发框架,内置代码生成器](https://gitee.com/sz6/sa-plus)
|
||||||
|
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|||||||
@@ -30,34 +30,34 @@ sa-token内置两种模式完成注解鉴权,分别是`AOP模式`和`拦截器
|
|||||||
**登录验证**
|
**登录验证**
|
||||||
|
|
||||||
``` java
|
``` java
|
||||||
// 注解式鉴权:当前会话必须登录才能通过
|
// 注解式鉴权:当前会话必须登录才能通过
|
||||||
@SaCheckLogin
|
@SaCheckLogin
|
||||||
@RequestMapping("info")
|
@RequestMapping("info")
|
||||||
public String info() {
|
public String info() {
|
||||||
return "查询用户信息";
|
return "查询用户信息";
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
**角色验证**
|
**角色验证**
|
||||||
|
|
||||||
``` java
|
``` java
|
||||||
// 注解式鉴权:当前会话必须具有指定角色标识才能通过
|
// 注解式鉴权:当前会话必须具有指定角色标识才能通过
|
||||||
@SaCheckRole("super-admin")
|
@SaCheckRole("super-admin")
|
||||||
@RequestMapping("add")
|
@RequestMapping("add")
|
||||||
public String add() {
|
public String add() {
|
||||||
return "用户增加";
|
return "用户增加";
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
**权限验证**
|
**权限验证**
|
||||||
|
|
||||||
``` java
|
``` java
|
||||||
// 注解式鉴权:当前会话必须具有指定权限才能通过
|
// 注解式鉴权:当前会话必须具有指定权限才能通过
|
||||||
@SaCheckPermission("user-add")
|
@SaCheckPermission("user-add")
|
||||||
@RequestMapping("add")
|
@RequestMapping("add")
|
||||||
public String add() {
|
public String add() {
|
||||||
return "用户增加";
|
return "用户增加";
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
注:以上两个注解都可以加在类上,代表为这个类所有方法进行鉴权
|
注:以上两个注解都可以加在类上,代表为这个类所有方法进行鉴权
|
||||||
@@ -66,12 +66,12 @@ sa-token内置两种模式完成注解鉴权,分别是`AOP模式`和`拦截器
|
|||||||
#### 设定校验模式
|
#### 设定校验模式
|
||||||
`@SaCheckRole`与`@SaCheckPermission`注解可设置校验模式,例如:
|
`@SaCheckRole`与`@SaCheckPermission`注解可设置校验模式,例如:
|
||||||
``` java
|
``` java
|
||||||
// 注解式鉴权:只要具有其中一个权限即可通过校验
|
// 注解式鉴权:只要具有其中一个权限即可通过校验
|
||||||
@RequestMapping("atJurOr")
|
@RequestMapping("atJurOr")
|
||||||
@SaCheckPermission(value = {"user-add", "user-all", "user-delete"}, mode = SaMode.OR)
|
@SaCheckPermission(value = {"user-add", "user-all", "user-delete"}, mode = SaMode.OR)
|
||||||
public AjaxJson atJurOr() {
|
public AjaxJson atJurOr() {
|
||||||
return AjaxJson.getSuccessData("用户信息");
|
return AjaxJson.getSuccessData("用户信息");
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
@@ -87,14 +87,14 @@ mode有两种取值:
|
|||||||
以`SpringBoot2.0`为例, 新建配置类`MySaTokenConfig.java`
|
以`SpringBoot2.0`为例, 新建配置类`MySaTokenConfig.java`
|
||||||
|
|
||||||
``` java
|
``` java
|
||||||
@Configuration
|
@Configuration
|
||||||
public class MySaTokenConfig implements WebMvcConfigurer {
|
public class MySaTokenConfig implements WebMvcConfigurer {
|
||||||
// 注册sa-token的注解拦截器,打开注解式鉴权功能
|
// 注册sa-token的注解拦截器,打开注解式鉴权功能
|
||||||
@Override
|
@Override
|
||||||
public void addInterceptors(InterceptorRegistry registry) {
|
public void addInterceptors(InterceptorRegistry registry) {
|
||||||
registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**");
|
registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**");
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
```
|
```
|
||||||
保证此类被`springboot`启动类扫描到即可
|
保证此类被`springboot`启动类扫描到即可
|
||||||
|
|
||||||
|
|||||||
@@ -31,27 +31,27 @@ spring:
|
|||||||
|
|
||||||
### 方式2、通过代码配置
|
### 方式2、通过代码配置
|
||||||
``` java
|
``` java
|
||||||
/**
|
/**
|
||||||
* sa-token代码方式进行配置
|
* sa-token代码方式进行配置
|
||||||
*/
|
*/
|
||||||
@Configuration
|
@Configuration
|
||||||
public class MySaTokenConfig {
|
public class MySaTokenConfig {
|
||||||
|
|
||||||
// 获取配置Bean (以代码的方式配置sa-token, 此配置会覆盖yml中的配置)
|
|
||||||
@Primary
|
|
||||||
@Bean(name="MySaTokenConfig")
|
|
||||||
public SaTokenConfig getSaTokenConfig() {
|
|
||||||
SaTokenConfig config = new SaTokenConfig();
|
|
||||||
config.setTokenName("satoken"); // token名称 (同时也是cookie名称)
|
|
||||||
config.setTimeout(30 * 24 * 60 * 60); // token有效期,单位s 默认30天
|
|
||||||
config.setActivityTimeout(-1); // token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
|
|
||||||
config.setAllowConcurrentLogin(true); // 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
|
|
||||||
config.setIsShare(true); // 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
|
|
||||||
config.setTokenStyle("uuid"); // token风格
|
|
||||||
return config;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// 获取配置Bean (以代码的方式配置sa-token, 此配置会覆盖yml中的配置)
|
||||||
|
@Primary
|
||||||
|
@Bean(name="MySaTokenConfig")
|
||||||
|
public SaTokenConfig getSaTokenConfig() {
|
||||||
|
SaTokenConfig config = new SaTokenConfig();
|
||||||
|
config.setTokenName("satoken"); // token名称 (同时也是cookie名称)
|
||||||
|
config.setTimeout(30 * 24 * 60 * 60); // token有效期,单位s 默认30天
|
||||||
|
config.setActivityTimeout(-1); // token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
|
||||||
|
config.setAllowConcurrentLogin(true); // 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
|
||||||
|
config.setIsShare(true); // 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
|
||||||
|
config.setTokenStyle("uuid"); // token风格
|
||||||
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -11,24 +11,24 @@ Sa-token默认将会话数据保存在内存中,此模式读写速度最快,
|
|||||||
### 1. sa-token 整合 Redis (使用jdk默认序列化方式)
|
### 1. sa-token 整合 Redis (使用jdk默认序列化方式)
|
||||||
(注意: 整合Redis只需要引入对应的pom依赖即可,所有上层API保持不变)
|
(注意: 整合Redis只需要引入对应的pom依赖即可,所有上层API保持不变)
|
||||||
``` xml
|
``` xml
|
||||||
<!-- sa-token整合redis (使用jdk默认序列化方式) -->
|
<!-- sa-token整合redis (使用jdk默认序列化方式) -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>cn.dev33</groupId>
|
<groupId>cn.dev33</groupId>
|
||||||
<artifactId>sa-token-dao-redis</artifactId>
|
<artifactId>sa-token-dao-redis</artifactId>
|
||||||
<version>1.13.0</version>
|
<version>1.13.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
优点:兼容性好,缺点:Session序列化后基本不可读,对开发者来讲等同于乱码
|
优点:兼容性好,缺点:Session序列化后基本不可读,对开发者来讲等同于乱码
|
||||||
|
|
||||||
|
|
||||||
### 2. sa-token 整合 Redis (使用jackson序列化方式)
|
### 2. sa-token 整合 Redis (使用jackson序列化方式)
|
||||||
``` xml
|
``` xml
|
||||||
<!-- sa-token整合redis (使用jackson序列化方式) -->
|
<!-- sa-token整合redis (使用jackson序列化方式) -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>cn.dev33</groupId>
|
<groupId>cn.dev33</groupId>
|
||||||
<artifactId>sa-token-dao-redis-jackson</artifactId>
|
<artifactId>sa-token-dao-redis-jackson</artifactId>
|
||||||
<version>1.13.0</version>
|
<version>1.13.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
优点:Session序列化后可读性强,可灵活手动修改,缺点:兼容性稍差
|
优点:Session序列化后可读性强,可灵活手动修改,缺点:兼容性稍差
|
||||||
|
|
||||||
@@ -37,11 +37,11 @@ Sa-token默认将会话数据保存在内存中,此模式读写速度最快,
|
|||||||
|
|
||||||
**请注意,无论使用哪种序列化方式,你都必须为项目提供一个Redis实例化方案,例如:**
|
**请注意,无论使用哪种序列化方式,你都必须为项目提供一个Redis实例化方案,例如:**
|
||||||
``` xml
|
``` xml
|
||||||
<!-- 提供redis连接池 -->
|
<!-- 提供redis连接池 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.commons</groupId>
|
<groupId>org.apache.commons</groupId>
|
||||||
<artifactId>commons-pool2</artifactId>
|
<artifactId>commons-pool2</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -48,7 +48,6 @@ StpUtil.getLoginIdDefaultNull();
|
|||||||
|
|
||||||
// 获取当前会话登录id, 如果未登录,则返回默认值 (`defaultValue`可以为任意类型)
|
// 获取当前会话登录id, 如果未登录,则返回默认值 (`defaultValue`可以为任意类型)
|
||||||
StpUtil.getLoginId(T defaultValue);
|
StpUtil.getLoginId(T defaultValue);
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -42,14 +42,14 @@
|
|||||||
很简单,我们只要更改一下 `StpUserUtil` 的 `TokenName` 即可,参考示例如下:
|
很简单,我们只要更改一下 `StpUserUtil` 的 `TokenName` 即可,参考示例如下:
|
||||||
|
|
||||||
``` java
|
``` java
|
||||||
// 底层的 StpLogic 对象
|
// 底层的 StpLogic 对象
|
||||||
public static StpLogic stpLogic = new StpLogic("login") {
|
public static StpLogic stpLogic = new StpLogic("login") {
|
||||||
// 重写 `getTokenName` 函数,返回一个与 `StpUtil` 不同的token名称, 防止冲突
|
// 重写 `getTokenName` 函数,返回一个与 `StpUtil` 不同的token名称, 防止冲突
|
||||||
@Override
|
@Override
|
||||||
public String getTokenName() {
|
public String getTokenName() {
|
||||||
return super.getKeyTokenName() + "-user";
|
return super.getKeyTokenName() + "-user";
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
再次调用 `StpUserUtil.setLoginId(10001)` 进行登录授权时,token的名称将不再是 `satoken`,而是我们重写后的 `satoken-user`
|
再次调用 `StpUserUtil.setLoginId(10001)` 进行登录授权时,token的名称将不再是 `satoken`,而是我们重写后的 `satoken-user`
|
||||||
|
|||||||
@@ -33,48 +33,47 @@
|
|||||||
**方式1,简单粗暴**
|
**方式1,简单粗暴**
|
||||||
|
|
||||||
``` js
|
``` js
|
||||||
// 1、首先在登录时,将 tokenValue 存储在本地,例如:
|
// 1、首先在登录时,将 tokenValue 存储在本地,例如:
|
||||||
uni.setStorageSync('tokenValue', tokenValue);
|
uni.setStorageSync('tokenValue', tokenValue);
|
||||||
|
|
||||||
// 2、在发起ajax请求的地方,获取这个值,并塞到header里
|
|
||||||
uni.request({
|
|
||||||
url: 'https://www.example.com/request', // 仅为示例,并非真实接口地址。
|
|
||||||
header: {
|
|
||||||
"content-type": "application/x-www-form-urlencoded",
|
|
||||||
"satoken": uni.getStorageSync('tokenValue') // 关键代码, 注意参数名字是 satoken
|
|
||||||
},
|
|
||||||
success: (res) => {
|
|
||||||
console.log(res.data);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
// 2、在发起ajax请求的地方,获取这个值,并塞到header里
|
||||||
|
uni.request({
|
||||||
|
url: 'https://www.example.com/request', // 仅为示例,并非真实接口地址。
|
||||||
|
header: {
|
||||||
|
"content-type": "application/x-www-form-urlencoded",
|
||||||
|
"satoken": uni.getStorageSync('tokenValue') // 关键代码, 注意参数名字是 satoken
|
||||||
|
},
|
||||||
|
success: (res) => {
|
||||||
|
console.log(res.data);
|
||||||
|
}
|
||||||
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
**方式2,更加灵活**
|
**方式2,更加灵活**
|
||||||
|
|
||||||
``` js
|
``` js
|
||||||
// 1、首先在登录时,将tokenName和tokenValue一起存储在本地,例如:
|
// 1、首先在登录时,将tokenName和tokenValue一起存储在本地,例如:
|
||||||
uni.setStorageSync('tokenName', tokenName);
|
uni.setStorageSync('tokenName', tokenName);
|
||||||
uni.setStorageSync('tokenValue', tokenValue);
|
uni.setStorageSync('tokenValue', tokenValue);
|
||||||
|
|
||||||
// 2、在发起ajax的地方,获取这两个值, 并组织到head里
|
// 2、在发起ajax的地方,获取这两个值, 并组织到head里
|
||||||
var tokenName = uni.getStorageSync('tokenName'); // 从本地缓存读取tokenName值
|
var tokenName = uni.getStorageSync('tokenName'); // 从本地缓存读取tokenName值
|
||||||
var tokenValue = uni.getStorageSync('tokenValue'); // 从本地缓存读取tokenValue值
|
var tokenValue = uni.getStorageSync('tokenValue'); // 从本地缓存读取tokenValue值
|
||||||
var header = {
|
var header = {
|
||||||
"content-type": "application/x-www-form-urlencoded" // 防止后台拿不到参数
|
"content-type": "application/x-www-form-urlencoded" // 防止后台拿不到参数
|
||||||
};
|
};
|
||||||
if (tokenName != undefined && tokenName != '') {
|
if (tokenName != undefined && tokenName != '') {
|
||||||
header[tokenName] = tokenValue;
|
header[tokenName] = tokenValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3、后续在发起请求时将 header 对象塞到请求头部
|
||||||
|
uni.request({
|
||||||
|
url: 'https://www.example.com/request', // 仅为示例,并非真实接口地址。
|
||||||
|
header: header,
|
||||||
|
success: (res) => {
|
||||||
|
console.log(res.data);
|
||||||
}
|
}
|
||||||
|
});
|
||||||
// 3、后续在发起请求时将 header 对象塞到请求头部
|
|
||||||
uni.request({
|
|
||||||
url: 'https://www.example.com/request', // 仅为示例,并非真实接口地址。
|
|
||||||
header: header,
|
|
||||||
success: (res) => {
|
|
||||||
console.log(res.data);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
```
|
||||||
|
|
||||||
4. 只要按照如此方法将`token`值传递到后端,`sa-token`就能像传统PC端一样自动读取到`token`值,进行鉴权
|
4. 只要按照如此方法将`token`值传递到后端,`sa-token`就能像传统PC端一样自动读取到`token`值,进行鉴权
|
||||||
|
|||||||
@@ -12,32 +12,32 @@ sa-token默认的token生成策略是uuid风格, 其模样类似于:`623368f0-
|
|||||||
|
|
||||||
怎么设置呢?只需要在yml配置文件里设置 `spring.sa-token.token-style=风格类型` 即可,其有多种取值:
|
怎么设置呢?只需要在yml配置文件里设置 `spring.sa-token.token-style=风格类型` 即可,其有多种取值:
|
||||||
|
|
||||||
1. token-style=`uuid`,uuid风格 **(默认风格)**
|
1、token-style=`uuid`,uuid风格 **(默认风格)**
|
||||||
``` html
|
``` html
|
||||||
623368f0-ae5e-4475-a53f-93e4225f16ae
|
623368f0-ae5e-4475-a53f-93e4225f16ae
|
||||||
```
|
```
|
||||||
|
|
||||||
2. token-style=`simple-uuid`,同上,uuid风格, 只不过去掉了中划线:
|
2、token-style=`simple-uuid`,同上,uuid风格, 只不过去掉了中划线:
|
||||||
``` html
|
``` html
|
||||||
6fd4221395024b5f87edd34bc3258ee8
|
6fd4221395024b5f87edd34bc3258ee8
|
||||||
```
|
```
|
||||||
|
|
||||||
3. token-style=`random-32`,随机32位字符串:
|
3、token-style=`random-32`,随机32位字符串:
|
||||||
``` html
|
``` html
|
||||||
qEjyPsEA1Bkc9dr8YP6okFr5umCZNR6W
|
qEjyPsEA1Bkc9dr8YP6okFr5umCZNR6W
|
||||||
```
|
```
|
||||||
|
|
||||||
4. token-style=`random-64`,随机64位字符串:
|
4、token-style=`random-64`,随机64位字符串:
|
||||||
``` html
|
``` html
|
||||||
v4ueNLEpPwMtmOPMBtOOeIQsvP8z9gkMgIVibTUVjkrNrlfra5CGwQkViDjO8jcc
|
v4ueNLEpPwMtmOPMBtOOeIQsvP8z9gkMgIVibTUVjkrNrlfra5CGwQkViDjO8jcc
|
||||||
```
|
```
|
||||||
|
|
||||||
5. token-style=`random-128`,随机128位字符串:
|
5、token-style=`random-128`,随机128位字符串:
|
||||||
``` html
|
``` html
|
||||||
nojYPmcEtrFEaN0Otpssa8I8jpk8FO53UcMZkCP9qyoHaDbKS6dxoRPky9c6QlftQ0pdzxRGXsKZmUSrPeZBOD6kJFfmfgiRyUmYWcj4WU4SSP2ilakWN1HYnIuX0Olj
|
nojYPmcEtrFEaN0Otpssa8I8jpk8FO53UcMZkCP9qyoHaDbKS6dxoRPky9c6QlftQ0pdzxRGXsKZmUSrPeZBOD6kJFfmfgiRyUmYWcj4WU4SSP2ilakWN1HYnIuX0Olj
|
||||||
```
|
```
|
||||||
|
|
||||||
6. token-style=`tik`,tik风格:
|
6、token-style=`tik`,tik风格:
|
||||||
``` html
|
``` html
|
||||||
gr_SwoIN0MC1ewxHX_vfCW3BothWDZMMtx__
|
gr_SwoIN0MC1ewxHX_vfCW3BothWDZMMtx__
|
||||||
```
|
```
|
||||||
@@ -51,29 +51,29 @@ gr_SwoIN0MC1ewxHX_vfCW3BothWDZMMtx__
|
|||||||
|
|
||||||
|
|
||||||
#### 参考步骤如下:
|
#### 参考步骤如下:
|
||||||
1. 新建文件`MySaTokenAction.java`,继承`SaTokenActionDefaultImpl`默认实现类, 并添加上注解`@Component`,保证此类被`springboot`扫描到
|
1、新建文件`MySaTokenAction.java`,继承`SaTokenActionDefaultImpl`默认实现类, 并添加上注解`@Component`,保证此类被`springboot`扫描到
|
||||||
``` java
|
``` java
|
||||||
package com.pj.satoken;
|
package com.pj.satoken;
|
||||||
|
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import cn.dev33.satoken.action.SaTokenActionDefaultImpl;
|
import cn.dev33.satoken.action.SaTokenActionDefaultImpl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 继承sa-token行为Bean默认实现, 重写部分逻辑
|
* 继承sa-token行为Bean默认实现, 重写部分逻辑
|
||||||
*/
|
*/
|
||||||
@Component
|
@Component
|
||||||
public class MySaTokenAction extends SaTokenActionDefaultImpl {
|
public class MySaTokenAction extends SaTokenActionDefaultImpl {
|
||||||
// 重写token生成策略
|
// 重写token生成策略
|
||||||
@Override
|
@Override
|
||||||
public String createToken(Object loginId, String loginKey) {
|
public String createToken(Object loginId, String loginKey) {
|
||||||
return SaTokenInsideUtil.getRandomString(60); // 随机60位字符串
|
return SaTokenInsideUtil.getRandomString(60); // 随机60位字符串
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
2. 再次调用 `StpUtil.setLoginId(10001)`方法进行登录,观察其生成的token样式:
|
2、再次调用 `StpUtil.setLoginId(10001)`方法进行登录,观察其生成的token样式:
|
||||||
``` html
|
``` html
|
||||||
gfuPSwZsnUhwgz08GTCH4wOgasWtc3odP4HLwXJ7NDGOximTvT4OlW19zeLH
|
gfuPSwZsnUhwgz08GTCH4wOgasWtc3odP4HLwXJ7NDGOximTvT4OlW19zeLH
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
@@ -81,38 +81,38 @@ gr_SwoIN0MC1ewxHX_vfCW3BothWDZMMtx__
|
|||||||
## 以雪花算法生成token
|
## 以雪花算法生成token
|
||||||
在此再举一个例子,以`自定义token生成策略`的方式集成`雪花算法`来生成token
|
在此再举一个例子,以`自定义token生成策略`的方式集成`雪花算法`来生成token
|
||||||
|
|
||||||
1. 首先我们需要找一个合适的类库,帮助我们生成雪花算法唯一id,在此推荐 [Hutool](https://hutool.cn/docs/#/) ,在`pom.xml`里添加依赖:
|
1、首先我们需要找一个合适的类库,帮助我们生成雪花算法唯一id,在此推荐 [Hutool](https://hutool.cn/docs/#/) ,在`pom.xml`里添加依赖:
|
||||||
``` xml
|
``` xml
|
||||||
<!-- Hutool 一个小而全的Java工具类库 -->
|
<!-- Hutool 一个小而全的Java工具类库 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>cn.hutool</groupId>
|
<groupId>cn.hutool</groupId>
|
||||||
<artifactId>hutool-all</artifactId>
|
<artifactId>hutool-all</artifactId>
|
||||||
<version>5.5.4</version>
|
<version>5.5.4</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
|
|
||||||
2. 同上,我们需要新建文件`MySaTokenAction.java`,继承`SaTokenActionDefaultImpl`默认实现类, 并添加上注解`@Component`,保证此类被`springboot`扫描到
|
2、同上,我们需要新建文件`MySaTokenAction.java`,继承`SaTokenActionDefaultImpl`默认实现类, 并添加上注解`@Component`,保证此类被`springboot`扫描到
|
||||||
``` java
|
``` java
|
||||||
package com.pj.satoken;
|
package com.pj.satoken;
|
||||||
|
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import cn.dev33.satoken.action.SaTokenActionDefaultImpl;
|
import cn.dev33.satoken.action.SaTokenActionDefaultImpl;
|
||||||
import cn.hutool.core.util.IdUtil;
|
import cn.hutool.core.util.IdUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 继承sa-token行为Bean默认实现, 重写部分逻辑
|
* 继承sa-token行为Bean默认实现, 重写部分逻辑
|
||||||
*/
|
*/
|
||||||
@Component
|
@Component
|
||||||
public class MySaTokenAction extends SaTokenActionDefaultImpl {
|
public class MySaTokenAction extends SaTokenActionDefaultImpl {
|
||||||
// 重写token生成策略
|
// 重写token生成策略
|
||||||
@Override
|
@Override
|
||||||
public String createToken(Object loginId, String loginKey) {
|
public String createToken(Object loginId, String loginKey) {
|
||||||
return IdUtil.getSnowflake(1, 1).nextIdStr(); // 以雪花算法生成token
|
return IdUtil.getSnowflake(1, 1).nextIdStr(); // 以雪花算法生成token
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
3. 再次调用 `StpUtil.setLoginId(10001)`方法进行登录,观察其生成的token样式:
|
3、再次调用 `StpUtil.setLoginId(10001)`方法进行登录,观察其生成的token样式:
|
||||||
``` html
|
``` html
|
||||||
1339604338175250432
|
1339604338175250432
|
||||||
```
|
```
|
||||||
Reference in New Issue
Block a user