如何从非人脸请求中调用 JSF 支持 bean 方法?

Posted

技术标签:

【中文标题】如何从非人脸请求中调用 JSF 支持 bean 方法?【英文标题】:How to invoke a JSF backing bean method from a non-faces request? 【发布时间】:2011-03-13 06:26:06 【问题描述】:

对于使用单点登录以 JSF 编写的 Web 应用程序,我们需要替换当前的登录名。目前,我们的 login.jsp 调用后备 bean 上的 authenticate 方法来实现这一点并执行额外的角色验证。现在身份验证将由我的单点登录服务器完成,但我如何调用支持 bean 上的身份验证方法来执行角色验证

【问题讨论】:

【参考方案1】:

将请求参数设置为托管属性,并使用@PostConstruct注解在bean构造和托管属性设置后立即执行一些代码。

您可以将 GET 或 POST 请求参数设置为托管属性,如下所示:

<managed-bean>
    <managed-bean-name>bean</managed-bean-name>
    <managed-bean-class>mypackage.Bean</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
    <managed-property>
        <property-name>name1</property-name>
        <value>#param.name1</value>
    </managed-property>
    <managed-property>
        <property-name>name2</property-name>
        <value>#param.name2</value>
    </managed-property>
</managed-bean>

或者如果您已经在使用 JSF 2.0,那么您可以使用 @ManagedProperty:

@ManagedProperty(value="#param.name1")
private String name1;

@ManagedProperty(value="#param.name2")
private String name2;

当最终用户使用name1=value1&amp;name2=value2 查询字符串触发 GET 或 POST 请求时,将设置这些参数。 #param.name1 EL 表达式基本上代表request.getParameter("name1") 的结果。

现在创建一个@PostConstruct 方法,如下所示:

@PostConstruct
public void init() 
    if (name1 != null && name2 != null) 
        // Both request parameters are been set. Do your thing here!
    

【讨论】:

你好 baslusc,但是你将如何调用 bean 的创建呢?因为 @PostConstruct 只会在创建 bean 后使用。因为当请求是面孔请求时会调用 bean 创建,但在这种情况下,请求是非面孔请求。 @Tarun:如果是非人脸请求,那么您需要寻找非人脸解决方案。一个简单的 servlet 或者一个过滤器。 这正是我的意思(一个简单的 servlet),但问题似乎偏离了目标,因为它指出“如何从非面孔请求调用 JSF 支持 bean 方法?”所以它谈论的是从非面孔请求中调用 JSF bean。您的答案中解释的概念涉及 JSF bean 的调用。但由于在问题中写的是“非面孔”请求,所以我无法理解您在问题上下文中的回答。 @Tarun:将 bean 的原始代码重构为一个单独的类,您可以在 servlet 和支持 bean 中导入/使用它。

以上是关于如何从非人脸请求中调用 JSF 支持 bean 方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JSF 页面加载之前在支持 bean 中启动特殊的 init 事件?

JSF 如何从支持 bean 重定向到支持 bean 中动态构建的 URL?

使用 URL 参数的 JSF 托管 Bean 方法调用

如何从过滤器中读取 JSF 会话 bean?

JSF 获取托管 bean 中的当前操作

从支持 Bean 刷新 JSF/PrimeFaces 接口