Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
shengzhang_
sa-token
提交
c986cf30
sa-token
项目概览
shengzhang_
/
sa-token
通知
68
Star
16
Fork
4
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
sa-token
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
c986cf30
编写于
2月 12, 2021
作者:
shengzhang_
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
代码添加行号
上级
f96f1861
变更
12
隐藏空白更改
内联
并排
Showing
12 changed file
with
229 addition
and
208 deletion
+229
-208
sa-token-doc/doc/fun/not-login-scene.md
sa-token-doc/doc/fun/not-login-scene.md
+31
-31
sa-token-doc/doc/fun/token-timeout.md
sa-token-doc/doc/fun/token-timeout.md
+4
-4
sa-token-doc/doc/index.html
sa-token-doc/doc/index.html
+17
-1
sa-token-doc/doc/lib/index.css
sa-token-doc/doc/lib/index.css
+15
-8
sa-token-doc/doc/more/link.md
sa-token-doc/doc/more/link.md
+1
-1
sa-token-doc/doc/use/at-check.md
sa-token-doc/doc/use/at-check.md
+31
-31
sa-token-doc/doc/use/config.md
sa-token-doc/doc/use/config.md
+20
-20
sa-token-doc/doc/use/dao-extend.md
sa-token-doc/doc/use/dao-extend.md
+17
-17
sa-token-doc/doc/use/login-auth.md
sa-token-doc/doc/use/login-auth.md
+0
-1
sa-token-doc/doc/use/many-account.md
sa-token-doc/doc/use/many-account.md
+8
-8
sa-token-doc/doc/use/not-cookie.md
sa-token-doc/doc/use/not-cookie.md
+35
-36
sa-token-doc/doc/use/token-style.md
sa-token-doc/doc/use/token-style.md
+50
-50
未找到文件。
sa-token-doc/doc/fun/not-login-scene.md
浏览文件 @
c986cf30
...
...
@@ -21,38 +21,38 @@
```
java
// 全局异常拦截(拦截项目中的NotLoginException异常)
@ExceptionHandler
(
NotLoginException
.
class
)
public
AjaxJson
handlerNotLoginException
(
NotLoginException
nle
,
HttpServletRequest
request
,
HttpServletResponse
response
)
throws
Exception
{
// 打印堆栈,以供调试
nle
.
printStackTrace
();
// 判断场景值,定制化异常信息
String
message
=
""
;
if
(
nle
.
getType
().
equals
(
NotLoginException
.
NOT_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
);
// 全局异常拦截(拦截项目中的NotLoginException异常)
@ExceptionHandler
(
NotLoginException
.
class
)
public
AjaxJson
handlerNotLoginException
(
NotLoginException
nle
,
HttpServletRequest
request
,
HttpServletResponse
response
)
throws
Exception
{
// 打印堆栈,以供调试
nle
.
printStackTrace
();
// 判断场景值,定制化异常信息
String
message
=
""
;
if
(
nle
.
getType
().
equals
(
NotLoginException
.
NOT_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
);
}
```
<br/>
...
...
sa-token-doc/doc/fun/token-timeout.md
浏览文件 @
c986cf30
...
...
@@ -34,10 +34,10 @@
例如以下代码:
```
java
// 先检查是否已过期
StpUtil
.
checkActivityTimeout
();
// 检查通过后继续续签
StpUtil
.
updateLastActivityToNow
();
// 先检查是否已过期
StpUtil
.
checkActivityTimeout
();
// 检查通过后继续续签
StpUtil
.
updateLastActivityToNow
();
```
同时,你还可以关闭框架的自动续签(在配置文件中配置
`autoRenew=false`
),此时续签操作完全由开发者控制,框架不再自动进行任何续签操作
...
...
sa-token-doc/doc/index.html
浏览文件 @
c986cf30
...
...
@@ -77,14 +77,30 @@
].
join
(
''
);
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
src=
"https://unpkg.zhimg.com/docsify@4.9.4/lib/docsify.min.js"
></script>
<script
src=
"https://unpkg.zhimg.com/docsify-copy-code@2.1.0/dist/docsify-copy-code.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://unpkg.com/jquery@3.4.1/dist/jquery.min.js"
></script>
<!-- 搜索引擎自动提交 -->
<script>
...
...
sa-token-doc/doc/lib/index.css
浏览文件 @
c986cf30
/* 调整一下左侧树的样式 */
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
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
;}
}
/*
左侧树优化
*/
/*
调整一下左侧树的字体样式
*/
.sidebar
.sidebar-nav
>
ul
>
li
>
p
{
font-size
:
1.2em
;
margin-top
:
10px
;}
.sidebar
ul
li
a
{
color
:
#222
;}
.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
[
class
^=
"lang-"
]
{
border
:
0px
red
solid
;
padding
:
1.5em
1.2em
;
/* background-color: #282828; */
background-color
:
#090300
;
color
:
#FFF
;}
.main-box
[
data-lang
]
{
overflow
:
auto
;}
.main-box
[
data-lang
]
{
padding
:
0px
!important
;
border-radius
:
4px
;
overflow-x
:
auto
;
overflow-y
:
hidden
;}
.main-box
[
v-pre
]
code
{
border
:
0px
red
solid
;
border-radius
:
0px
;
/* background-color: #282828; */
background-color
:
#111
;
color
:
#FFF
;}
.main-box
[
v-pre
]
code
{
padding
:
1.5em
1.3em
;
margin-left
:
40px
!important
;}
/* .main-box h2{margin-top: 70px;} */
/* xml语言样式优化 */
...
...
@@ -32,7 +33,7 @@ body{font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu
.lang-xml
.token.attr-value
{
color
:
#A6E22E
;}
/* 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.namespace
,
.lang-java
.token.namespace
*
{
color
:
#01A252
;
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
;}
/* js语言样式优化 */
.main-box
.lang-js
{
color
:
#01a252
;}
.main-box
.lang-js
{
color
:
#01a252
!important
;}
.lang-js
.token.comment
{
color
:
#CDAB53
;}
/* .lang-js .token.string{color: #fded02;} */
.lang-js
.token.string
{
color
:
#ddd
;}
...
...
@@ -53,4 +54,10 @@ body{font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu
#main
table
{
margin-left
:
0px
;}
@media
screen
and
(
min-width
:
800px
)
{
#main
table
tr
th
{
min-width
:
150px
;}
}
\ No newline at end of file
}
/* 代码行号盒子样式 */
.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
;}
sa-token-doc/doc/more/link.md
浏览文件 @
c986cf30
...
...
@@ -4,7 +4,7 @@
#### 集成sa-token的开源项目:
[
**[ sa-plus ]**
一个基于springboot架构的快速开发框架,内置代码生成器
](
https://gitee.com/sz6/sa-plus
)
[
[sa-plus]
一个基于springboot架构的快速开发框架,内置代码生成器
](
https://gitee.com/sz6/sa-plus
)
<br>
...
...
sa-token-doc/doc/use/at-check.md
浏览文件 @
c986cf30
...
...
@@ -30,34 +30,34 @@ sa-token内置两种模式完成注解鉴权,分别是`AOP模式`和`拦截器
**登录验证**
```
java
// 注解式鉴权:当前会话必须登录才能通过
@SaCheckLogin
@RequestMapping
(
"info"
)
public
String
info
()
{
return
"查询用户信息"
;
}
// 注解式鉴权:当前会话必须登录才能通过
@SaCheckLogin
@RequestMapping
(
"info"
)
public
String
info
()
{
return
"查询用户信息"
;
}
```
**角色验证**
```
java
// 注解式鉴权:当前会话必须具有指定角色标识才能通过
@SaCheckRole
(
"super-admin"
)
@RequestMapping
(
"add"
)
public
String
add
()
{
return
"用户增加"
;
}
// 注解式鉴权:当前会话必须具有指定角色标识才能通过
@SaCheckRole
(
"super-admin"
)
@RequestMapping
(
"add"
)
public
String
add
()
{
return
"用户增加"
;
}
```
**权限验证**
```
java
// 注解式鉴权:当前会话必须具有指定权限才能通过
@SaCheckPermission
(
"user-add"
)
@RequestMapping
(
"add"
)
public
String
add
()
{
return
"用户增加"
;
}
// 注解式鉴权:当前会话必须具有指定权限才能通过
@SaCheckPermission
(
"user-add"
)
@RequestMapping
(
"add"
)
public
String
add
()
{
return
"用户增加"
;
}
```
注:以上两个注解都可以加在类上,代表为这个类所有方法进行鉴权
...
...
@@ -66,12 +66,12 @@ sa-token内置两种模式完成注解鉴权,分别是`AOP模式`和`拦截器
#### 设定校验模式
`@SaCheckRole`
与
`@SaCheckPermission`
注解可设置校验模式,例如:
```
java
// 注解式鉴权:只要具有其中一个权限即可通过校验
@RequestMapping
(
"atJurOr"
)
@SaCheckPermission
(
value
=
{
"user-add"
,
"user-all"
,
"user-delete"
},
mode
=
SaMode
.
OR
)
public
AjaxJson
atJurOr
()
{
return
AjaxJson
.
getSuccessData
(
"用户信息"
);
}
// 注解式鉴权:只要具有其中一个权限即可通过校验
@RequestMapping
(
"atJurOr"
)
@SaCheckPermission
(
value
=
{
"user-add"
,
"user-all"
,
"user-delete"
},
mode
=
SaMode
.
OR
)
public
AjaxJson
atJurOr
()
{
return
AjaxJson
.
getSuccessData
(
"用户信息"
);
}
```
...
...
@@ -87,14 +87,14 @@ mode有两种取值:
以
`SpringBoot2.0`
为例, 新建配置类
`MySaTokenConfig.java`
```
java
@Configuration
public
class
MySaTokenConfig
implements
WebMvcConfigurer
{
// 注册sa-token的注解拦截器,打开注解式鉴权功能
@Override
public
void
addInterceptors
(
InterceptorRegistry
registry
)
{
registry
.
addInterceptor
(
new
SaAnnotationInterceptor
()).
addPathPatterns
(
"/**"
);
}
@Configuration
public
class
MySaTokenConfig
implements
WebMvcConfigurer
{
// 注册sa-token的注解拦截器,打开注解式鉴权功能
@Override
public
void
addInterceptors
(
InterceptorRegistry
registry
)
{
registry
.
addInterceptor
(
new
SaAnnotationInterceptor
()).
addPathPatterns
(
"/**"
);
}
}
```
保证此类被
`springboot`
启动类扫描到即可
...
...
sa-token-doc/doc/use/config.md
浏览文件 @
c986cf30
...
...
@@ -31,27 +31,27 @@ spring:
### 方式2、通过代码配置
```
java
/**
* sa-token代码方式进行配置
*/
@Configuration
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
;
}
/**
* sa-token代码方式进行配置
*/
@Configuration
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
;
}
}
```
...
...
sa-token-doc/doc/use/dao-extend.md
浏览文件 @
c986cf30
...
...
@@ -11,24 +11,24 @@ Sa-token默认将会话数据保存在内存中,此模式读写速度最快,
### 1. sa-token 整合 Redis (使用jdk默认序列化方式)
(注意: 整合Redis只需要引入对应的pom依赖即可,所有上层API保持不变)
```
xml
<!-- sa-token整合redis (使用jdk默认序列化方式) -->
<dependency>
<groupId>
cn.dev33
</groupId>
<artifactId>
sa-token-dao-redis
</artifactId>
<version>
1.13.0
</version>
</dependency>
<!-- sa-token整合redis (使用jdk默认序列化方式) -->
<dependency>
<groupId>
cn.dev33
</groupId>
<artifactId>
sa-token-dao-redis
</artifactId>
<version>
1.13.0
</version>
</dependency>
```
优点:兼容性好,缺点:Session序列化后基本不可读,对开发者来讲等同于乱码
### 2. sa-token 整合 Redis (使用jackson序列化方式)
```
xml
<!-- sa-token整合redis (使用jackson序列化方式) -->
<dependency>
<groupId>
cn.dev33
</groupId>
<artifactId>
sa-token-dao-redis-jackson
</artifactId>
<version>
1.13.0
</version>
</dependency>
<!-- sa-token整合redis (使用jackson序列化方式) -->
<dependency>
<groupId>
cn.dev33
</groupId>
<artifactId>
sa-token-dao-redis-jackson
</artifactId>
<version>
1.13.0
</version>
</dependency>
```
优点:Session序列化后可读性强,可灵活手动修改,缺点:兼容性稍差
...
...
@@ -37,11 +37,11 @@ Sa-token默认将会话数据保存在内存中,此模式读写速度最快,
**请注意,无论使用哪种序列化方式,你都必须为项目提供一个Redis实例化方案,例如:**
```
xml
<!-- 提供redis连接池 -->
<dependency>
<groupId>
org.apache.commons
</groupId>
<artifactId>
commons-pool2
</artifactId>
</dependency>
<!-- 提供redis连接池 -->
<dependency>
<groupId>
org.apache.commons
</groupId>
<artifactId>
commons-pool2
</artifactId>
</dependency>
```
...
...
sa-token-doc/doc/use/login-auth.md
浏览文件 @
c986cf30
...
...
@@ -48,7 +48,6 @@ StpUtil.getLoginIdDefaultNull();
// 获取当前会话登录id, 如果未登录,则返回默认值 (`defaultValue`可以为任意类型)
StpUtil
.
getLoginId
(
T
defaultValue
);
```
...
...
sa-token-doc/doc/use/many-account.md
浏览文件 @
c986cf30
...
...
@@ -42,14 +42,14 @@
很简单,我们只要更改一下
`StpUserUtil`
的
`TokenName`
即可,参考示例如下:
```
java
// 底层的 StpLogic 对象
public
static
StpLogic
stpLogic
=
new
StpLogic
(
"login"
)
{
// 重写 `getTokenName` 函数,返回一个与 `StpUtil` 不同的token名称, 防止冲突
@Override
public
String
getTokenName
()
{
return
super
.
getKeyTokenName
()
+
"-user"
;
}
};
// 底层的 StpLogic 对象
public
static
StpLogic
stpLogic
=
new
StpLogic
(
"login"
)
{
// 重写 `getTokenName` 函数,返回一个与 `StpUtil` 不同的token名称, 防止冲突
@Override
public
String
getTokenName
()
{
return
super
.
getKeyTokenName
()
+
"-user"
;
}
};
```
再次调用
`StpUserUtil.setLoginId(10001)`
进行登录授权时,token的名称将不再是
`satoken`
,而是我们重写后的
`satoken-user`
...
...
sa-token-doc/doc/use/not-cookie.md
浏览文件 @
c986cf30
...
...
@@ -33,48 +33,47 @@
**方式1,简单粗暴**
```
js
// 1、首先在登录时,将 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
);
}
});
// 1、首先在登录时,将 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,更加灵活**
```
js
// 1、首先在登录时,将tokenName和tokenValue一起存储在本地,例如:
uni
.
setStorageSync
(
'
tokenName
'
,
tokenName
);
uni
.
setStorageSync
(
'
tokenValue
'
,
tokenValue
);
// 2、在发起ajax的地方,获取这两个值, 并组织到head里
var
tokenName
=
uni
.
getStorageSync
(
'
tokenName
'
);
// 从本地缓存读取tokenName值
var
tokenValue
=
uni
.
getStorageSync
(
'
tokenValue
'
);
// 从本地缓存读取tokenValue值
var
header
=
{
"
content-type
"
:
"
application/x-www-form-urlencoded
"
// 防止后台拿不到参数
};
if
(
tokenName
!=
undefined
&&
tokenName
!=
''
)
{
header
[
tokenName
]
=
tokenValue
;
// 1、首先在登录时,将tokenName和tokenValue一起存储在本地,例如:
uni
.
setStorageSync
(
'
tokenName
'
,
tokenName
);
uni
.
setStorageSync
(
'
tokenValue
'
,
tokenValue
);
// 2、在发起ajax的地方,获取这两个值, 并组织到head里
var
tokenName
=
uni
.
getStorageSync
(
'
tokenName
'
);
// 从本地缓存读取tokenName值
var
tokenValue
=
uni
.
getStorageSync
(
'
tokenValue
'
);
// 从本地缓存读取tokenValue值
var
header
=
{
"
content-type
"
:
"
application/x-www-form-urlencoded
"
// 防止后台拿不到参数
};
if
(
tokenName
!=
undefined
&&
tokenName
!=
''
)
{
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`
值,进行鉴权
...
...
sa-token-doc/doc/use/token-style.md
浏览文件 @
c986cf30
...
...
@@ -12,32 +12,32 @@ sa-token默认的token生成策略是uuid风格, 其模样类似于:`623368f0-
怎么设置呢?只需要在yml配置文件里设置
`spring.sa-token.token-style=风格类型`
即可,其有多种取值:
1
.
token-style=
`uuid`
,uuid风格
**(默认风格)**
1
、
token-style=
`uuid`
,uuid风格
**(默认风格)**
```
html
623368f0-ae5e-4475-a53f-93e4225f16ae
```
2
.
token-style=
`simple-uuid`
,同上,uuid风格, 只不过去掉了中划线:
2
、
token-style=
`simple-uuid`
,同上,uuid风格, 只不过去掉了中划线:
```
html
6fd4221395024b5f87edd34bc3258ee8
```
3
.
token-style=
`random-32`
,随机32位字符串:
3
、
token-style=
`random-32`
,随机32位字符串:
```
html
qEjyPsEA1Bkc9dr8YP6okFr5umCZNR6W
```
4
.
token-style=
`random-64`
,随机64位字符串:
4
、
token-style=
`random-64`
,随机64位字符串:
```
html
v4ueNLEpPwMtmOPMBtOOeIQsvP8z9gkMgIVibTUVjkrNrlfra5CGwQkViDjO8jcc
```
5
.
token-style=
`random-128`
,随机128位字符串:
5
、
token-style=
`random-128`
,随机128位字符串:
```
html
nojYPmcEtrFEaN0Otpssa8I8jpk8FO53UcMZkCP9qyoHaDbKS6dxoRPky9c6QlftQ0pdzxRGXsKZmUSrPeZBOD6kJFfmfgiRyUmYWcj4WU4SSP2ilakWN1HYnIuX0Olj
```
6
.
token-style=
`tik`
,tik风格:
6
、
token-style=
`tik`
,tik风格:
```
html
gr_SwoIN0MC1ewxHX_vfCW3BothWDZMMtx__
```
...
...
@@ -51,29 +51,29 @@ gr_SwoIN0MC1ewxHX_vfCW3BothWDZMMtx__
#### 参考步骤如下:
1
.
新建文件
`MySaTokenAction.java`
,继承
`SaTokenActionDefaultImpl`
默认实现类, 并添加上注解
`@Component`
,保证此类被
`springboot`
扫描到
1
、
新建文件
`MySaTokenAction.java`
,继承
`SaTokenActionDefaultImpl`
默认实现类, 并添加上注解
`@Component`
,保证此类被
`springboot`
扫描到
```
java
package
com.pj.satoken
;
import
org.springframework.stereotype.Component
;
import
cn.dev33.satoken.action.SaTokenActionDefaultImpl
;
/**
* 继承sa-token行为Bean默认实现, 重写部分逻辑
*/
@Component
public
class
MySaTokenAction
extends
SaTokenActionDefaultImpl
{
// 重写token生成策略
@Override
public
String
createToken
(
Object
loginId
,
String
loginKey
)
{
return
SaTokenInsideUtil
.
getRandomString
(
60
);
// 随机60位字符串
}
package
com.pj.satoken
;
import
org.springframework.stereotype.Component
;
import
cn.dev33.satoken.action.SaTokenActionDefaultImpl
;
/**
* 继承sa-token行为Bean默认实现, 重写部分逻辑
*/
@Component
public
class
MySaTokenAction
extends
SaTokenActionDefaultImpl
{
// 重写token生成策略
@Override
public
String
createToken
(
Object
loginId
,
String
loginKey
)
{
return
SaTokenInsideUtil
.
getRandomString
(
60
);
// 随机60位字符串
}
}
```
2
.
再次调用
`StpUtil.setLoginId(10001)`
方法进行登录,观察其生成的token样式:
2
、
再次调用
`StpUtil.setLoginId(10001)`
方法进行登录,观察其生成的token样式:
```
html
gfuPSwZsnUhwgz08GTCH4wOgasWtc3odP4HLwXJ7NDGOximTvT4OlW19zeLH
gfuPSwZsnUhwgz08GTCH4wOgasWtc3odP4HLwXJ7NDGOximTvT4OlW19zeLH
```
...
...
@@ -81,38 +81,38 @@ gr_SwoIN0MC1ewxHX_vfCW3BothWDZMMtx__
## 以雪花算法生成token
在此再举一个例子,以
`自定义token生成策略`
的方式集成
`雪花算法`
来生成token
1
.
首先我们需要找一个合适的类库,帮助我们生成雪花算法唯一id,在此推荐
[
Hutool
](
https://hutool.cn/docs/#/
)
,在
`pom.xml`
里添加依赖:
1
、
首先我们需要找一个合适的类库,帮助我们生成雪花算法唯一id,在此推荐
[
Hutool
](
https://hutool.cn/docs/#/
)
,在
`pom.xml`
里添加依赖:
```
xml
<!-- Hutool 一个小而全的Java工具类库 -->
<dependency>
<groupId>
cn.hutool
</groupId>
<artifactId>
hutool-all
</artifactId>
<version>
5.5.4
</version>
</dependency>
<!-- Hutool 一个小而全的Java工具类库 -->
<dependency>
<groupId>
cn.hutool
</groupId>
<artifactId>
hutool-all
</artifactId>
<version>
5.5.4
</version>
</dependency>
```
2
.
同上,我们需要新建文件
`MySaTokenAction.java`
,继承
`SaTokenActionDefaultImpl`
默认实现类, 并添加上注解
`@Component`
,保证此类被
`springboot`
扫描到
2
、同上,我们需要新建文件
`MySaTokenAction.java`
,继承
`SaTokenActionDefaultImpl`
默认实现类, 并添加上注解
`@Component`
,保证此类被
`springboot`
扫描到
```
java
package
com.pj.satoken
;
import
org.springframework.stereotype.Component
;
import
cn.dev33.satoken.action.SaTokenActionDefaultImpl
;
import
cn.hutool.core.util.IdUtil
;
/**
* 继承sa-token行为Bean默认实现, 重写部分逻辑
*/
@Component
public
class
MySaTokenAction
extends
SaTokenActionDefaultImpl
{
// 重写token生成策略
@Override
public
String
createToken
(
Object
loginId
,
String
loginKey
)
{
return
IdUtil
.
getSnowflake
(
1
,
1
).
nextIdStr
();
// 以雪花算法生成token
}
package
com.pj.satoken
;
import
org.springframework.stereotype.Component
;
import
cn.dev33.satoken.action.SaTokenActionDefaultImpl
;
import
cn.hutool.core.util.IdUtil
;
/**
* 继承sa-token行为Bean默认实现, 重写部分逻辑
*/
@Component
public
class
MySaTokenAction
extends
SaTokenActionDefaultImpl
{
// 重写token生成策略
@Override
public
String
createToken
(
Object
loginId
,
String
loginKey
)
{
return
IdUtil
.
getSnowflake
(
1
,
1
).
nextIdStr
();
// 以雪花算法生成token
}
}
```
3
.
再次调用
`StpUtil.setLoginId(10001)`
方法进行登录,观察其生成的token样式:
3
、
再次调用
`StpUtil.setLoginId(10001)`
方法进行登录,观察其生成的token样式:
```
html
1339604338175250432
1339604338175250432
```
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录