新增常见问题排查

This commit is contained in:
click33 2022-10-28 18:09:44 +08:00
parent 944e7af8f3
commit e5dc9165d1
4 changed files with 72 additions and 7 deletions

View File

@ -184,7 +184,7 @@ Sa-OAuth2 模块分为四种授权模式,解决不同场景下的授权需求
## 交流群
QQ交流群614714762 [点击加入](https://jq.qq.com/?_wv=1027&k=F96A2mrl)
QQ交流群707350988 [点击加入](https://jq.qq.com/?_wv=1027&k=tqbzHT2D)
微信交流群:

View File

@ -136,7 +136,7 @@ Sa-Token 目前主要五大功能模块:登录认证、权限认证、单点
## 交流群
QQ交流群614714762 [点击加入](https://jq.qq.com/?_wv=1027&k=F96A2mrl)
QQ交流群707350988 [点击加入](https://jq.qq.com/?_wv=1027&k=tqbzHT2D)
微信交流群:

View File

@ -135,15 +135,49 @@ public class SaTokenConfigure implements WebMvcConfigurer {
- 可能2你访问的接口可能是404了SpringBoot环境下如果访问接口404后会被转发到`/error`,然后被再次拦截。请确保你访问的 path 有对应的 Controller 承接!
- 可能3可能这里并没有拦截但是又被其他地方拦截了。请先把这个拦截器给注释掉看看还会不会拦截如果依然拦截那说明不是这个拦截器的锅请仔细查看一下控制台抛出的堆栈信息定位一下到底是哪行代码拦截住这个请求的。
- 可能4后端拦截的 path 未必是你前端访问的这个path建议先打印一下 path 信息,看看和你预想的是否一致,再做分析。
- 可能5你写了多个匹配规则请求只越过了第一个规则被其它规则拦下了例如以下代码
``` java
// 打印一下看看后端接受到的path是否和你前端访问时的一致如果不一致先找找原因为啥不一致
registry.addInterceptor(new SaInterceptor(handler -> {
System.out.println("前端访问的 path 是:" + SaHolder.getRequest().getRequestPath());
StpUtil.checkLogin();
})).addPathPatterns("/**");
```
- 可能5你的项目配置了 `context-path` 上下文地址,比如 `server.servlet.context-path=/shop`,注意这个地址是不需要加在拦截器上的:
``` java
// 这是错误示例,不需要把 context-path 上下文参数写在下面的 excludePathPatterns 地址上。
registry.addInterceptor(new SaInterceptor(hadnle -> StpUtil.checkLogin()))
.addPathPatterns("/**").excludePathPatterns("/shop/user/login");
// 这是正确示例,无论你的 context-path 上下文配置了什么样的值,下面的 excludePathPatterns 地址都不需要写上它
registry.addInterceptor(new SaInterceptor(hadnle -> StpUtil.checkLogin()))
.addPathPatterns("/**").excludePathPatterns("/user/login");
```
- 可能6你写了多个匹配规则请求只越过了第一个规则被其它规则拦下了例如以下代码
``` java
// 以下代码,当你未登录访问 `/user/doLogin`会被第1条规则越过然后被第2条拦下校验登录然后抛出异常`NotLoginExceptionxxx`
registry.addInterceptor(new SaInterceptor(handler -> {
SaRouter.match("/**").notMatch("/user/doLogin").check(r -> StpUtil.checkLogin()); // 第1个规则
SaRouter.match("/**").notMatch("/article/getList").check(r -> StpUtil.checkLogin()); // 第2个规则
SaRouter.match("/**").notMatch("/goods/getList").check(r -> StpUtil.checkLogin()); // 第3个规则
})).addPathPatterns("/**");
```
以上代码,当你未登录访问 `/user/doLogin`会被第1条规则越过然后被第2条拦下校验登录然后抛出异常`NotLoginExceptionxxx`
- 可能7你自定义的封装方法并没有按照你的预想情况执行
``` java
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new SaInterceptor(handle -> {
// 调用自定义的 excludePaths() 方法获取数据排除鉴权
SaRouter.match("/**").notMatch(excludePaths()).check(r -> StpUtil.checkLogin());
})).addPathPatterns("/**");
}
// 自定义查询排查鉴权的地址方法
public static List<String> excludePaths() {
List<String> list = ... // 从数据源查询...;
return list;
}
```
如上方法, `excludePaths()` 可能并不会像你预想的一样正确执行返回相应的值,请在 `.notMatch()``一律先硬编码写固定死值来测试`,这时就有两种情况:
- 情况1写固定死值时代码能正常执行了那说明你自定义的 `excludePaths()` 方法有问题,执行结果不正确。
- 情况2写固定也不行那说明不是 `excludePaths()` 的问题,那再从其它地方开始排查。
### Q我在配置文件中加了一些关于 Sa-Token 的配置,但是没有生效。
@ -276,6 +310,38 @@ springboot 集成 satoken redis 后, 一旦 springboot 切换版本就有可能
### Q我实现了 StpInterface 接口,但是在登录时没有进入我的实现类代码?
不进入是正常现象, StpInterface 是鉴权接口,在执行鉴权代码时才会进入 StpInterface 实现类,登录认证时不会进入。
### Q启动时报错找不到 xx 类 xx 方法:
``` java
Caused by: java.lang.ClassNotFoundException: cn.dev33.satoken.same.SaSameTemplate
```
一般找不到类,或者找不到方法,都是版本冲突了,使用 Sa-Token 时一定要注意**版本对齐**,意思是所有和 Sa-Token 相关的依赖都需要版本一致。
比如说你如果一个依赖是 1.32.0,一个是 1.31.0,就会造成无法启动:
``` xml
<!-- 如下样例:一个是 `1.32.0`,一个是 `1.31.0` 版本没对齐,就会造成项目无法启动 -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.32.0</version>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-core</artifactId>
<version>1.31.0</version>
</dependency>
```
请仔细排查你的 pom.xml 文件,是否有 Sa-Token 依赖没对齐,**请不要肉眼检查,用全局搜索 "sa-token" 关键词来找**,如果是多模块或者微服务项目,就整个项目搜索。
<!-- ---------------------------- 常见疑问 ----------------------------- -->

View File

@ -6,10 +6,9 @@
### 1、加入QQ交流群
![QQ群](https://oss.dev33.cn/sa-token/qq-group-4.png ':size=180')
![QQ群](https://oss.dev33.cn/sa-token/qq-group-2.png ':size=180')
QQ交流群614714762 [点击加入](https://jq.qq.com/?_wv=1027&k=F96A2mrl)
QQ交流群707350988 [点击加入](https://jq.qq.com/?_wv=1027&k=tqbzHT2D)
### 2、加入微信交流群