2012-04-23 92 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

相关问题