mit*_*tal 7 validation jsf tampering jsf-2
我有一个页面,其输入文本组件标记为required="true"并Validator在服务器端具有自定义.
现在作为客户端,我提交的页面没有该组件呈现的HTML元素(这可以通过使用浏览器的内置DOM元素检查器从DOM树中删除元素来轻松实现).表单已成功提交,无需服务器端验证此必需组件.
这是按照JSF规范吗?有没有办法指定即使发布的页面不包含它们,也要执行页面中的验证器?
这确实符合规范.以下是UIInput#validate()javadoc(强调我的)的相关摘录:
使用检索提交的值
getSubmittedValue().如果返回null,并且ALWAYS_PERFORM_VALIDATION_WHEN_REQUIRED_IS_TRUEcontext-param的值为true(忽略大小写),请检查"required"属性的值.如果"required"的值为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>
Run Code Online (Sandbox Code Playgroud)
请注意,此上下文参数是自JSF 2.3以来的新内容,并且已向后移植到Mojarra 2.2.16,2.1.29-10和1.2_15-06中.旧版本不支持它.另请参阅JSFSPEC-1433以及有关此问题的专家组讨论.
这是否有害取决于业务逻辑.设计得很好的模型(业务逻辑和/或数据模型)不考虑null预期的情况会导致其他地方出现空指针异常,或者SQL约束违规(NOT NULL),这通常会导致HTTP 500错误响应.但如果模型实际上认为null是预期的情况,那么它可能是模型中的错误.旨在仅仅呈现模型的视图(JSF页面)可以对它做很少的事情.
如果业务逻辑或数据模型确实不能被视为null特殊情况(即从不假设/接受给定值null),并且您碰巧使用JPA,那么您最好的选择是@NotNull在属性上添加一个.虽然JSF将绕过它的验证,但JPA仍然会对其进行验证,导致仍然存在异常和HTTP 500错误.在这种情况下,我只想知道为什么DB列首先没有NOT NULL约束.或者,进行类级别验证.
注意到MyFaces应该在下面记录如下警告:
2016年3月16日上午8:55:52 org.apache.myfaces.shared.renderkit.html.HtmlRendererUtils decodeUIInput
警告:如果输入已呈现,其表单已提交且未提交,则应始终为输入提交值最初呈现为禁用或只读.通过javascript禁用输入元素后,您无法提交表单.考虑将只读设置为true,或者在表单提交之前将禁用值重置为false.
组件:{Component-Path:[类:javax.faces.component.UIViewRoot,ViewId:/test.xhtml] [类:javax.faces.component.html.HtmlBody,Id:j_id_5] [类:javax.faces.component .html.HtmlForm,Id:j_id_6] [类:javax.faces.component.html.HtmlInputText,Id:j_id_7]位置:/ test.xhtml在第22行和第33列}
| 归档时间: |
|
| 查看次数: |
363 次 |
| 最近记录: |