2010-06-29 35 views
7

我現在感覺有點衝突。我有一個Web應用程序,使用Stripes作爲MVC框架,使用Spring/Hibernate作爲後端。我在我的MVC層的帳號註冊方法,需要以下驗證:我應該在我的MVC層和服務層中複製驗證嗎?

  • 用戶名是不是已經採取
  • 所提供的電子郵件地址尚未與其他帳戶相關聯

我有一個Stripes(MVC層)中的驗證方法檢查這兩種情況,但想知道我的服務層是否應該複製這些檢查?如果服務層接口作爲Web服務公開,那麼我認爲驗證將是一個好主意,但是如果它僅用於Web應用程序的上下文中,它是否需要?

編輯:我不打算重複驗證碼 - 我的意思是在兩個地方重複驗證方法調用。

我看到我的選擇是:

  1. 複製兩個MVC驗證呼叫和業務層
  2. 只有在MVC層
  3. 執行此驗證只需要在服務層執行此驗證。

這裏最好的做法是什麼?我正在尋找建議/意見,我應該選擇哪個選項以及爲什麼。

請注意,對註冊表單的輸入字段進行簡單的驗證檢查(如檢查空格),我認爲這些應該僅由MVC驗證處理;我只關心更復雜的驗證。

回答

1

Annie,

好問題,我在很多場合都問過自己一樣。這是我結束的(直到現在)。

最純粹(但繁瑣)的方法是調用兩個圖層中的驗證邏輯。 實用的方法可能只是在web-land(例如你的控制器)中調用它。

我認爲沒有結束所有討論的答案。我認爲這取決於你的項目的背景。如果項目大小適中(根據人員和代碼大小),並且您確信其他人不會開發大量調用您的服務API的代碼(在某種程度上,您將無法監督),那麼只在Web層做驗證就足夠了。

但是,如果您期望很多客戶端,則可能需要更高級別的安全性。當我在這裏說安全時,我將它稱爲一致性級別 - 您需要的保證。 如果這個級別很高,就沒有辦法繞過它:你必須在服務(爲了安全)和Web層(主要是爲了給最終用戶提供可接受的體驗)上做到這一點。

因此,這裏的關鍵驅動程序是安全性以及您真正需要多少安全性。如果你需要很多,你會選擇'純粹'的方法。如果你的申請沒有完全做出關乎生死的決定,那麼你應該採取務實的態度。

5

請勿複製代碼。使用JSR303 Bean Validation,以便您可以在應用的所有圖層中使用相同的驗證邏輯。

Hibernate Validator(Hibernate ORM東西的一個單獨的項目)提供了這個接口的參考實現。它使用簡單,你可以get started with it very quickly

+0

是的,我不是說我會複製驗證碼 - 我的意思是我會在兩個地方調用相同的驗證碼 – JMM 2010-06-29 14:15:50

+0

就像你提到的那樣,你確實需要兩次驗證,除了控制器層之外,您還有其他客戶端。我可能會看到潛在的想要有不同的驗證邏輯 – 2010-06-29 14:49:05

1
  1. 在理想情況下,執行在這兩個層中的驗證,因爲你的服務層可以用比當前的MVC層

  2. 重用在這兩個地方的驗證機制(Bean驗證,例如其他的客戶機可以使用)

3

在我看來,你應該diferenciate驗證的兩種:

  • 格式數據驗證:應在表示層(在您的案例中的MVC)中驗證哪些內容。通常,無論是在客戶端和服務器端
  • 的Bussines數據驗證:應在服務層

來驗證你的情況,你的驗證與業務相關的規則,所以我只會把它們放在服務層。 此外,如果您在兩個圖層中複製驗證,則您將進行兩次相同的查詢,從而降低應用程序的性能。