|
|
@@ -59,6 +59,11 @@ public class JwtInterceptor implements HandlerInterceptor {
|
|
|
"/api/mind/traditional/compatibility"
|
|
|
};
|
|
|
|
|
|
+ // 必须登录才能访问的路径:anonymous 访问直接 401(这些接口消耗微信配额/写数据/扣积分)
|
|
|
+ private static final String[] LOGIN_REQUIRED_PATHS = {
|
|
|
+ "/api/share/qrcode" // 生成海报小程序码:anonymous 会反复触发微信 access_token 失效("not latest")
|
|
|
+ };
|
|
|
+
|
|
|
@Override
|
|
|
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
|
|
|
// 放 OPTIONS 请求
|
|
|
@@ -75,14 +80,28 @@ public class JwtInterceptor implements HandlerInterceptor {
|
|
|
|
|
|
// 获取token
|
|
|
String token = request.getHeader("Authorization");
|
|
|
-
|
|
|
+
|
|
|
if (!StringUtils.hasText(token)) {
|
|
|
// 尝试从参数中获取
|
|
|
token = request.getParameter("token");
|
|
|
}
|
|
|
|
|
|
-if (!StringUtils.hasText(token)) {
|
|
|
- log.debug("请求 {} 无Token,设为匿名用户", request.getRequestURI());
|
|
|
+ boolean hasToken = StringUtils.hasText(token);
|
|
|
+ boolean loginRequired = false;
|
|
|
+ for (String requiredPath : LOGIN_REQUIRED_PATHS) {
|
|
|
+ if (path.equals(requiredPath) || path.startsWith(requiredPath)) {
|
|
|
+ loginRequired = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!hasToken) {
|
|
|
+ if (loginRequired) {
|
|
|
+ log.debug("请求 {} 需登录但无Token,拒绝", path);
|
|
|
+ writeUnauthorized(response);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ log.debug("请求 {} 无Token,设为匿名用户", path);
|
|
|
setAnonymousUser(request);
|
|
|
return true;
|
|
|
}
|
|
|
@@ -122,12 +141,23 @@ if (!StringUtils.hasText(token)) {
|
|
|
|
|
|
return true;
|
|
|
} catch (Exception e) {
|
|
|
+ if (loginRequired) {
|
|
|
+ log.debug("请求 {} 需登录但Token解析失败,拒绝: {}", path, e.getMessage());
|
|
|
+ writeUnauthorized(response);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
log.warn("Token解析失败: {}, 设为匿名用户", e.getMessage());
|
|
|
setAnonymousUser(request);
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private void writeUnauthorized(HttpServletResponse response) throws java.io.IOException {
|
|
|
+ response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
|
|
|
+ response.setContentType("application/json;charset=UTF-8");
|
|
|
+ response.getWriter().write("{\"code\":401,\"message\":\"请先登录\",\"data\":null}");
|
|
|
+ }
|
|
|
+
|
|
|
private void setAnonymousUser(HttpServletRequest request) {
|
|
|
request.setAttribute("userId", -1L);
|
|
|
request.setAttribute("role", "anonymous");
|