攔截器邏輯錯誤:常見錯誤模式——攔截器中檢測到Session已有user對象,直接判定為「已登錄」並阻止再次登錄請求,而非允許覆蓋或並發。
public String intercept(ActionInvocation invocation) {
HttpSession session = ServletActionContext.getRequest().getSession();
if (session.getAttribute("user") != null) {
return "already_logged_in"; // 錯誤:直接攔截,不允許重新登錄
}
return invocation.invoke();
}
session.setAttribute("user", newUser)。excludeMethods或allowedMethods放行。userId -> sessionId映射,新登錄時踢舊Session(調用session.invalidate()),而非單純攔截。// 登錄 Action
public String login() {
// 驗證用戶名密碼...
// 若需強制單點:SessionManager.kickOff(userId); // 移除舊Session
session.put("user", user);
return SUCCESS;
}
// 攔截器
public String intercept(ActionInvocation inv) {
String actionName = inv.getProxy().getActionName();
if ("login".equals(actionName) || "register".equals(actionName)) {
return inv.invoke(); // 登錄/註冊不攔截
}
if (session.get("user") == null) return LOGIN; // 未登錄跳轉
return inv.invoke();
}