如何在客户端验证和服务器端验证同步?
通常写一个web应用程序时,我们要在两个客户端执行验证提供即时反馈,并在服务器端,以确保数据的完整性和安全性。但是,客户端浏览器应用程序通常使用JavaScript编写。服务器端可以用Java,Php,Ruby,Python和其他许多语言编写。当服务器端支持像node.js这样的东西时,在客户端和服务器上重复使用相同的验证代码非常容易,但是如果服务器端基于Rails或Django(或者其他任何可以命名的框架),确保验证代码保持同步的最佳方式是什么?必须用多种语言重新实现相同的代码似乎有点多余。如何在客户端验证和服务器端验证同步?
如果你记住以下persepective,它可能看起来还好复制某些验证。
让我们打破验证分为两个部分。 A)业务验证,例如“如果复选框Y被选中,则字段X中的金额应该大于500美元” B)基本数据验证例如数据类型检查,空值检查等(我们可能会辩论每个验证都是业务验证,但这纯粹是与上下文相关的)。
A类:它是您业务逻辑的一部分,应该只保留在服务器端。
B类:此类型的验证可能会被放置在客户端。但请记住,浏览器端验证can be bypassed。这并不意味着你不应该在浏览器端进行验证,但是这样的验证应该仅仅被看作是从服务器节省网络往返的奖励。服务器必须重新执行这些验证。
在概括地说,验证不应该被认为是跨层可重用代码单元。他们的目标不一,应该允许冗余。
希望这会有所帮助。
从项目中,我见过有三大战略:
完全重复的客户端和服务器端验证。在javascript前端和java/c#/ ruby后端的情况下,这将需要两个不同的代码库。您必须手动保持两者的逻辑同步。
做最小的客户端验证。只检查非常基本的东西。让服务器端进行完整验证。让服务器端将某种验证错误对象传递给客户端,并让客户端逻辑将其转换为UI消息(错误消息,红色边框等)。 Asp.net MVC框架大致就是这个模型的一个例子。
使用Ajax进行验证调用到您的服务器端,当用户改变或离开每个控制。这可以允许您在服务器端进行所有验证,并且会减少用户的反馈等待时间,但可以极大地增加客户端到服务器端的流量。
以我的经验,选择1通常比保持选项2和3
问题所需的额外代码和复杂性更低的痛点的是“什么是保持客户端的最佳方式和服务器端验证同步“。你回答了一个不同的问题,涉及到何处放置业务逻辑(又名业务验证)。 – RMuesi 2017-08-17 01:09:46