package com.mydreamjob.common.logging; import jakarta.servlet.http.HttpServletRequest; /** 只对 AI 经历接口收紧日志元数据,其他接口保持现状。 */ public final class SensitiveEndpointLogPolicy { private static final String ROOT="/profile/me/work-experience-optimization"; private SensitiveEndpointLogPolicy() {} public static boolean isWorkExperience(HttpServletRequest request) { // servletPath 通常已解码且去掉路径参数;原始 URI 作为前置过滤器和单测的兜底。 if (matches(request.getServletPath())) return true; String path=request.getRequestURI(); String context=request.getContextPath(); if(!context.isEmpty() && path.startsWith(context))path=path.substring(context.length()); // 同时兼容过滤器单测不设置 contextPath 的标准 /api/v1 请求。 if(path.startsWith("/api/v1/"))path=path.substring("/api/v1".length()); try { path=org.springframework.web.util.UriUtils.decode(path,java.nio.charset.StandardCharsets.UTF_8); } catch(IllegalArgumentException ignored) { /* 非法编码由既有 HTTP/安全链拒绝,不记录异常原文。 */ } if(path.startsWith("/api/v1/"))path=path.substring("/api/v1".length()); path=path.replaceAll(";[^/]*", ""); return matches(path); } private static boolean matches(String path) { return path!=null&&(path.equals(ROOT)||path.startsWith(ROOT+"/")); } public static String canonicalPath() { return ROOT; } }