@@ -135,15 +135,49 @@ public class SaTokenConfigure implements WebMvcConfigurer {
135
135
- 可能2:你访问的接口可能是404了,SpringBoot环境下如果访问接口404后,会被转发到` /error ` ,然后被再次拦截。请确保你访问的 path 有对应的 Controller 承接!
136
136
- 可能3:可能这里并没有拦截,但是又被其他地方拦截了。请先把这个拦截器给注释掉,看看还会不会拦截,如果依然拦截,那说明不是这个拦截器的锅,请仔细查看一下控制台抛出的堆栈信息,定位一下到底是哪行代码拦截住这个请求的。
137
137
- 可能4:后端拦截的 path 未必是你前端访问的这个path,建议先打印一下 path 信息,看看和你预想的是否一致,再做分析。
138
- - 可能5:你写了多个匹配规则,请求只越过了第一个规则,被其它规则拦下了,例如以下代码:
139
138
``` java
139
+ // 打印一下,看看后端接受到的path,是否和你前端访问时的一致,如果不一致,先找找原因为啥不一致
140
+ registry. addInterceptor(new SaInterceptor (handler - > {
141
+ System . out. println(" 前端访问的 path 是:" + SaHolder . getRequest(). getRequestPath());
142
+ StpUtil . checkLogin();
143
+ })). addPathPatterns(" /**" );
144
+ ```
145
+ - 可能5:你的项目配置了 ` context-path ` 上下文地址,比如 ` server.servlet.context-path=/shop ` ,注意这个地址是不需要加在拦截器上的:
146
+ ``` java
147
+ // 这是错误示例,不需要把 context-path 上下文参数写在下面的 excludePathPatterns 地址上。
148
+ registry. addInterceptor(new SaInterceptor (hadnle - > StpUtil . checkLogin()))
149
+ .addPathPatterns(" /**" ). excludePathPatterns(" /shop/user/login" );
150
+ // 这是正确示例,无论你的 context-path 上下文配置了什么样的值,下面的 excludePathPatterns 地址都不需要写上它
151
+ registry. addInterceptor(new SaInterceptor (hadnle - > StpUtil . checkLogin()))
152
+ .addPathPatterns(" /**" ). excludePathPatterns(" /user/login" );
153
+ ```
154
+ - 可能6:你写了多个匹配规则,请求只越过了第一个规则,被其它规则拦下了,例如以下代码:
155
+ ``` java
156
+ // 以下代码,当你未登录访问 `/user/doLogin` 时,会被第1条规则越过,然后被第2条拦下,校验登录,然后抛出异常:`NotLoginException:xxx`
140
157
registry. addInterceptor(new SaInterceptor (handler - > {
141
158
SaRouter . match(" /**" ). notMatch(" /user/doLogin" ). check(r - > StpUtil . checkLogin()); // 第1个规则
142
159
SaRouter . match(" /**" ). notMatch(" /article/getList" ). check(r - > StpUtil . checkLogin()); // 第2个规则
143
160
SaRouter . match(" /**" ). notMatch(" /goods/getList" ). check(r - > StpUtil . checkLogin()); // 第3个规则
144
161
})). addPathPatterns(" /**" );
145
162
```
146
- 以上代码,当你未登录访问 ` /user/doLogin ` 时,会被第1条规则越过,然后被第2条拦下,校验登录,然后抛出异常:` NotLoginException:xxx `
163
+ - 可能7:你自定义的封装方法,并没有按照你的预想情况执行:
164
+ ``` java
165
+ public void addInterceptors(InterceptorRegistry registry) {
166
+ registry. addInterceptor(new SaInterceptor (handle - > {
167
+ // 调用自定义的 excludePaths() 方法获取数据排除鉴权
168
+ SaRouter . match(" /**" ). notMatch(excludePaths()). check(r - > StpUtil . checkLogin());
169
+ })). addPathPatterns(" /**" );
170
+ }
171
+ // 自定义查询排查鉴权的地址方法
172
+ public static List<String > excludePaths() {
173
+ List<String > list = ... // 从数据源查询...;
174
+ return list;
175
+ }
176
+ ```
177
+ 如上方法, ` excludePaths() ` 可能并不会像你预想的一样正确执行返回相应的值,请在 ` .notMatch() ` 处 ` 一律先硬编码写固定死值来测试 ` ,这时就有两种情况:
178
+ - 情况1:写固定死值时,代码能正常执行了,那说明你自定义的 ` excludePaths() ` 方法有问题,执行结果不正确。
179
+ - 情况2:写固定也不行,那说明不是 ` excludePaths() ` 的问题,那再从其它地方开始排查。
180
+
147
181
148
182
149
183
### Q:我在配置文件中加了一些关于 Sa-Token 的配置,但是没有生效。
@@ -276,6 +310,38 @@ springboot 集成 satoken redis 后, 一旦 springboot 切换版本就有可能
276
310
277
311
278
312
313
+ ### Q:我实现了 StpInterface 接口,但是在登录时没有进入我的实现类代码?
314
+ 不进入是正常现象, StpInterface 是鉴权接口,在执行鉴权代码时才会进入 StpInterface 实现类,登录认证时不会进入。
315
+
316
+
317
+ ### Q:启动时报错,找不到 xx 类 xx 方法:
318
+ ``` java
319
+ Caused by: java.lang. ClassNotFoundException : cn.dev33.satoken.same. SaSameTemplate
320
+ ```
321
+
322
+ 一般找不到类,或者找不到方法,都是版本冲突了,使用 Sa-Token 时一定要注意** 版本对齐** ,意思是所有和 Sa-Token 相关的依赖都需要版本一致。
323
+
324
+ 比如说你如果一个依赖是 1.32.0,一个是 1.31.0,就会造成无法启动:
325
+
326
+ ``` xml
327
+ <!-- 如下样例:一个是 `1.32.0`,一个是 `1.31.0`, 版本没对齐,就会造成项目无法启动 -->
328
+ <dependency >
329
+ <groupId >cn.dev33</groupId >
330
+ <artifactId >sa-token-spring-boot-starter</artifactId >
331
+ <version >1.32.0</version >
332
+ </dependency >
333
+ <dependency >
334
+ <groupId >cn.dev33</groupId >
335
+ <artifactId >sa-token-core</artifactId >
336
+ <version >1.31.0</version >
337
+ </dependency >
338
+ ```
339
+
340
+ 请仔细排查你的 pom.xml 文件,是否有 Sa-Token 依赖没对齐,** 请不要肉眼检查,用全局搜索 "sa-token" 关键词来找** ,如果是多模块或者微服务项目,就整个项目搜索。
341
+
342
+
343
+
344
+
279
345
280
346
281
347
<!-- ---------------------------- 常见疑问 ----------------------------- -->
0 commit comments