配置 Filter 進行登錄權限控制後,訪問受保護頁面返回 404。
// 原代碼
if (info.getName() != null) {
filter.doFilter(request, response); // 放行
}
// 缺少 return,且未處理未登錄情況的重定向
正確邏輯:
UserInfo info = (UserInfo) session.getAttribute("userinfo");
if (info != null && info.getName() != null) {
chain.doFilter(request, response); // 已登錄,繼續鏈
return; // 重要:防止繼續執行後續重定向
}
// 未登錄
response.sendRedirect(request.getContextPath() + "/error.jsp"); // 使用上下文路徑
../error.jsp 相對路徑在 Filter 中不可靠,應用 request.getContextPath() 構建絕對路徑。<filter>
<filter-name>authFilter</filter-name>
<filter-class>com.xxx.UserFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>authFilter</filter-name>
<url-pattern>/show.jsp</url-pattern> <!-- 僅攔截需保護頁面 -->
</filter-mapping>
注意:login.jsp、error.jsp、**靜態資源** 不應被攔截,否則形成死循環或 404。
chain.doFilter() 並 return。${contextPath}/error.jsp。url-pattern 僅攔截業務頁面。