我想創建一個jsp登錄過濾器。jsp過濾器,獲取頁面名稱
過濾器應:
- 攔截請求的任何頁面;驗證請求是否是一個登錄會話
- 如果會話沒有登錄的一部分,客戶端重定向到登錄頁面
- 如果請求的頁面的登錄頁面,不要重定向,否則它將循環
在此先感謝
我想創建一個jsp登錄過濾器。jsp過濾器,獲取頁面名稱
過濾器應:
在此先感謝
濾波器的實現方案概述(無碼,我假設你知道Servlet API的,這是前提)。
截取到任何頁面的請求;驗證請求是否是一個登錄會話
你應該是創建Servlet過濾器的一部分,並將其映射對/*
,這樣對應用程序的所有請求都將被該過濾器攔截。假定使用會話屬性完成對已認證用戶的跟蹤。您可以從過濾器中的HttpServletRequest
對象中提取會話,並使用getAttribute()
方法提取屬性。
如果會話沒有登錄,將客戶端重定向到登錄頁面
如果會話或屬性不存在,或者屬性是假的,那麼你就需要重定向用戶登錄到登錄頁面,使用HttpServletResponse對象上的sendRedirect()
方法。
如果請求的頁面的登錄頁面,不要重定向,否則會循環
您可以確定該請求是否是使用getServletPath()方法在HttpServletRequest的登錄頁面目的。
/ApplicationContext/
目錄*:但是,如果你做以下這是不必要的。/ApplicationContext/protected
目錄中。/protected
而不是/*
。因此過濾器將攔截僅對受保護資源的請求。將任何資源映射到其他路徑時要小心。* ApplicationContext是您的應用程序的上下文路徑。如果您的網站是http://example.com/App
那麼上下文通常是App
。因此,您的登錄頁面應爲http://example.com/App/login.jsp
,而受保護的頁面將被訪問爲http://example.com/App/protected/secret.jsp
將受限制的頁面放入特定的文件夾中,例如,/secured
,/app
,/private
,/admin
等,並且將過濾器(或容器管理的安全約束)映射到完全覆蓋該文件夾的URL模式,例如, /secured/*
,/app/*
,/private/*
,/admin/*
等。最後只需將登錄頁面放在該文件夾之外。
在our servlet filter wiki page你可以找到一個代碼示例,其中涵蓋了這種情況。
該死的,這是一個標籤的巨大頁面。 – 2011-06-13 14:58:43
謝謝你的確切答案。 1)爲什麼不使用request.getUserPrincipal()而不是「手動」將數據存儲在屬性中? 2)getServletPath()將在「歡迎文件」的情況下失敗(也許其他jsf情況...?)。它將返回目錄,而不是servlet名稱 – AgostinoX 2011-06-13 14:38:41
request.getUserPrincipal()和request.getRemoteUser()將用於容器管理器身份驗證。如果您正在使用該功能,請繼續並替換談話會話屬性的步驟。如果你沒有使用容器管理認證,並且已經推出了你的方案,那麼這些方法將返回null。 – 2011-06-13 14:42:28
關於getServletPath()的主題,它在某些情況下會失敗。我不記得哪個(可能是目錄,正如你所說的)。這就是我提出分離內容的原因。 – 2011-06-13 14:43:14