Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Validation 在客户端–;中删除输入时跳过验证程序;这符合JSF规范吗?_Validation_Jsf_Jsf 2_Tampering - Fatal编程技术网

Validation 在客户端–;中删除输入时跳过验证程序;这符合JSF规范吗?

Validation 在客户端–;中删除输入时跳过验证程序;这符合JSF规范吗?,validation,jsf,jsf-2,tampering,Validation,Jsf,Jsf 2,Tampering,我有一个页面,其中输入文本组件标记为required=“true”并在服务器端有一个自定义的Validator 现在作为一个客户端,我提交页面时没有该组件呈现的HTML元素(这可以通过使用浏览器内置的DOM元素检查器从DOM树中删除元素来轻松实现)。表单已成功提交,未对此必需组件进行服务器端验证 这符合JSF规范吗?是否有办法指定即使发布的页面不包含验证程序,也要执行页面中的验证程序?这确实符合规范。以下是(我的重点)的相关摘录: 使用getSubmittedValue()检索提交的值。如果此操

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

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


这符合JSF规范吗?是否有办法指定即使发布的页面不包含验证程序,也要执行页面中的验证程序?

这确实符合规范。以下是(我的重点)的相关摘录:

使用
getSubmittedValue()
检索提交的值。如果此操作返回
null
,并且
总是在需要时执行验证\u为TRUE
上下文参数为TRUE(忽略大小写),请检查“必需”属性的值。如果“required”的值为真,请按以下步骤继续。如果“required”的值为false或未设置required属性,则退出,无需进一步处理。如果未设置上下文参数,或设置为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>

javax.faces.ALWAYS在需要时执行验证
真的
请注意,这个上下文参数是自JSF2.3以来的新参数,并被后移植到Mojarra 2.2.16、2.1.29-10和1.2_15-06中。旧版本中不支持它。另见和

这是否有害取决于业务逻辑。一个设计得很好的模型(业务逻辑和/或数据模型)不考虑代码“> null /代码>,如预期的那样,会在其他地方引起空指针异常,或者SQL约束违反(<代码> NULL NUL/CODE >),这通常会在HTTP 500错误响应中结束。但是,如果模型实际上将
null
视为预期情况,那么它很可能是模型中的错误。视图(JSF页面)仅用于表示模型,因此对它几乎无能为力

如果业务逻辑或数据模型不能被更改为考虑代码<空NU/COD>作为一个特殊的情况(即从不假定/接受给定值为“代码> null <代码>”,并且您恰巧使用JPA,那么您最好在属性上添加<代码> @ NoTnL</代码>。虽然JSF将绕过对它的验证,但JPA仍将对它进行验证,导致异常和HTTP500错误。在这种情况下,我只想知道为什么DB列首先没有

notnull
约束。或者,也可以这样做

需要注意的是,MyFaces会记录如下警告:

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


感谢您提供javadoc摘录,它非常清楚地解释了行为。正如您所提到的,它造成的危害取决于业务逻辑:可能会在出现空指针异常之前部分更新应用程序范围的对象,从而导致整个应用程序崩溃。您能否同时回答问题的第二部分:即使输入为null,也可以强制进行验证吗?如果不攻击JSF,就不能这样做。如果您碰巧使用OmniFaces,您最好的选择是通过支持类级Bean验证的
强制BV(JSR303 Bean验证;
@NotNull
和friends)。感谢您更新JSF中上下文参数的可用性。