2011-07-30 61 views
4

我遇到問題。我想阻止用戶訪問頁面而無需在jsf2中登錄。當用戶直接將受限制的頁面URL寫入瀏覽器時,他/她不應該看到該頁面。這就像上面的情況一樣,他/她必須被重定向到登錄頁面。我怎樣才能以編程方式做到這一點?防止訪問受限制的頁面而無需在Jsf2中登錄

回答

12

這取決於你如何已編程登錄。您似乎正在使用本地認證,其中您將登錄用戶設置爲會話作用域管理bean的屬性。因爲使用Java EE提供的容器管理登錄,阻止訪問受限制的頁面已被考慮在內。

假設你都限制在某個URL圖樣頁面,如/app/*/secured/*等和你的會話範圍的bean有管理bean的名字user,那麼你可以使用一個filter作業。實施doFilter()方法如下:

@Override 
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
    HttpServletRequest request = (HttpServletRequest) req; 
    HttpServletResponse response = (HttpServletResponse) res; 
    HttpSession session = request.getSession(false); 
    User user = (session != null) ? (User) session.getAttribute("user") : null; 

    if (user == null || !user.isLoggedIn()) { 
     response.sendRedirect("/login.xhtml"); // No logged-in user found, so redirect to login page. 
    } else { 
     chain.doFilter(req, res); // Logged-in user found, so just continue request. 
    } 
} 

地圖這個過濾器上覆蓋受限頁面的URL模式。

此外,您需要確保您已禁用這些頁面上的瀏覽器緩存,否則最終用戶在註銷後仍能夠從瀏覽器緩存中看到它們。你也可以爲此使用一個過濾器。你甚至可以在同一個過濾器中完成。另請參閱Browser back button doesn't clear old backing bean values

1

你試圖寫一個過濾器...你可以攔截所有的呼叫檢查用戶訪問的網頁如果沒有可以將用戶重定向到登錄頁面...

相關問題