2016-07-26 52 views
0

我曾在一些主要基於Spring Framework和Java EE(主要是EJB)的企業應用程序中擔任開發人員;但不是在所有的層(視圖層是我工作過的最少)在真正的企業Java應用程序中應該在哪一層進行驗證?

考慮一個多層應用程序(客戶層,業務層,數據層等)在哪一層數據驗證應該發生?

我聽說Bean驗證APIJSR 303;但驗證在Bean中執行,即服務器端(如果我理解正確)。

那麼在真正的應用程序的驗證應該發生?是否應該在客戶端層本身進行驗證(例如,如果使用的視圖技術是JSP,驗證是否應該在JSP中進行)?如果是的話,那麼JSR 303的優勢是什麼。

由於驗證,數據從客戶端傳輸到服務器也是沒有意義的,我不清楚驗證的正確方法是什麼。

任何理解這一點的解釋非常感謝。

回答

1

您是對的,Bean驗證API在業務邏輯層執行驗證,而不是客戶端驗證。一般而言,數據驗證應該儘可能接近客戶端,最好是在客戶端本身,這也是正確的。

但有時候,你不能在那裏做,所以你需要服務器端驗證。例如,您如何確認登錄頁面已被註冊?

有時驗證甚至會對數據層更深入。例如,數據完整性約束是數據層驗證(參照完整性,可空性...)。

總之,數據驗證應儘可能在客戶端進行,但有時候不能在那裏完成。因此,儘管在客戶端和服務器之間傳輸數據的成本,但您必須在服務器端執行此操作。

1

由於「驗證從用戶接收到的維護數據完整性的輸入是應用程序邏輯的重要組成部分」,據我所知,Web開發人員總是被鼓勵進行2步數據驗證,即在UI和業務邏輯。讓我給你介紹一下。

  1. 客戶端驗證的優點是您可以控制警告用戶在哪裏需要,並立即顯示相關消息。但請記住避免複雜的邏輯,如日期比較作爲驗證,因爲在後端,您將有足夠的自由來驗證各種約束。
  2. 通常在業務層上執行後端驗證總是更好,後者可以成爲應用程序中最強大的部分。這確保完美無瑕的輸出,記得拋出自定義異常,使應用程序看起來更好,並利用現有的方法進行驗證{例如。 isDigit(),isEmpty()等}。
  3. 在數據層級,儘量減少驗證,但有時如果依賴於其他服務,我們必須包含它們。

關於JSR 303 Bean驗證,它有助於爲拉伸手來簡化其分別對應的豆類{一般在春季基礎的應用程序與REST}用戶輸入字段

和關於您的疑問驗證「將數據從客戶端傳輸到服務器也是沒有意義的,因爲驗證」..它可能看起來很不錯,但是真正重要的是通過這種方式處理涉及複雜邏輯和以更好的例外。

2

通常,應用程序中有3層。模型圖層,控制圖層和視圖圖層。每一層都有它的驗證邏輯。

視圖層檢查用戶輸入數據的驗證。此檢查有助於用戶體驗和服務器的性能,因爲它可以提前指出用戶的無效輸入並避免服務器接口的無效呼叫。檢查視圖層應主要關於用戶的輸入檢查(例如:電子郵件格式檢查,密碼格式檢查等)。

控制層檢查也是必要的。該檢查可以避免服務器接口的非法呼叫。例如,在http請求參數中,登錄令牌被遺漏或無效。

模型圖層檢查主要是關於數據驗證。查看圖層檢查用戶的電子郵件格式,模型圖層將檢查電子郵件是否在應用程序中註冊(可能是用戶數據存儲在數據庫或緩存中)。

總而言之,每一層都有它的責任,它應該分別進行數據驗證。

1

我認爲談論驗證就是談論一種不是解決方案的方法。

一種方法可以是對任何圖層進行自己的驗證。 另一種方法是進行應用程序不可知的驗證。 前者或後者的選擇取決於各種因素:應用程序複雜性,圖層設計,可維護性,圖層可重用性。

JSR303是一種驗證類型:bean驗證。

其他驗證可以是:

  • 反對任何形式注入的
  • 檢查認證/授權

關於重用性檢查:如果你調用它依賴於客戶端驗證業務層那麼呼叫B2B不能使用驗證。

除了這些考慮因素之外,還有很好的建議。例如don't trust client side validation

客戶端驗證有助於提高用戶體驗,但不應該用作服務器端驗證的替代品。

相關問題