在客户端删除输入时跳过验证器 - 这是按照JSF规范吗?

时间:2013-07-21 15:35:27

标签: validation jsf jsf-2 tampering

我有一个页面,其输入文本组件标记为required="true",并且在服务器端具有自定义Validator

现在作为客户端,我提交的页面没有该组件呈现的HTML元素(这可以通过使用浏览器的内置DOM元素检查器从DOM树中删除元素来轻松实现)。表单已成功提交,无需服务器端验证此必需组件。

这是按照JSF规范吗?有没有办法指定即使发布的页面不包含页面中的验证器也会被执行?

1 个答案:

答案 0 :(得分:7)

这确实符合规范。这是UIInput#validate() javadoc(强调我的)的相关摘录:

  

使用getSubmittedValue()检索提交的值。如果返回null,并且ALWAYS_PERFORM_VALIDATION_WHEN_REQUIRED_IS_TRUE context-param的值为true(忽略大小写),请检查" required"的值。属性。如果"值为"是的,继续如下。如果"值为"为false或未设置required属性,退出而不进行进一步处理。如果未设置context-param,或者设置为false(忽略大小写),则退出而不进行进一步处理。 (这表示没有为此组件提交任何值。)

空输入将发送空字符串,而不是null。完全没有输入将发送null,而不是空字符串。

您可以通过添加以下上下文参数来禁用观察到的行为:

<context-param>
    <param-name>javax.faces.ALWAYS_PERFORM_VALIDATION_WHEN_REQUIRED_IS_TRUE</param-name>
    <param-value>true</param-value>
</context-param>

请注意,此上下文参数自JSF 2.3以来是新的,并且已向后移植到Mojarra 2.2.16,2.1.29-10和1.2_15-06。旧版本不支持它。另请参阅JSFSPEC-1433the expert group discussion about this issue

这是否有害取决于业务逻辑。一个设计得很好的模型(业务逻辑和/或数据模型),它不会将null视为预期的情况,会导致其他地方出现空指针异常,或者导致SQL约束违规(NOT NULL),通常会以HTTP 500错误响应结束。但如果模型实际上将null视为预期的情况,那么它可能是模型中的错误。只想呈现模型的视图(JSF页面)可以对它做一点反对。

如果真的不能改变业务逻辑或数据模型以将null视为例外情况(即从不假设/接受给定值为null),并且您碰巧使用JPA,那么您最好的选择是在酒店添加@NotNull。虽然JSF将绕过它的验证,但JPA仍将对其进行验证,导致仍然存在异常和HTTP 500错误。在这种情况下,我只想知道为什么DB列首先没有NOT NULL约束。或者,执行class level validation

注意到MyFaces应该在下面记录如下警告:

  

2016年3月16日上午8:55:52 org.apache.myfaces.shared.renderkit.html.HtmlRendererUtils decodeUIInput
  警告:如果输入已呈现,其表单已提交,并且最初未呈现为禁用或只读,则应始终为输入提交值。通过javascript禁用输入元素后,您无法提交表单。考虑将只读设置为true,或者在表单提交之前将禁用值重置为false   组件:{Component-Path:[Class:javax.faces.component.UIViewRoot,ViewId:/test.xhtml][Class:javax.faces.component.html.HtmlBody,Id:j_id_5] [Class:javax.faces.component .html.HtmlForm,Id:j_id_6] [类:javax.faces.component.html.HtmlInputText,Id:j_id_7]位置:/ test.xhtml第22行和第33列}