mirror of
https://gitee.com/dromara/sa-token.git
synced 2025-09-19 10:08:07 +08:00
v1.15更新
This commit is contained in:
@@ -1,11 +1,11 @@
|
||||
<p align="center">
|
||||
<img alt="logo" src="https://gitee.com/sz6/sa-token/raw/master/sa-token-doc/doc/logo.png" width="150" height="150">
|
||||
</p>
|
||||
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">sa-token v1.14.0</h1>
|
||||
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">sa-token v1.15.0</h1>
|
||||
<h4 align="center">这可能是史上功能最全的Java权限认证框架!</h4>
|
||||
<h4 align="center">
|
||||
<a href="https://gitee.com/sz6/sa-token/stargazers"><img src="https://gitee.com/sz6/sa-token/badge/star.svg"></a>
|
||||
<a href="https://github.com/click33/sa-token"><img src="https://img.shields.io/badge/sa--token-v1.14.0-2B9939"></a>
|
||||
<a href="https://github.com/click33/sa-token"><img src="https://img.shields.io/badge/sa--token-v1.15.0-2B9939"></a>
|
||||
<a href="https://github.com/click33/sa-token/stargazers"><img src="https://img.shields.io/github/stars/click33/sa-token"></a>
|
||||
<a href="https://github.com/click33/sa-token/watchers"><img src="https://img.shields.io/github/watchers/click33/sa-token"></a>
|
||||
<a href="https://github.com/click33/sa-token/network/members"><img src="https://img.shields.io/github/forks/click33/sa-token"></a>
|
||||
|
@@ -21,6 +21,7 @@
|
||||
<nav>
|
||||
<select onchange="location.href=this.value">
|
||||
<option value="http://sa-token.dev33.cn/doc/index.html">最新版</option>
|
||||
<option value="http://sa-token.dev33.cn/v/v1.14.0/doc/index.html">v1.14.0</option>
|
||||
<option value="http://sa-token.dev33.cn/v/v1.13.0/doc/index.html">v1.13.0</option>
|
||||
<option value="http://sa-token.dev33.cn/v/v1.12.1/doc/index.html">v1.12.1</option>
|
||||
<option value="http://sa-token.dev33.cn/v/v1.12.0/doc/index.html">v1.12.0</option>
|
||||
@@ -43,7 +44,7 @@
|
||||
</div>
|
||||
<script>
|
||||
var name = '<img style="width: 50px; height: 50px; vertical-align: middle;" src="logo.png" alt="logo" /> ';
|
||||
name += '<b style="font-size: 24px; vertical-align: middle;">sa-token</b> <sub>v1.14.0</sub>'
|
||||
name += '<b style="font-size: 24px; vertical-align: middle;">sa-token</b> <sub>v1.15.0</sub>'
|
||||
window.$docsify = {
|
||||
name: name, // 名字
|
||||
repo: 'https://github.com/click33/sa-token', // github地址
|
||||
|
@@ -1,5 +1,26 @@
|
||||
# 更新日志
|
||||
|
||||
|
||||
### 2021-3-23 @v1.15.0
|
||||
- 新增:文档添加源码涉及技术栈说明
|
||||
- 优化:优化路由拦截器模块文档,更简洁的示例
|
||||
- 修复:修复非web环境下的错误提示,Request->Response
|
||||
- 修复:修复Cookie注入时path判断错误,感谢@zhangzi0291提供的PR
|
||||
- 新增:文档集成Redis章节新增redis配置示例说明,感谢群友 `@-)` 提供的建议
|
||||
- 新增:增加token前缀模式,可在配置token读取前缀,适配`Bearer token`规范 **[重要]**
|
||||
- 优化:`SaTokenManager`初始化Bean去除`initXxx`方法,优化代码逻辑
|
||||
- 新增:`SaTokenManager`新增`stpLogicMap`集合,记录所有`StpLogic`的初始化,方便查找
|
||||
- 新增:`Session`新增timeout操作API,可灵活修改Session的剩余有效时间
|
||||
- 新增:token前缀改为强制校验模式,如果配置了前缀,则前端提交token时必须带有
|
||||
- 优化:精简`SaRouteInterceptor`,只保留自定义验证和默认的登陆验证,去除冗余功能
|
||||
- 优化:`SaRouterUtil`迁移到core核心包,优化依赖架构
|
||||
- 优化:默认Dao实现类里`Timer定时器`改为子线程 + sleep 模拟
|
||||
- 新增:`Session`新增各种类型转换API,可快速方便存取值 **[重要]**
|
||||
- 升级注意:
|
||||
- `SaRouterUtil`类迁移到核心包,注意更换import地址
|
||||
- `SaRouteInterceptor`去出冗余API,详情参考路由鉴权部分
|
||||
|
||||
|
||||
### 2021-3-12 @v1.14.0
|
||||
- 新增:新增`SaLoginModel`登录参数Model,适配 [记住我] 模式 **[重要]**
|
||||
- 新增:新增 `StpUtil.setLoginId()` 时指定token有效期,可灵活控制用户的一次登录免验证时长
|
||||
|
@@ -9,14 +9,14 @@
|
||||
<dependency>
|
||||
<groupId>cn.dev33</groupId>
|
||||
<artifactId>sa-token-spring-boot-starter</artifactId>
|
||||
<version>1.14.0</version>
|
||||
<version>1.15.0</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
## Gradle依赖
|
||||
Gradle用户引入依赖:
|
||||
```
|
||||
implementation 'cn.dev33:sa-token-spring-boot-starter:1.14.0'
|
||||
implementation 'cn.dev33:sa-token-spring-boot-starter:1.15.0'
|
||||
```
|
||||
|
||||
|
||||
|
@@ -19,7 +19,7 @@
|
||||
<dependency>
|
||||
<groupId>cn.dev33</groupId>
|
||||
<artifactId>sa-token-spring-boot-starter</artifactId>
|
||||
<version>1.14.0</version>
|
||||
<version>1.15.0</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
|
@@ -21,7 +21,7 @@ sa-token内置两种模式完成注解鉴权,分别是`AOP模式`和`拦截器
|
||||
<dependency>
|
||||
<groupId>cn.dev33</groupId>
|
||||
<artifactId>sa-token-spring-aop</artifactId>
|
||||
<version>1.14.0</version>
|
||||
<version>1.15.0</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
|
@@ -14,7 +14,7 @@ Sa-token默认将会话数据保存在内存中,此模式读写速度最快,
|
||||
<dependency>
|
||||
<groupId>cn.dev33</groupId>
|
||||
<artifactId>sa-token-dao-redis</artifactId>
|
||||
<version>1.14.0</version>
|
||||
<version>1.15.0</version>
|
||||
</dependency>
|
||||
```
|
||||
优点:兼容性好,缺点:Session序列化后基本不可读,对开发者来讲等同于乱码
|
||||
@@ -26,7 +26,7 @@ Sa-token默认将会话数据保存在内存中,此模式读写速度最快,
|
||||
<dependency>
|
||||
<groupId>cn.dev33</groupId>
|
||||
<artifactId>sa-token-dao-redis-jackson</artifactId>
|
||||
<version>1.14.0</version>
|
||||
<version>1.15.0</version>
|
||||
</dependency>
|
||||
```
|
||||
优点:Session序列化后可读性强,可灵活手动修改,缺点:兼容性稍差
|
||||
|
@@ -65,32 +65,97 @@ SaSessionCustomUtil.deleteSessionById("goods-10001");
|
||||
### Session相关操作
|
||||
那么获取到的`SaSession`具体有哪些方法可供操作?
|
||||
``` java
|
||||
session.getId(); // 返回此Session的id
|
||||
session.getCreateTime(); // 返回此Session的创建时间 (时间戳)
|
||||
session.getAttribute('name'); // 在Session上获取一个值
|
||||
session.getAttribute('name', 'zhang'); // 在Session上获取一个值,并指定取不到值时返回的默认值
|
||||
session.setAttribute('name', 'zhang'); // 在Session上写入一个值
|
||||
session.removeAttribute('name'); // 在Session上移除一个值
|
||||
session.clearAttribute(); // 清空此Session的所有值
|
||||
session.containsAttribute('name'); // 获取此Session是否含有指定key (返回true或false)
|
||||
session.attributeKeys(); // 获取此Session会话上所有key (返回Set<String>)
|
||||
session.getDataMap(); // 返回此Session会话上的底层数据对象(如果更新map里的值,请调用session.update()方法避免产生脏数据)
|
||||
session.update(); // 将这个Session从持久库更新一下
|
||||
session.logout(); // 注销此Session会话 (从持久库删除此Session)
|
||||
// 返回此Session的id
|
||||
session.getId();
|
||||
|
||||
// 返回此Session的创建时间 (时间戳)
|
||||
session.getCreateTime();
|
||||
|
||||
// 在Session上获取一个值
|
||||
session.getAttribute('name');
|
||||
|
||||
// 在Session上获取一个值,并指定取不到值时返回的默认值
|
||||
session.getAttribute('name', 'zhang');
|
||||
|
||||
// 在Session上写入一个值
|
||||
session.setAttribute('name', 'zhang');
|
||||
|
||||
// 在Session上移除一个值
|
||||
session.removeAttribute('name');
|
||||
|
||||
// 清空此Session的所有值
|
||||
session.clearAttribute();
|
||||
|
||||
// 获取此Session是否含有指定key (返回true或false)
|
||||
session.containsAttribute('name');
|
||||
|
||||
// 获取此Session会话上所有key (返回Set<String>)
|
||||
session.attributeKeys();
|
||||
|
||||
// 返回此Session会话上的底层数据对象(如果更新map里的值,请调用session.update()方法避免产生脏数据)
|
||||
session.getDataMap();
|
||||
|
||||
// 将这个Session从持久库更新一下
|
||||
session.update();
|
||||
|
||||
// 注销此Session会话 (从持久库删除此Session)
|
||||
session.logout();
|
||||
```
|
||||
|
||||
|
||||
### 类型转换API
|
||||
由于Session存取值默认的类型都是Object,因此我们通常会写很多不必要类型转换代码 <br>
|
||||
为了简化操作,sa-token自`v1.15.0`封装了存取值API的类型转换,你可以非常方便的调用以下方法:
|
||||
``` java
|
||||
// 写值
|
||||
session.set("name", "zhang");
|
||||
|
||||
// 写值(只有在此key原本无值的时候才会写入)
|
||||
session.set("name", "zhang");
|
||||
|
||||
// 取值
|
||||
session.get("name");
|
||||
|
||||
// 取值 (指定默认值)
|
||||
session.get("name", "<defaultValue>");
|
||||
|
||||
// 取值 (转String类型)
|
||||
session.getString("name");
|
||||
|
||||
// 取值 (转int类型)
|
||||
session.getInt("age");
|
||||
|
||||
// 取值 (转long类型)
|
||||
session.getLong("age");
|
||||
|
||||
// 取值 (转double类型)
|
||||
session.getDouble("result");
|
||||
|
||||
// 取值 (转float类型)
|
||||
session.getFloat("result");
|
||||
|
||||
// 取值 (指定转换类型)
|
||||
session.getModel("key", Student.class);
|
||||
|
||||
// 取值 (指定转换类型, 并指定值为Null时返回的默认值)
|
||||
session.getModel("key", Student.class, <defaultValue>);
|
||||
|
||||
// 是否含有某个key
|
||||
session.has("key");
|
||||
```
|
||||
具体可参考`javax.servlet.http.HttpSession`,`SaSession`所含方法与其大体类似
|
||||
|
||||
|
||||
### Session环境隔离说明
|
||||
在springboot环境下取得的session环境和通过StpUtil获取的session环境并不相通, 示例
|
||||
有同学经常会把 `SaSession` 与 `HttpSession` 进行混淆,例如:
|
||||
``` java
|
||||
@PostMapping("/resetPoints")
|
||||
public void reset(HttpSession session) {
|
||||
session.setAttribute("pointsKey", 66);
|
||||
SaSession session2 = StpUtil.getSession();
|
||||
Object value = session2.getAttribute("pointsKey");
|
||||
System.out.println(value)
|
||||
// 输出null
|
||||
// 在HttpSession上写入一个值
|
||||
session.setAttribute("name", 66);
|
||||
// 在SaSession进行取值
|
||||
System.out.println(StpUtil.getSession().getAttribute("name")); // 输出null
|
||||
}
|
||||
```
|
||||
而且, 在使用sa-token多账号模式下, 不同的StpUtil获取的session之间也是环境隔离
|
||||
**要点:**
|
||||
1. `SaSession` 与 `HttpSession` 没有任何关系,在`HttpSession`上写入的值,在`SaSession`中无法取出
|
||||
2. `HttpSession`并未被框架接管,在使用sa-token时,请在任何情况下均使用`SaSession`,不要使用`HttpSession`
|
||||
|
@@ -41,7 +41,7 @@
|
||||
<!-- 内容部分 -->
|
||||
<div class="main-box">
|
||||
<div class="content-box">
|
||||
<h1>sa-token<small>v1.14.0</small></h1>
|
||||
<h1>sa-token<small>v1.15.0</small></h1>
|
||||
<div class="sub-title">这可能是史上功能最全的java权限认证框架!</div>
|
||||
<!-- <p>0配置开箱即用,低学习成本</p> -->
|
||||
<p>登录验证、权限验证、Session会话、踢人下线、集成Redis、分布式会话、单点登录、前后台分离、记住我模式、模拟他人账号、临时身份切换、多账号体系、注解式鉴权、路由拦截式鉴权、花式token、自动续签、同端互斥登录、会话治理、密码加密、jwt集成、Spring集成...</p>
|
||||
|
Reference in New Issue
Block a user