後端查詢到完整郵箱,前端 JSP 頁面顯示時需將中間部分替換為 `*`(如 `zha****ng@example.com`)。
public static String maskEmail(String email) {
if (email == null || !email.contains("@")) return email;
String[] parts = email.split("@");
String prefix = parts[0];
String domain = parts[1];
if (prefix.length() <= 3) {
return prefix.charAt(0) + "***" + "@" + domain;
}
int keepStart = 2;
int keepEnd = 1;
String masked = prefix.substring(0, keepStart)
+ "****"
+ prefix.substring(prefix.length() - keepEnd)
+ "@" + domain;
return masked;
}
@GetMapping("/user/profile")
public String profile(Model model) {
User user = userService.getCurrentUser();
model.addAttribute("maskedEmail", maskEmail(user.getEmail()));
return "profile";
}
<%@ taglib prefix="fn" uri="https://java.sun.com/jsp/jstl/functions" %>
<%
String email = (String) request.getAttribute("email");
String masked = "";
if (email != null && email.contains("@")) {
String[] parts = email.split("@");
String pre = parts[0];
masked = pre.substring(0, Math.min(2, pre.length()))
+ "****"
+ (pre.length() > 3 ? pre.substring(pre.length()-1) : "")
+ "@" + parts[1];
}
%>
<span><%= masked %></span>
<c:set var="email" value="${user.email}" />
<c:set var="parts" value="${fn:split(email, '@')}" />
<c:set var="pre" value="${parts[0]}" />
<c:set var="domain" value="${parts[1]}" />
<c:choose>
<c:when test="${fn:length(pre) le 3}">
${fn:substring(pre, 0, 1)}***@${domain}
</c:when>
<c:otherwise>
${fn:substring(pre, 0, 2)}****${fn:substring(pre, fn:length(pre)-1)}@${domain}
</c:otherwise>
</c:choose>
| 維度 | 推薦做法 |
|---|---|
| 安全性 | 後端脫敏,前端只顯示,避免原始數據傳輸 |
| 復用性 | 封裝為工具類/自定義標簽/EL 函數 |
| 靈活性 | 支持配置保留前綴/後綴長度、掩碼字符 |
| 擴展性 | 同樣邏輯適用手機號、身份證、銀行卡等 |