2012-04-23 54 views
1

讓我給你一個關於系統如何工作的想法。頁面加載時的JSF 2.0調用服務器端方法

我正在使用JAAS登錄模塊進行登錄和角色管理。根據我的角色,我可以訪問特定的頁面。

我在地址欄中輸入我的網址,按回車。

登錄頁面出現後,正確登錄後,它會將我重定向到正確的頁面(現在我們稱之爲page1.jsf)。

我想在頁面加載時調用服務器端方法。

你能幫助我嗎?

**編輯**

假設我要訪問page1.jsf這隻能訪問role1上。

在地址欄中,I型http://localhost:8080/myapp/page1.jsf

JAAS顯示了登錄頁面後輸入正確的憑據,我重定向到一旦page1.jsf

爲page1.jsf請求或頁面加載,我想調用我的類的服務器端方法重新加載page1.jsf

+0

看到這個[相關問題](http://stackoverflow.com/q/5522702/620338) – 2012-04-23 07:25:24

+0

@MattHandy你能給更多關於AjaxBehaviorEvent的信息?我必須重新加載我的頁面幾種類型才能看到應該顯示的所有內容 – sameer 2012-04-23 08:16:17

+0

您不需要此處。也許你需要使用屬性'update =「@ all」'更新你的ajax調用的整個頁面。 – 2012-04-23 08:24:06

回答

2

如果使用JSF 2,您可以用上面的頁面片斷:

<html xmlns="http://www.w3.org/1999/xhtml" 
    ... > 
<f:view contentType="text/html"> 
    <f:event type="preRenderView" listener="#{permissionManager.checkRoles}" /> 
    <f:attribute name="roles" value="ROLE" /> 

    ... 
    </f:view> 
</html> 

您可以添加包含角色的屬性,在PermissionManager.checkRoles()執行重定向到corret頁面。

@Named 
@ApplicationScoped 
class PermissionManager { 
    ... 
    public void checkRoles(ComponentSystemEvent event) { 

     String acl = "" + event.getComponent().getAttributes().get("roles"); 
     //Check user role 
     ... 
     //Redirect if required 
     try { 

     ConfigurableNavigationHandler handler = (ConfigurableNavigationHandler) context 
       .getApplication().getNavigationHandler(); 
     handler.performNavigation("access-denied"); 
    } catch (Exception e) { 
     ... 
    } 

    } 

} 

看看這個example 並看看這個related question

+0

我以前試過,但它不工作 – sameer 2012-04-23 07:39:47

+0

@sameer什麼是你得到的問題? – landal79 2012-04-23 07:49:44

+0

請看現在編輯 – sameer 2012-04-23 08:15:25

0

是的,這是有效的。除了訪問jsp或jsf頁面外,您還可以訪問Servlet。所以創建一個新的servlet。例如:

import java.io.IOException; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

/** 
* Servlet implementation class TestServlet 
*/ 
public class TestServlet extends HttpServlet { 
    private static final long serialVersionUID = 1L; 


    public static void yourMethod() { 
     // do something useful 
    } 

    /** 
    * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
    */ 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     yourMethod(); 
    } 

    /** 
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
    */ 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     // TODO Auto-generated method stub 
    } 

} 

然後在web.xml文件中創建一個新條目,以便將Servlet映射到/。

<servlet> 
    <display-name>TestServlet</display-name> 
    <servlet-name>TestServlet</servlet-name> 
    <servlet-class>your.packages.TestServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>TestServlet</servlet-name> 
    <url-pattern>/TestServlet</url-pattern> 
    </servlet-mapping> 

在此之後,您應該可以調用localhost:8080/TestServlet然後調用您的方法。

+0

沒有servlet被配對使用。我只是想請求我的服務器端的方法一旦請求頁面/加載 – sameer 2012-04-23 07:21:32

相關問題