此刻我感觉有些矛盾。我有一个使用Stripes用于MVC框架的Web应用程序和用于后端的Spring / Hibernate。我的MVC层中有一个帐户注册方法,需要进行以下验证:
我在Stripes(MVC层)中有一个验证方法来检查这两种情况但是想知道我的服务层是否应该复制这些检查?如果服务层接口作为Web服务公开,那么我认为验证是个好主意,但是如果它只在Web应用程序的上下文中使用它是否需要?
编辑:我不打算复制验证码 - 我的意思是在两个地方重复验证方法调用。
我认为我的选择为:
这里的最佳做法是什么?我正在寻找关于我应该选择哪个选项以及原因的建议/意见。
请注意,对注册表单的输入字段进行简单的验证检查(如检查空白),我认为这些只应由MVC验证处理;我只关心更复杂的验证。
答案 0 :(得分:5)
不要重复代码。使用JSR303 Bean Validation,这样您就可以在应用的所有层中使用相同的验证逻辑。
Hibernate Validator(一个与Hibernate ORM东西不同的项目)提供了该接口的参考实现。它很简单易用,你可以get started with it very quickly。
答案 1 :(得分:3)
在我看来,你应该区分两种验证:
在您的情况下,您的验证与业务规则相关,因此我只将它们放在服务层中。 此外,如果您在两个图层中复制验证,您将进行两次相同的查询,从而降低应用程序的性能。
答案 2 :(得分:1)
理想情况下,在两个层中进行验证,因为您的服务层可能与当前mvc层以外的客户端一起使用
在两个地方重用验证机制(例如,Bean验证)
答案 3 :(得分:1)
安妮,
好问题,我在很多场合都问过同样的问题。这是我最终的结果(直到现在)。
最纯粹(但很乏味)的方法是在两个层中调用验证逻辑。 实用的方法可能只是在web-land(例如你的控制器)中调用它。
我认为没有结束所有讨论的答案。我认为这取决于你的项目的背景。如果项目大小适中(就人员和代码库的大小而言),并且您确信不会调用您的服务API的其他人开发大量代码(在某种程度上您将无法监督),然后只在网络层进行验证可能就足够了。
但是,如果您期望许多客户端,则可能需要更高级别的安全性。当我在这里说安全性时,我将其称为一致性级别 - 保证您需要。 如果该级别很高,则无法绕过它:您必须在服务(用于安全性)和Web层(主要是为了能够为最终用户提供可接受的体验)中执行此操作。
因此,这里的关键驱动因素是安全性以及您真正需要的安全性。如果你需要很多东西,你就会采用'纯粹主义'的方法。如果你的申请并没有完全做出与生死相关的决定,你就会采取务实的态度。