增加部分章节代码示例

This commit is contained in:
click33 2022-10-17 06:07:13 +08:00
parent 877e90d3b4
commit 002218b49c
10 changed files with 291 additions and 3 deletions

View File

@ -0,0 +1,56 @@
package com.pj.cases.up;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
/**
* Sa-Token 账号封禁示例
*
* @author kong
* @since 2022-10-17
*/
@RestController
@RequestMapping("/disable/")
public class DisableController {
/*
* 测试步骤
1访问登录接口可以正常登录 ---- http://localhost:8081/disable/login?userId=10001
2注销登录 ---- http://localhost:8081/disable/logout
3禁用账号 ---- http://localhost:8081/disable/disable?userId=10001
4再次访问登录接口登录失败 ---- http://localhost:8081/disable/login?userId=10001
*/
// 会话登录接口 ---- http://localhost:8081/disable/login?userId=10001
@RequestMapping("login")
public SaResult login(long userId) {
// 1先检查此账号是否已被封禁
StpUtil.checkDisable(userId);
// 2检查通过后再登录
StpUtil.login(userId);
return SaResult.ok("账号登录成功");
}
// 会话注销接口 ---- http://localhost:8081/disable/logout
@RequestMapping("logout")
public SaResult logout() {
StpUtil.logout();
return SaResult.ok("账号退出成功");
}
// 封禁指定账号 ---- http://localhost:8081/disable/disable
@RequestMapping("disable")
public SaResult disable(long userId) {
/*
* 账号封禁
* 参数1要封禁的账号id
* 参数2要封禁的时间单位86400秒=1天
*/
StpUtil.disable(userId, 86400);
return SaResult.ok("账号 " + userId + " 封禁成功");
}
}

View File

@ -0,0 +1,38 @@
package com.pj.cases.up;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import cn.dev33.satoken.basic.SaBasicUtil;
import cn.dev33.satoken.util.SaResult;
/**
* Sa-Token Http Basic 认证
*
* @author kong
* @since 2022-10-17
*/
@RestController
@RequestMapping("/basic/")
public class HttpBasicController {
/*
* 测试步骤
1访问资源接口被拦截无法返回数据信息 ---- http://localhost:8081/basic/getInfo
2浏览器弹出窗口要求输入账号密码输入账号=sa密码=123456确认
3后端返回数据信息
4后续再次访问接口时无需重复输入账号密码
*/
// 资源接口 ---- http://localhost:8081/basic/getInfo
@RequestMapping("getInfo")
public SaResult login() {
// 1Http Basic 认证校验账号=sa密码=123456
SaBasicUtil.check("sa:123456");
// 2返回数据
String data = "这是通过 Http Basic 校验后才返回的数据";
return SaResult.data(data);
}
}

View File

@ -0,0 +1,68 @@
package com.pj.cases.up;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
/**
* Sa-Token 同端互斥登录示例
*
* @author kong
* @since 2022-10-17
*/
@RestController
@RequestMapping("/mutex/")
public class MutexLoginController {
/*
* 前提1准备至少四个浏览器ABCD
* 前提2配置文件需要把 sa-token.is-concurrent 的值改为 false
*
* 测试步骤
1在浏览器A上登录账号10001设备为PC ---- http://localhost:8081/mutex/login?userId=10001&device=PC
检查是否登录成功返回true ---- http://localhost:8081/mutex/isLogin
2在浏览器B上登录账号10001设备为APP ---- http://localhost:8081/mutex/login?userId=10001&device=APP
检查是否登录成功返回true ---- http://localhost:8081/mutex/isLogin
3复查一下览器A上的账号是否登录发现并没有顶替下去原因是两个浏览器指定的登录设备不同允许同时在线
---- http://localhost:8081/mutex/isLogin
4在浏览器C上登录账号10001设备为PC ---- http://localhost:8081/mutex/login?userId=10001&device=PC
检查是否登录成功返回true ---- http://localhost:8081/mutex/isLogin
5复查一下浏览器A上的账号是否登录发现账号已被顶替下线
---- http://localhost:8081/mutex/isLogin
6再复查一下浏览器B上的账号是否登录发现账号未被顶替下线因为浏览器B上登录的设备是APP而浏览器C顶替的设备是PC
---- http://localhost:8081/mutex/isLogin
7此时再从浏览器D上登录账号10001设备为APP ---- http://localhost:8081/mutex/login?userId=10001&device=APP
检查是否登录成功返回true ---- http://localhost:8081/mutex/isLogin
8此时再复查一下浏览器B上的账号是否登录发现账号已被顶替下线
---- http://localhost:8081/mutex/isLogin
*/
// 会话登录接口 ---- http://localhost:8081/mutex/doLogin?userId=10001&device=PC
@RequestMapping("login")
public SaResult login(long userId, String device) {
/*
* 参数1要登录的账号
* 参数2此账号在什么设备上登录的
*/
StpUtil.login(userId, device);
return SaResult.ok("登录成功");
}
// 查询当前登录状态 ---- http://localhost:8081/mutex/isLogin
@RequestMapping("isLogin")
public SaResult isLogin() {
// StpUtil.isLogin() 查询当前客户端是否登录返回 true false
boolean isLogin = StpUtil.isLogin();
return SaResult.ok("当前客户端是否登录:" + isLogin + ",登录的设备是:" + StpUtil.getLoginDevice());
}
}

View File

@ -0,0 +1,80 @@
package com.pj.cases.up;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.pj.model.SysUser;
import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
/**
* Sa-Token 会话查询示例
*
* @author kong
* @since 2022-10-17
*/
@RestController
@RequestMapping("/search/")
public class SearchSessionController {
/*
* 测试步骤
1先登录5个账号
---- http://localhost:8081/search/login?userId=10001&张三&age=18
---- http://localhost:8081/search/login?userId=10002&李四&age=20
---- http://localhost:8081/search/login?userId=10003&王五&age=22
---- http://localhost:8081/search/login?userId=10004&赵六&age=24
---- http://localhost:8081/search/login?userId=10005&冯七&age=26
2根据分页参数获取会话列表
http://localhost:8081/search/getList?start=0&size=10
*/
// 会话登录接口 ---- http://localhost:8081/search/login?userId=10001&张三&age=18
@RequestMapping("login")
public SaResult login(long userId, String name, int age) {
// 先登录上
StpUtil.login(userId);
// 再把 User 对象存储在 SaSession
SysUser user = new SysUser();
user.setId(userId);
user.setName(name);
user.setAge(age);
StpUtil.getSession().set("user", user);
// 返回
return SaResult.ok("账号登录成功");
}
// 会话查询接口 ---- http://localhost:8081/search/getList?start=0&size=10
@RequestMapping("getList")
public SaResult getList(int start, int size) {
// 创建集合
List<SaSession> sessionList = new ArrayList<>();
// 分页查询数据
List<String> sessionIdList = StpUtil.searchSessionId("", start, size, false);
for (String sessionId: sessionIdList) {
SaSession session = StpUtil.getSessionBySessionId(sessionId);
sessionList.add(session);
}
// 返回
return SaResult.data(sessionList);
}
// 会话查询接口 ---- http://localhost:8081/disable/logout
@RequestMapping("logout")
public SaResult logout() {
StpUtil.logout();
return SaResult.ok("账号退出成功");
}
}

View File

@ -3,6 +3,8 @@ package com.pj.current;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import cn.dev33.satoken.exception.DisableServiceException;
import cn.dev33.satoken.exception.NotBasicAuthException;
import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.exception.NotPermissionException;
import cn.dev33.satoken.exception.NotRoleException;
@ -47,6 +49,20 @@ public class GlobalException {
return SaResult.error("二级认证校验失败");
}
// 拦截服务封禁异常
@ExceptionHandler(DisableServiceException.class)
public SaResult handlerException(DisableServiceException e) {
e.printStackTrace();
return SaResult.error("当前账号 " + e.getService() + " 服务已被封禁 (level=" + e.getLevel() + ")" + e.getDisableTime() + "秒后解封");
}
// 拦截Http Basic 校验失败异常
@ExceptionHandler(NotBasicAuthException.class)
public SaResult handlerException(NotBasicAuthException e) {
e.printStackTrace();
return SaResult.error(e.getMessage());
}
// 拦截其它所有异常
@ExceptionHandler(Exception.class)
public SaResult handlerException(Exception e) {

View File

@ -26,7 +26,7 @@
- [同端互斥登录](/up/mutex-login)
- [账号封禁](/up/disable)
- [密码加密](/up/password-secure)
- [会话治理](/up/search-session)
- [会话查询](/up/search-session)
- [Http Basic 认证](/up/basic-auth)
- [全局侦听器](/up/global-listener)
- [全局过滤器](/up/global-filter)

View File

@ -75,6 +75,12 @@ http://sa:123456@127.0.0.1:8081/test/test3
```
---
<a class="case-btn" href="https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/cases/up/DisableController.java"
target="_blank">
本章代码示例Sa-Token 账号禁用 —— [ com.pj.cases.up.DisableController.java ]
</a>

View File

@ -230,3 +230,10 @@ public SaResult send() {
```
---
<a class="case-btn" href="https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/cases/up/DisableController.java"
target="_blank">
本章代码示例Sa-Token 账号禁用 —— [ com.pj.cases.up.DisableController.java ]
</a>

View File

@ -43,3 +43,10 @@ StpUtil.getLoginDevice();
StpUtil.getTokenValueByLoginId(10001, "APP");
```
---
<a class="case-btn" href="https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/cases/up/MutexLoginController.java"
target="_blank">
本章代码示例Sa-Token 同端互斥登录 —— [ com.pj.cases.up.MutexLoginController.java ]
</a>

View File

@ -1,4 +1,4 @@
# 会话治理
# 会话查询
尽管框架将大部分操作提供了简易的封装,但在一些特殊场景下,我们仍需要绕过框架,直达数据底层进行一些操作。
@ -83,4 +83,14 @@ for (String sessionId : sessionIdList) {
请根据业务实际水平合理调用API。
> 如果需要实时获取当前登录人数或者需要在用户退出后自动触发某事件等, 建议采用websocket技术。
> 如果需要实时获取当前登录人数或者需要在用户退出后自动触发某事件等,建议采用 WebSocket。
---
<a class="case-btn" href="https://gitee.com/dromara/sa-token/blob/master/sa-token-demo/sa-token-demo-case/src/main/java/com/pj/cases/up/SearchSessionController.java"
target="_blank">
本章代码示例Sa-Token 会话查询 —— [ com.pj.cases.up.SearchSessionController.java ]
</a>