目前,我感到有些矛盾。我有一个用于MVC框架的条纹的Web应用程序,后端的弹簧/休眠剂。我在MVC层中有一个帐户注册方法,需要以下验证:

  • 用户名尚未获取
  • 提供的电子邮件地址尚未与另一个帐户关联

我有一个条纹(MVC层)的验证方法,该方法检查了这两种情况,但是想知道我的服务层是否应该复制这些检查?如果服务层接口是作为Web服务公开的,那么我认为验证将是一个好主意,但是如果仅在Web应用程序的上下文中使用它?

编辑:我不打算复制验证代码 - 我的意思是在两个地方复制验证方法调用。

我认为我的选择为:

  1. 复制MVC和服务层中的验证调用
  2. 仅在MVC层执行此验证
  3. 仅在服务层执行此验证。

这里最好的做法是什么?我正在寻找有关我应该选择哪种选择以及原因的建议/意见。

请注意,在注册表格的输入字段(例如检查空白)上有简单的验证检查,我认为仅由MVC验证来处理;我只关心更复杂的验证。

有帮助吗?

解决方案

安妮,

好问题,我在很多情况下都问自己一样。这就是我最终得到的(直到现在)。

最纯粹(但乏味的)方法是在两层中调用验证逻辑。务实的方法可能是仅在网络地带(例如您的控制器)中调用它。

我认为没有任何答案结束所有讨论。我认为这取决于您项目的上下文。如果项目大小是适中的(就人员和代码库的规模而言),并且您有信心,没有其他人会开发大量代码(在某种程度上您将无法监督您的服务API ),然后仅在网络层进行验证可能就足够了。

但是,如果您希望许多客户可能需要更高级别的安全性。当我在这里说安全性时,我将其称为您需要的一致性保证级别。如果该级别很高,则无法解决:您必须在服务(用于安全性)和Web层中进行(主要是为了为最终用户提供可接受的体验)。

因此,这里的关键驱动程序是安全性以及您真正需要多少。如果您需要很多,那么您就可以采用“纯粹主义者”方法。如果您的申请并未完全做出有关生与死问题的决定,那么您就采取了务实的方法。

其他提示

不要重复代码。采用 JSR303豆验证 因此,您可以在应用程序的所有层中使用相同的验证逻辑。

Hibernate验证器 (与Hibernate Orm的单独项目)提供了此接口的参考实现。它的使用简单,您可以 很快就开始.

我认为,您应该区分两种验证:

  • 格式数据验证:应在演示层(您的情况下MVC)中进行验证。通常在客户端和服务器端
  • 公交数据验证:应在服务层中验证

在您的情况下,您的验证与业务规则有关,因此我仅将它们放在服务层中。此外,如果您在两层中复制验证,则将两次进行相同的查询,从而减慢应用程序的性能。

  1. 理想情况下,在两层验证中进行验证,因为您的服务层可以与当前MVC层以外的其他客户端一起使用

  2. 在两个地方重复使用验证机制(例如,bean验证)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top