1

让我给你一个关于系统如何工作的想法。

我正在使用 JAAS 登录模块进行登录和角色管理。我可以根据我的角色访问特定页面。

我在地址栏中输入我的网址,按回车键。

登录页面出现,正确登录后,它会将我重定向到正确的页面(现在我们称之为 page1.jsf)。

我想在页面加载时调用服务器端方法。

你能帮我吗?

** 编辑 **

假设我必须访问 page1.jsf 只能由 role1 访问。

在地址栏中,我输入http://localhost:8080/myapp/page1.jsf

JAAS 显示登录页面,正确输入凭据后,我被重定向到 page1.jsf

一旦请求 page1.jsf 或页面加载,我想从我的类中调用服务器端方法来重新加载 page1.jsf

4

2 回答 2

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()执行重定向到正确的页面。

@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) {
        ...
    }

   }

}

查看此示例 并查看此相关问题

于 2012-04-23T07:21:05.397 回答
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/TestServletwhich 然后调用您的方法。

于 2012-04-23T07:16:00.197 回答