JSF 是否阻止通过篡改请求调用未呈现的托管 bean 操作
Does JSF prevent calls to unrendered managed bean actions by tampered requests
托管 bean 中的方法受 JSF 保护?见代码:
托管 Bean
@ManagedBean
public class My {
public void test() {
System.out.println("called");
}
}
XHTML
<h:form>
<h:commandButton rendered="true" action="#{my.test}" value="Teste" />
</h:form>
如果按钮未呈现 (rendered="false"),可以完成 HTTP POST 请求(就像按钮一样)并调用 test() 方法?
换句话说,JSF 防止通过篡改请求调用托管 beans 方法?
In other words, JSF prevents calls to managed beans methods by tampered requests?
是的。
JSF 在应用请求值阶段重新评估组件的 rendered
属性。如果它是 false
,那么在 UICommand
组件的情况下, ActionEvent
根本不会排队,无论(篡改的)HTTP 请求参数是否指示按钮正在被按下。
JSF 对 disabled
和 readonly
属性以及 UIInput
组件的请求也有类似的保护措施。并且,在 UISelectOne
/UISelectMany
组件中,JSF 将验证提交的值是否确实是提供的可用选项的一部分。
JSF 在视图状态的帮助下也完成了这一切。如果 JSF 是无状态的,那么如果这些属性突然变为请求范围而不是视图范围,那么一个或另一个可能会失败的风险会更大。
另请参阅:
- commandButton/commandLink/ajax action/listener method not invoked or input value not updated - 第 5 点
- Validation Error: Value is not valid
- What is the usefulness of statelessness in JSF?
托管 bean 中的方法受 JSF 保护?见代码:
托管 Bean
@ManagedBean
public class My {
public void test() {
System.out.println("called");
}
}
XHTML
<h:form>
<h:commandButton rendered="true" action="#{my.test}" value="Teste" />
</h:form>
如果按钮未呈现 (rendered="false"),可以完成 HTTP POST 请求(就像按钮一样)并调用 test() 方法?
换句话说,JSF 防止通过篡改请求调用托管 beans 方法?
In other words, JSF prevents calls to managed beans methods by tampered requests?
是的。
JSF 在应用请求值阶段重新评估组件的 rendered
属性。如果它是 false
,那么在 UICommand
组件的情况下, ActionEvent
根本不会排队,无论(篡改的)HTTP 请求参数是否指示按钮正在被按下。
JSF 对 disabled
和 readonly
属性以及 UIInput
组件的请求也有类似的保护措施。并且,在 UISelectOne
/UISelectMany
组件中,JSF 将验证提交的值是否确实是提供的可用选项的一部分。
JSF 在视图状态的帮助下也完成了这一切。如果 JSF 是无状态的,那么如果这些属性突然变为请求范围而不是视图范围,那么一个或另一个可能会失败的风险会更大。
另请参阅:
- commandButton/commandLink/ajax action/listener method not invoked or input value not updated - 第 5 点
- Validation Error: Value is not valid
- What is the usefulness of statelessness in JSF?