2025-07-09T11:59:17.901+08:00 ERROR 40300 --- [nio-9901-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: cn.dev33.satoken.exception.Inv
时间: 2025-07-09 21:13:01 AIGC 浏览: 19
在 Spring Boot 应用中,出现 `ERROR 40300 Sa-Token exception cn.dev33.satoken.exception.NotLoginException` 或类似权限异常的问题,通常与用户未登录、Token 失效或配置错误有关。以下是对此类问题的详细分析和处理方案:
### 常见原因及排查方法
1. **未正确登录导致 Token 缺失**
Sa-Token 要求用户必须先通过登录接口获取 Token,并将其放入请求头中(默认为 `Authorization`)。如果请求未携带有效的 Token,系统将抛出 `NotLoginException` 异常[^1]。
```java
// 示例:登录成功后设置 Token
SaLoginUtil.login(userId);
String token = SaLoginUtil.getToken();
```
2. **Token 过期或被踢下线**
Sa-Token 默认的 Token 有效期为 30 分钟。如果用户长时间未操作,或者调用了强制下线方法(如 `SaLoginUtil.kickout(userId)`),则当前 Token 将失效。可通过以下方式延长 Token 生命周期:
```java
// 设置 Token 有效时间为 60 分钟
SaLoginUtil.login(userId, SaTokenInfo.builder().setTimeout(60 * 60).build());
```
3. **跨域请求未正确配置 Token 传递**
如果前端和后端部署在不同域名下,需确保 CORS 配置允许携带 Cookie 或自定义 Header(如 `Authorization`)。否则,Token 可能无法正确传递到后端服务。
4. **多模块或网关环境下 Token 解析失败**
在微服务架构中,若使用网关统一鉴权,需确保网关正确解析并转发 Token 到下游服务。否则,下游服务将因缺少 Token 而触发权限异常。例如,在 Zuul 网关中可添加如下逻辑:
```java
@Component
public class AuthHeaderFilter extends ZuulFilter {
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
String token = ctx.getRequest().getHeader("Authorization");
if (token != null) {
ctx.addZuulRequestHeader("Authorization", token);
}
return null;
}
}
```
5. **Sa-Token 配置项不匹配**
检查 `application.yml` 中的 Sa-Token 配置是否与实际需求一致,尤其是 `sa-token.timeout` 和 `sa-token.is-concurrent` 等关键参数。示例配置如下:
```yaml
sa-token:
timeout: 7200 # Token 有效时间(秒)
is-concurrent: true # 是否启用并发登录
```
6. **SSL/TLS 证书问题引发的远程调用失败**
若应用依赖外部服务(如认证中心),且该服务使用 HTTPS 协议,则可能出现 SSL 握手失败的情况。此时需要将目标服务器的证书导入 Java 的信任库中,或临时禁用 SSL 验证(仅限测试环境):
```java
// 禁用 SSL 验证(不推荐用于生产环境)
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, new TrustManager[]{new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) {}
public void checkServerTrusted(X509Certificate[] chain, String authType) {}
public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; }
}}, new SecureRandom());
HttpClient httpClient = HttpClients.custom().setSSLContext(sslContext).build();
```
### 日志与调试建议
- 查看完整异常堆栈信息,确认具体是哪个组件抛出了 `NotLoginException`。
- 使用 Postman 或 curl 工具模拟请求,验证是否能够正常登录并访问受保护资源。
- 在开发阶段,可以临时开启 Sa-Token 的 debug 模式以获取更详细的日志输出:
```yaml
sa-token:
is-debug: true
```
### 安全性注意事项
- 不要将敏感操作(如修改密码、删除数据)暴露给未授权用户。
- 避免在客户端存储明文 Token,建议使用 HttpOnly Cookie 或安全的本地存储机制。
- 定期清理过期 Token,防止 Token 泄露后被恶意利用。
阅读全文