在基于 Java 的真实企业应用程序中,应该在哪一层进行验证?
At which layer validation should be done in a real enterprise Java based application?
我曾在一些主要基于 Spring 框架和 Java EE(主要是 EJB)的企业应用程序中担任开发人员;但不是所有层(视图层是我工作过的最少层)
考虑多层应用程序(客户端层、业务层、数据层等)应该在哪一层进行数据验证?
我听说过 Bean 验证 API 即:JSR 303
;但验证是在 Bean 中执行的,即服务器端(如果我理解正确的话)。
那么在实际应用中应该在哪里进行验证?是否应该在客户端层本身进行一些验证(例如,如果使用的视图技术是 JSP,验证是否应该在 JSP 中进行)?如果是这样,那么 JSR 303
.
的优势是什么?
由于验证而拒绝从客户端传输到服务器的数据也没有意义,我不清楚验证的正确方法是什么。
非常感谢任何理解这一点的解释。
你是对的,Bean Validation API 在业务逻辑层执行验证,而不是客户端的。同样正确的是,一般来说,数据验证应该尽可能靠近客户端进行,最好是在客户端本身。
但有时,您无法在那里执行此操作,因此您需要服务器端验证。例如,您如何验证注册页面中是否已进行登录?
有时验证甚至会深入到数据层。例如,数据完整性约束是数据层验证(参照完整性、可空性……)。
总而言之,数据验证尽可能在客户端进行,但有时不能在客户端进行。因此,尽管在客户端和服务器之间传输数据会产生成本,但您必须在服务器端执行此操作。
自 "Validating input received from the user to maintain data integrity is an important part of application logic" 以来,据我所知,始终鼓励 Web 开发人员进行两步数据验证,即在 UI 以及业务逻辑中。我给大家介绍一下。
- 客户端验证的优势在于您可以控制在需要时警告用户,并立即显示相关消息。但请记住避免将日期比较等复杂逻辑作为验证,因为在后端您将有足够的自由来验证各种约束。
- 通常在业务层上执行后端验证总是更好,业务层可以成为应用程序最强大的部分。这确保了完美的输出,记住抛出自定义异常,使应用程序看起来更好,并使用现有方法进行验证 { ex. isDigit(), isEmpty() 等}.
- 在数据层级别,尽量减少验证,但有时如果依赖于其他服务等,我们必须包括它们。
关于 JSR 303,bean 验证,它有助于简化映射到 bean 的用户输入字段的验证{通常在基于 Spring 的 REST 应用程序中}
关于您的疑问“由于验证而拒绝从客户端传输到服务器的数据也没有意义”..看起来可能是这样,但以这种方式处理涉及复杂逻辑的验证和更好地处理异常非常重要。
通常情况下,一个应用程序中有 3 个层。模型层、控制层和视图层。每一层都有它的验证逻辑。
视图层检查用户输入数据的有效性。这种检查有助于用户体验和服务器的性能,因为它可以及早指出用户的无效输入,避免对服务器接口的无效调用。视图层的check应该主要是用户输入的检查(例如:email格式检查,password格式检查等)。
控制层检查也是必须的。这种检查可以避免服务器接口的非法调用。例如,登录令牌在 http 请求参数中丢失或无效。
模型层检查主要是数据校验。视图层检查用户的电子邮件格式,模型层将检查电子邮件是否在应用程序中注册(可能是用户数据存储在数据库或缓存中)。
总之,每一层都有它的责任,它应该各自做它的数据验证。
我认为谈论验证是谈论一种方法而不是解决方案。
一种方法是让任何层都有自己的验证。
另一种方法是进行与应用程序无关的验证。
选择前者还是后者取决于多种因素:应用程序复杂性、层设计、可维护性、层可重用性。
JSR303是一种验证类型:bean validation。
其他验证可以是:
- 检查是否存在任何类型的注入
- 检查 authentication/authorization
关于可重用性:如果您调用依赖客户端验证的业务层,则调用 B2B 无法使用验证。
除了这些注意事项之外,还有一些好的建议可以遵循。例如 don't trust client side validation.
客户端验证有助于改善用户体验,但不应替代服务器端验证。
我曾在一些主要基于 Spring 框架和 Java EE(主要是 EJB)的企业应用程序中担任开发人员;但不是所有层(视图层是我工作过的最少层)
考虑多层应用程序(客户端层、业务层、数据层等)应该在哪一层进行数据验证?
我听说过 Bean 验证 API 即:JSR 303
;但验证是在 Bean 中执行的,即服务器端(如果我理解正确的话)。
那么在实际应用中应该在哪里进行验证?是否应该在客户端层本身进行一些验证(例如,如果使用的视图技术是 JSP,验证是否应该在 JSP 中进行)?如果是这样,那么 JSR 303
.
由于验证而拒绝从客户端传输到服务器的数据也没有意义,我不清楚验证的正确方法是什么。
非常感谢任何理解这一点的解释。
你是对的,Bean Validation API 在业务逻辑层执行验证,而不是客户端的。同样正确的是,一般来说,数据验证应该尽可能靠近客户端进行,最好是在客户端本身。
但有时,您无法在那里执行此操作,因此您需要服务器端验证。例如,您如何验证注册页面中是否已进行登录?
有时验证甚至会深入到数据层。例如,数据完整性约束是数据层验证(参照完整性、可空性……)。
总而言之,数据验证尽可能在客户端进行,但有时不能在客户端进行。因此,尽管在客户端和服务器之间传输数据会产生成本,但您必须在服务器端执行此操作。
自 "Validating input received from the user to maintain data integrity is an important part of application logic" 以来,据我所知,始终鼓励 Web 开发人员进行两步数据验证,即在 UI 以及业务逻辑中。我给大家介绍一下。
- 客户端验证的优势在于您可以控制在需要时警告用户,并立即显示相关消息。但请记住避免将日期比较等复杂逻辑作为验证,因为在后端您将有足够的自由来验证各种约束。
- 通常在业务层上执行后端验证总是更好,业务层可以成为应用程序最强大的部分。这确保了完美的输出,记住抛出自定义异常,使应用程序看起来更好,并使用现有方法进行验证 { ex. isDigit(), isEmpty() 等}.
- 在数据层级别,尽量减少验证,但有时如果依赖于其他服务等,我们必须包括它们。
关于 JSR 303,bean 验证,它有助于简化映射到 bean 的用户输入字段的验证{通常在基于 Spring 的 REST 应用程序中}
关于您的疑问“由于验证而拒绝从客户端传输到服务器的数据也没有意义”..看起来可能是这样,但以这种方式处理涉及复杂逻辑的验证和更好地处理异常非常重要。
通常情况下,一个应用程序中有 3 个层。模型层、控制层和视图层。每一层都有它的验证逻辑。
视图层检查用户输入数据的有效性。这种检查有助于用户体验和服务器的性能,因为它可以及早指出用户的无效输入,避免对服务器接口的无效调用。视图层的check应该主要是用户输入的检查(例如:email格式检查,password格式检查等)。
控制层检查也是必须的。这种检查可以避免服务器接口的非法调用。例如,登录令牌在 http 请求参数中丢失或无效。
模型层检查主要是数据校验。视图层检查用户的电子邮件格式,模型层将检查电子邮件是否在应用程序中注册(可能是用户数据存储在数据库或缓存中)。
总之,每一层都有它的责任,它应该各自做它的数据验证。
我认为谈论验证是谈论一种方法而不是解决方案。
一种方法是让任何层都有自己的验证。 另一种方法是进行与应用程序无关的验证。 选择前者还是后者取决于多种因素:应用程序复杂性、层设计、可维护性、层可重用性。
JSR303是一种验证类型:bean validation。
其他验证可以是:
- 检查是否存在任何类型的注入
- 检查 authentication/authorization
关于可重用性:如果您调用依赖客户端验证的业务层,则调用 B2B 无法使用验证。
除了这些注意事项之外,还有一些好的建议可以遵循。例如 don't trust client side validation.
客户端验证有助于改善用户体验,但不应替代服务器端验证。