Browse Source

feat: JwtInterceptor 无token改为设匿名用户(userId=-1)放行,不返回401

预登录页面不再被JWT拦截器拦截,未登录用户以userId=-1通过,
由控制器自行决定返回公开数据还是要求登录。
解决小程序审核中预登录页面被强制要求登录的问题。
Xiaogang Liao 3 months ago
parent
commit
71156ec4aa
1 changed files with 15 additions and 13 deletions
  1. 15 13
      cfc-backend/src/main/java/com/etotem/cfc/config/JwtInterceptor.java

+ 15 - 13
cfc-backend/src/main/java/com/etotem/cfc/config/JwtInterceptor.java

@@ -81,12 +81,10 @@ public class JwtInterceptor implements HandlerInterceptor {
             token = request.getParameter("token");
         }
 
-        if (!StringUtils.hasText(token)) {
-        log.warn("请求 {} 缺少Token", request.getRequestURI());
-        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
-        response.setContentType("application/json; charset=utf-8");
-        response.getWriter().write("{\"code\":401,\"message\":\"请先登录\"}");
-            return false;
+if (!StringUtils.hasText(token)) {
+            log.debug("请求 {} 无Token,设为匿名用户", request.getRequestURI());
+            setAnonymousUser(request);
+            return true;
         }
 
         // 去掉Bearer前缀
@@ -112,7 +110,7 @@ public class JwtInterceptor implements HandlerInterceptor {
             request.setAttribute("role", role);
             request.setAttribute("roles", roles);
 
-            // 设置familyId(查询用户所属家庭)
+// 设置familyId(查询用户所属家庭)
             try {
                 User user = userMapper.selectById(userId);
                 if (user != null && user.getFamilyId() != null) {
@@ -124,11 +122,15 @@ public class JwtInterceptor implements HandlerInterceptor {
 
             return true;
         } catch (Exception e) {
-        log.warn("Token解析失败: {}", e.getMessage());
-        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
-        response.setContentType("application/json; charset=utf-8");
-        response.getWriter().write("{\"code\":401,\"message\":\"登录已过期,请重新登录\"}");
-            return false;
+            log.warn("Token解析失败: {}, 设为匿名用户", e.getMessage());
+            setAnonymousUser(request);
+            return true;
         }
     }
-}
+
+    private void setAnonymousUser(HttpServletRequest request) {
+        request.setAttribute("userId", -1L);
+        request.setAttribute("role", "anonymous");
+        request.setAttribute("roles", Collections.singletonList("anonymous"));
+    }
+}