我应该在MVC层和服务层中复制验证吗?
-
01-10-2019 - |
题
目前,我感到有些矛盾。我有一个用于MVC框架的条纹的Web应用程序,后端的弹簧/休眠剂。我在MVC层中有一个帐户注册方法,需要以下验证:
- 用户名尚未获取
- 提供的电子邮件地址尚未与另一个帐户关联
我有一个条纹(MVC层)的验证方法,该方法检查了这两种情况,但是想知道我的服务层是否应该复制这些检查?如果服务层接口是作为Web服务公开的,那么我认为验证将是一个好主意,但是如果仅在Web应用程序的上下文中使用它?
编辑:我不打算复制验证代码 - 我的意思是在两个地方复制验证方法调用。
我认为我的选择为:
- 复制MVC和服务层中的验证调用
- 仅在MVC层执行此验证
- 仅在服务层执行此验证。
这里最好的做法是什么?我正在寻找有关我应该选择哪种选择以及原因的建议/意见。
请注意,在注册表格的输入字段(例如检查空白)上有简单的验证检查,我认为仅由MVC验证来处理;我只关心更复杂的验证。
解决方案
安妮,
好问题,我在很多情况下都问自己一样。这就是我最终得到的(直到现在)。
最纯粹(但乏味的)方法是在两层中调用验证逻辑。务实的方法可能是仅在网络地带(例如您的控制器)中调用它。
我认为没有任何答案结束所有讨论。我认为这取决于您项目的上下文。如果项目大小是适中的(就人员和代码库的规模而言),并且您有信心,没有其他人会开发大量代码(在某种程度上您将无法监督您的服务API ),然后仅在网络层进行验证可能就足够了。
但是,如果您希望许多客户可能需要更高级别的安全性。当我在这里说安全性时,我将其称为您需要的一致性保证级别。如果该级别很高,则无法解决:您必须在服务(用于安全性)和Web层中进行(主要是为了为最终用户提供可接受的体验)。
因此,这里的关键驱动程序是安全性以及您真正需要多少。如果您需要很多,那么您就可以采用“纯粹主义者”方法。如果您的申请并未完全做出有关生与死问题的决定,那么您就采取了务实的方法。
其他提示
不要重复代码。采用 JSR303豆验证 因此,您可以在应用程序的所有层中使用相同的验证逻辑。
Hibernate验证器 (与Hibernate Orm的单独项目)提供了此接口的参考实现。它的使用简单,您可以 很快就开始.
我认为,您应该区分两种验证:
- 格式数据验证:应在演示层(您的情况下MVC)中进行验证。通常在客户端和服务器端
- 公交数据验证:应在服务层中验证
在您的情况下,您的验证与业务规则有关,因此我仅将它们放在服务层中。此外,如果您在两层中复制验证,则将两次进行相同的查询,从而减慢应用程序的性能。
理想情况下,在两层验证中进行验证,因为您的服务层可以与当前MVC层以外的其他客户端一起使用
在两个地方重复使用验证机制(例如,bean验证)