2011-12-19 135 views
4

通常寫一個web應用程序時,我們要在兩個客戶端執行驗證提供即時反饋,並在服務器端,以確保數據的完整性和安全性。但是,客戶端瀏覽器應用程序通常使用JavaScript編寫。服務器端可以用Java,Php,Ruby,Python和其他許多語言編寫。當服務器端支持像node.js這樣的東西時,在客戶端和服務器上重複使用相同的驗證代碼非常容易,但是如果服務器端基於Rails或Django(或者其他任何可以命名的框架),確保驗證代碼保持同步的最佳方式是什麼?必須用多種語言重新實現相同的代碼似乎有點多餘。如何在客戶端驗證和服務器端驗證同步?

回答

2

如果你記住以下persepective,它可能看起來還好複製某些驗證。

讓我們打破驗證分爲兩個部分。 A)業務驗證,例如「如果複選框Y被選中,則字段X中的金額應該大於500美元」 B)基本數據驗證例如數據類型檢查,空值檢查等(我們可能會辯論每個驗證都是業務驗證,但這純粹是與上下文相關的)。

A類:它是您業務邏輯的一部分,應該只保留在服務器端。

B類:此類型的驗證可能會被放置在客戶端。但請記住,瀏覽器端驗證can be bypassed。這並不意味着你不應該在瀏覽器端進行驗證,但是這樣的驗證應該僅僅被看作是從服務器節省網絡往返的獎勵。服務器必須重新執行這些驗證。

在概括地說,驗證不應該被認爲是跨層可重用代碼單元。他們的目標不一,應該允許冗餘。

希望這會有所幫助。

+0

問題所需的額外代碼和複雜性更低的痛點的是「什麼是保持客戶端的最佳方式和服務器端驗證同步「。你回答了一個不同的問題,涉及到何處放置業務邏輯(又名業務驗證)。 – RMuesi 2017-08-17 01:09:46

0

從項目中,我見過有三大戰略:

  1. 完全重複的客戶端和服務器端驗證。在javascript前端和java/c#/ ruby​​後端的情況下,這將需要兩個不同的代碼庫。您必須手動保持兩者的邏輯同步。

  2. 做最小的客戶端驗證。只檢查非常基本的東西。讓服務器端進行完整驗證。讓服務器端將某種驗證錯誤對象傳遞給客戶端,並讓客戶端邏輯將其轉換爲UI消息(錯誤消息,紅色邊框等)。 Asp.net MVC框架大致就是這個模型的一個例子。

  3. 使用Ajax進行驗證調用到您的服務器端,當用戶改變或離開每個控制。這可以允許您在服務器端進行所有驗證,並且會減少用戶的反饋等待時間,但可以極大地增加客戶端到服務器端的流量。

以我的經驗,選擇1通常比保持選項2和3