代码添加行号

This commit is contained in:
shengzhang
2021-02-12 01:57:31 +08:00
parent f96f186140
commit c986cf3034
12 changed files with 225 additions and 204 deletions

View File

@@ -21,9 +21,9 @@
``` 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 {
// 打印堆栈,以供调试 // 打印堆栈,以供调试
@@ -52,7 +52,7 @@
// 返回给前端 // 返回给前端
return AjaxJson.getError(message); return AjaxJson.getError(message);
} }
``` ```
<br/> <br/>

View File

@@ -34,10 +34,10 @@
例如以下代码: 例如以下代码:
``` java ``` java
// 先检查是否已过期 // 先检查是否已过期
StpUtil.checkActivityTimeout(); StpUtil.checkActivityTimeout();
// 检查通过后继续续签 // 检查通过后继续续签
StpUtil.updateLastActivityToNow(); StpUtil.updateLastActivityToNow();
``` ```
同时,你还可以关闭框架的自动续签(在配置文件中配置 `autoRenew=false` ),此时续签操作完全由开发者控制,框架不再自动进行任何续签操作 同时,你还可以关闭框架的自动续签(在配置文件中配置 `autoRenew=false` ),此时续签操作完全由开发者控制,框架不再自动进行任何续签操作

View File

@@ -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() {

View File

@@ -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;}

View File

@@ -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>

View File

@@ -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`启动类扫描到即可

View File

@@ -31,11 +31,11 @@ spring:
### 方式2、通过代码配置 ### 方式2、通过代码配置
``` java ``` java
/** /**
* sa-token代码方式进行配置 * sa-token代码方式进行配置
*/ */
@Configuration @Configuration
public class MySaTokenConfig { public class MySaTokenConfig {
// 获取配置Bean (以代码的方式配置sa-token, 此配置会覆盖yml中的配置) // 获取配置Bean (以代码的方式配置sa-token, 此配置会覆盖yml中的配置)
@Primary @Primary
@@ -51,7 +51,7 @@ spring:
return config; return config;
} }
} }
``` ```

View File

@@ -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>
``` ```

View File

@@ -48,7 +48,6 @@ StpUtil.getLoginIdDefaultNull();
// 获取当前会话登录id, 如果未登录,则返回默认值 `defaultValue`可以为任意类型) // 获取当前会话登录id, 如果未登录,则返回默认值 `defaultValue`可以为任意类型)
StpUtil.getLoginId(T defaultValue); StpUtil.getLoginId(T defaultValue);
``` ```

View File

@@ -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`

View File

@@ -33,11 +33,11 @@
**方式1简单粗暴** **方式1简单粗暴**
``` js ``` js
// 1、首先在登录时将 tokenValue 存储在本地,例如: // 1、首先在登录时将 tokenValue 存储在本地,例如:
uni.setStorageSync('tokenValue', tokenValue); uni.setStorageSync('tokenValue', tokenValue);
// 2、在发起ajax请求的地方获取这个值并塞到header里 // 2、在发起ajax请求的地方获取这个值并塞到header里
uni.request({ uni.request({
url: 'https://www.example.com/request', // 仅为示例,并非真实接口地址。 url: 'https://www.example.com/request', // 仅为示例,并非真实接口地址。
header: { header: {
"content-type": "application/x-www-form-urlencoded", "content-type": "application/x-www-form-urlencoded",
@@ -46,35 +46,34 @@
success: (res) => { success: (res) => {
console.log(res.data); 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 对象塞到请求头部 // 3、后续在发起请求时将 header 对象塞到请求头部
uni.request({ uni.request({
url: 'https://www.example.com/request', // 仅为示例,并非真实接口地址。 url: 'https://www.example.com/request', // 仅为示例,并非真实接口地址。
header: header, header: header,
success: (res) => { success: (res) => {
console.log(res.data); console.log(res.data);
} }
}); });
``` ```
4. 只要按照如此方法将`token`值传递到后端,`sa-token`就能像传统PC端一样自动读取到`token`值,进行鉴权 4. 只要按照如此方法将`token`值传递到后端,`sa-token`就能像传统PC端一样自动读取到`token`值,进行鉴权

View File

@@ -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风格, 只不过去掉了中划线: 2token-style=`simple-uuid`同上uuid风格, 只不过去掉了中划线:
``` html ``` html
6fd4221395024b5f87edd34bc3258ee8 6fd4221395024b5f87edd34bc3258ee8
``` ```
3. token-style=`random-32`随机32位字符串 3token-style=`random-32`随机32位字符串
``` html ``` html
qEjyPsEA1Bkc9dr8YP6okFr5umCZNR6W qEjyPsEA1Bkc9dr8YP6okFr5umCZNR6W
``` ```
4. token-style=`random-64`随机64位字符串 4token-style=`random-64`随机64位字符串
``` html ``` html
v4ueNLEpPwMtmOPMBtOOeIQsvP8z9gkMgIVibTUVjkrNrlfra5CGwQkViDjO8jcc v4ueNLEpPwMtmOPMBtOOeIQsvP8z9gkMgIVibTUVjkrNrlfra5CGwQkViDjO8jcc
``` ```
5. token-style=`random-128`随机128位字符串 5token-style=`random-128`随机128位字符串
``` html ``` html
nojYPmcEtrFEaN0Otpssa8I8jpk8FO53UcMZkCP9qyoHaDbKS6dxoRPky9c6QlftQ0pdzxRGXsKZmUSrPeZBOD6kJFfmfgiRyUmYWcj4WU4SSP2ilakWN1HYnIuX0Olj nojYPmcEtrFEaN0Otpssa8I8jpk8FO53UcMZkCP9qyoHaDbKS6dxoRPky9c6QlftQ0pdzxRGXsKZmUSrPeZBOD6kJFfmfgiRyUmYWcj4WU4SSP2ilakWN1HYnIuX0Olj
``` ```
6. token-style=`tik`tik风格 6token-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
``` ```