【问题标题】:Render a disabled button in JSF在 JSF 中渲染一个禁用的按钮
【发布时间】:2011-09-01 14:41:09
【问题描述】:

我正在尝试呈现一个按钮,该按钮最初应禁用,并在某些时候由客户端操作启用。我正在使用带有以下代码的 a4j 组件:

<a4j:commandButton id="myButton" disabled="true" onclick="myFunction()">

问题是当disabled属性设置为true时,事件没有附加到组件,导致这个html代码:

<input type="button" onclick="return false" ... />

所以当我尝试通过 javascript 启用时,按钮已启用,但按钮没有附加事件侦听器。

到目前为止,我能想到的唯一两个解决方案是:

  • 将 disabled 属性的值分配给 bean 属性并重新呈现按钮。
  • 最初通过 javascript 在加载页面上启用和禁用渲染

两个选项都可以,但不是很干净,我不想每次启用按钮时都向服务器提出请求。

【问题讨论】:

    标签: jsf richfaces


    【解决方案1】:

    这就是 JSF 等基于有状态组件的 MVC 框架的工作原理。作为防止篡改/黑客请求的一部分,框架会在输入元素即将应用请求值时重新评估输入元素的disabled(和rendered)属性。否则,最终用户将能够调用操作或提交服务器端限制不允许他们执行的操作或提交值,这可能会为攻击敞开大门。

    您提到的两种解决方案都很好。如果您不想让最终用户篡改/破解它,我会选择第一个。用ajax就可以轻松搞定。

    【讨论】:

    • 重新渲染的问题是启用/禁用附加到两个表的状态,由 onRowClick 事件控制,我不想用不必要的请求淹没我的服务器.
    • 如果您不关心安全问题,请选择第二个选项。
    • 我没有看到这种情况下的安全漏洞?通过 javascript 启用/禁用组件有什么问题?我认为它更像是一个业务问题,因为它可能不会发送所有需要的数据,但通过正确的验证/卫生它会解决它,有什么我没有看到的吗?
    • 那么在您的特定用例中根本没有安全问题。在重要的情况下,按钮的存在可能例如取决于用户角色。如果 JSF 没有在服务器端重新检查它,最终用户(阅读:黑客)将能够调用她/他不允许执行的操作或设置值。
    • 啊,当然。我在那里有点慢,我将权限管理与渲染属性相关联,而不是与禁用属性相关联
    猜你喜欢
    • 1970-01-01
    • 2010-11-17
    • 2015-12-25
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    相关资源
    最近更新 更多