返回介绍

5.4.2 校验表单

发布于 2024-08-17 00:45:50 字数 3589 浏览 0 评论 0 收藏 0

如果用户在提交表单的时候,username或password文本域为空的话,那么将会导致在新建Spitter对象中,username或password是空的String。至少这是一种怪异的行为。如果这种现象不处理的话,这将会出现安全问题,因为不管是谁只要提交一个空的表单就能登录应用。

同时,我们还应该阻止用户提交空的firstName和/或lastName,使应用仅在一定程度上保持匿名性。有个好的办法就是限制这些输入域值的长度,保持它们的值在一个合理的长度范围,避免这些输入域的误用。

有种处理校验的方式非常初级,那就是在processRegistration()方法中添加代码来检查值的合法性,如果值不合法的话,就将注册表单重新显示给用户。这是一个很简短的方法,因此,添加一些额外的if语句也不是什么大问题,对吧?

与其让校验逻辑弄乱我们的处理器方法,还不如使用Spring对Java校验API(Java Validation API,又称JSR-303)的支持。从Spring 3.0开始,在Spring MVC中提供了对Java校验API的支持。在Spring MVC中要使用Java校验API的话,并不需要什么额外的配置。只要保证在类路径下包含这个Java API的实现即可,比如Hibernate Validator。

Java校验API定义了多个注解,这些注解可以放到属性上,从而限制这些属性的值。所有的注解都位于javax.validation.constraints包中。表5.1列出了这些校验注解。

表5.1 Java校验API所提供的校验注解

注  解

描  述

@AssertFalse

所注解的元素必须是Boolean类型,并且值为false

@AssertTrue

所注解的元素必须是Boolean类型,并且值为true

@DecimalMax

所注解的元素必须是数字,并且它的值要小于或等于给定的BigDecimalString值

@DecimalMin

所注解的元素必须是数字,并且它的值要大于或等于给定的BigDecimalString值

@Digits

所注解的元素必须是数字,并且它的值必须有指定的位数

@Future

所注解的元素的值必须是一个将来的日期

@Max

所注解的元素必须是数字,并且它的值要小于或等于给定的值

@Min

所注解的元素必须是数字,并且它的值要大于或等于给定的值

@NotNull

所注解元素的值必须不能为null

@Null

所注解元素的值必须为null

@Past

所注解的元素的值必须是一个已过去的日期

@Pattern

所注解的元素的值必须匹配给定的正则表达式

@Size

所注解的元素的值必须是String、集合或数组,并且它的长度要符合给定的范围

除了表5.1中的注解,Java校验API的实现可能还会提供额外的校验注解。同时,也可以定义自己的限制条件。但就我们来讲,将会关注于上表中的两个核心限制条件。

请考虑要添加到Spitter域上的限制条件,似乎需要使用@NotNull和@Size注解。我们所要做的事情就是将这些注解添加到Spitter的属性上。如下的程序清单展现了Spitter类,它的属性已经添加了校验注解。

程序清单5.18 Spitter:包含了要提交到Spittle POST请求中的域

现在,Spitter的所有属性都添加了@NotNull注解,以确保它们的值不为null。类似地,属性上也添加了@Size注解以限制它们的长度在最大值和最小值之间。对Spittr应用来说,这意味着用户必须要填完注册表单,并且值的长度要在给定的范围内。

我们已经为Spitter添加了校验注解,接下来需要修改processRegistration()方法来应用校验功能。启用校验功能的processRegistration()如下所示:

程序清单5.19 processRegistration():确保所提交的数据是合法的

与程序清单5.17中最初的processRegistration()方法相比,这里有了很大的变化。Spitter参数添加了@Valid注解,这会告知Spring,需要确保这个对象满足校验限制。

在Spitter属性上添加校验限制并不能阻止表单提交。即便用户没有填写某个域或者某个域所给定的值超出了最大长度,processRegistration()方法依然会被调用。这样,我们就需要处理校验的错误,就像在processRegistration()方法中所看到的那样。

如果有校验出现错误的话,那么这些错误可以通过Errors对象进行访问,现在这个对象已作为processRegistration()方法的参数。(很重要一点需要注意,Errors参数要紧跟在带有@Valid注解的参数后面,@Valid注解所标注的就是要检验的参数。)processRegistration()方法所做的第一件事就是调用Errors.hasErrors()来检查是否有错误。

如果有错误的话,Errors.hasErrors()将会返回到registerForm,也就是注册表单的视图。这能够让用户的浏览器重新回到注册表单页面,所以他们能够修正错误,然后重新尝试提交。现在,会显示空的表单,但是在下一章中,我们将在表单中显示最初提交的值并将校验错误反馈给用户。

如果没有错误的话,Spitter对象将会通过Repository进行保存,控制器会像之前那样重定向到基本信息页面。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文