通常,在编写Web应用程序时,我们希望在客户端执行验证以提供即时反馈,并在服务器端执行验证以确保数据完整性和安全性。但是,客户端浏览器应用程序通常使用JavaScript编写。服务器端可以用Java,Php,Ruby,Python和许多其他语言编写。当服务器端由像node.js这样的东西支持时,在客户端和服务器上重用相同的验证代码真的很容易,但是如果服务器端基于Rails或Django(或者你可以命名的任何其他框架) ),确保验证代码保持同步的最佳方法是什么?在多种语言中重新实现相同的代码似乎有点多余。
答案 0 :(得分:2)
如果您考虑到以下情况,可能似乎可以复制某些验证。
让我们将验证分为两部分。 A)业务验证,例如“如果选中复选框Y,则字段X中的金额应大于$ 500” B)基本数据验证,例如数据类型检查,空检查等。(我们可能会争论每个验证都是业务验证,但这纯粹是特定于上下文的)。
类别A:它是业务逻辑的一部分,只应保留在服务器端。
B类:此类型的验证可能会放在客户端。但请记住浏览器端验证can be bypassed。这并不意味着您根本不应该在浏览器端进行验证,但这些验证应仅被视为从服务器保存网络往返的奖励。服务器必须重新执行这些验证。
简而言之,不应将验证视为跨层的可重用代码的单元。他们的目标各不相同,应该允许冗余。
希望这有帮助。
答案 1 :(得分:0)
从项目中我已经看到了三个一般策略:
完全复制客户端和服务器端验证。在javascript前端和java / c#/ ruby后端的情况下,这将需要两个不同的代码库。您必须手动保持两者的逻辑同步。
进行最小的客户端验证。检查只是非常基本的东西。让服务器端进行完整验证。让服务器端将某种验证错误对象传递回客户端,并让客户端逻辑将其转换为UI消息(错误消息,红色边框等)。 Asp.net MVC框架大致就是这个模型的一个例子。
当用户更改或离开每个控件时,使用ajax对服务器端进行验证调用。这可以允许您在服务器端进行所有验证,并减少用户的反馈等待时间,但可以极大地增加客户端到服务器端的流量。
根据我的经验,选项1通常不像维护选项2和3所需的额外代码和复杂性那样痛苦。