2011-06-13 103 views
1

我想創建一個jsp登錄過濾器。jsp過濾器,獲取頁面名稱

過濾器應:

  • 攔截請求的任何頁面;驗證請求是否是一個登錄會話
  • 如果會話沒有登錄的一部分,客戶端重定向到登錄頁面
  • 如果請求的頁面的登錄頁面,不要重定向,否則它將循環

在此先感謝

回答

1

濾波器的實現方案概述(無碼,我假設你知道Servlet API的,這是前提)。

截取到任何頁面的請求;驗證請求是否是一個登錄會話

你應該是創建Servlet過濾器的一部分,並將其映射對/*,這樣對應用程序的所有請求都將被該過濾器攔截。假定使用會話屬性完成對已認證用戶的跟蹤。您可以從過濾器中的HttpServletRequest對象中提取會話,並使用getAttribute()方法提取屬性。

如果會話沒有登錄,將客戶端重定向到登錄頁面

如果會話或屬性不存在,或者屬性是假的,那麼你就需要重定向用戶登錄到登錄頁面,使用HttpServletResponse對象上的sendRedirect()方法。

如果請求的頁面的登錄頁面,不要重定向,否則會循環

您可以確定該請求是否是使用getServletPath()方法在HttpServletRequest的登錄頁面目的。

  • 把登錄頁面和其他「公共」的內容在文檔根目錄中,即在/ApplicationContext/目錄*:但是,如果你做以下這是不必要的。
  • 將受保護的內容(包括所有servlet映射)放入/ApplicationContext/protected目錄中。
  • 僅將過濾器映射到/protected而不是/*。因此過濾器將攔截僅對受保護資源的請求。將任何資源映射到其他路徑時要小心。

* ApplicationContext是您的應用程序的上下文路徑。如果您的網站是http://example.com/App那麼上下文通常是App。因此,您的登錄頁面應爲http://example.com/App/login.jsp,而受保護的頁面將被訪問爲http://example.com/App/protected/secret.jsp

+0

謝謝你的確切答案。 1)爲什麼不使用request.getUserPrincipal()而不是「手動」將數據存儲在屬性中? 2)getServletPath()將在「歡迎文件」的情況下失敗(也許其他jsf情況...?)。它將返回目錄,而不是servlet名稱 – AgostinoX 2011-06-13 14:38:41

+0

request.getUserPrincipal()和request.getRemoteUser()將用於容器管理器身份驗證。如果您正在使用該功能,請繼續並替換談話會話屬性的步驟。如果你沒有使用容器管理認證,並且已經推出了你的方案,那麼這些方法將返回null。 – 2011-06-13 14:42:28

+0

關於getServletPath()的主題,它在某些情況下會失敗。我不記得哪個(可能是目錄,正如你所說的)。這就是我提出分離內容的原因。 – 2011-06-13 14:43:14

1

將受限制的頁面放入特定的文件夾中,例如,/secured,/app,/private,/admin等,並且將過濾器(或容器管理的安全約束)映射到完全覆蓋該文件夾的URL模式,例如, /secured/*,/app/*,/private/*,/admin/*等。最後只需將登錄頁面放在該文件夾之外。

our servlet filter wiki page你可以找到一個代碼示例,其中涵蓋了這種情況。

+0

該死的,這是一個標籤的巨大頁面。 – 2011-06-13 14:58:43