簡體   English   中英

在基於企業Java的實際應用程序中應在哪一層進行驗證?

[英]At which layer validation should be done in a real enterprise Java based application?

我曾在幾個主要基於Spring Framework和Java EE(主要是EJB)的企業應用程序中擔任開發人員。 但不是所有層(視圖層是我研究過的最少的層)

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

我聽說過Bean驗證API,即: JSR 303 但驗證是在Bean(即服務器端)中執行的(如果我理解正確的話)。

那么在實際應用中應該進行驗證的地方呢? 是否應該在客戶端層本身中進行一些驗證(例如,如果使用的視圖技術是JSP,那么驗證是否應該在JSP中進行)? 如果是這樣,那么JSR 303的優點是什么。

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

理解這一點的任何解釋都很好。

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

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

控制層檢查也是必要的。 該檢查可以避免非法調用服務器接口。 例如,http請求參數中的登錄令牌丟失或無效。

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

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

沒錯,Bean驗證API是在業務邏輯層而不是客戶的邏輯層執行驗證的。 同樣正確的是,通常,數據驗證應盡可能地靠近客戶端,最好是在客戶端本身。

但是有時候,您只是不能在那里做,因此您需要服務器端驗證。 例如,如何驗證注冊頁面中是否已進行登錄?

有時,驗證甚至會深入到數據層。 例如,數據完整性約束是數據層驗證(引用完整性,可空性等)。

總之,應盡可能在客戶端進行數據驗證,但有時無法在客戶端進行。 因此,盡管客戶端和服務器之間的數據傳輸成本很高,但您仍必須在服務器端進行操作。

由於“驗證來自用戶的輸入以保持數據完整性是應用程序邏輯的重要組成部分”,據我所知,始終鼓勵Web開發人員進行兩步數據驗證,即在UI以及業務邏輯中。 我告訴你

  1. 客戶端驗證的優勢在於,您可以控制在需要時警告用戶,並立即顯示相關消息。 但是請記住避免使用諸如日期比較之類的復雜邏輯作為驗證,因為在后端,您將有足夠的自由來對各種約束進行驗證。
  2. 通常在業務層上執行后端驗證總是更好的選擇,這可以成為應用程序中最強大的部分。 這樣可以確保輸出無缺陷,請記住拋出自定義異常,從而使應用程序看起來更好,並利用現有方法進行驗證。 isDigit(),isEmpty()等}。
  3. 在數據層級別,嘗試最小化驗證,但是如果對其他服務等有依賴性,有時我們必須包括它們。

關於bean驗證JSR 303,它有助於簡化映射到bean的用戶輸入字段的驗證{通常在帶有REST的基於Spring的應用程序中}

關於您的疑問,“ 由於驗證而拒絕從客戶端到服務器的數據傳輸也沒有意義 ” ..看起來應該如此,但采用這種方式處理涉及復雜的驗證的流程確實很重要邏輯和例外情況更好。

我認為談論驗證是在談論一種方法而不是解決方案。

一種方法可能是在任何層都有自己的驗證。 另一種方法是進行應用程序不可知的驗證。 前者還是后者的選擇取決於多種因素:應用程序復雜性,層設計,可維護性,層可重用性。

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

其他驗證可以是:

  • 檢查是否有任何注射
  • 檢查身份驗證/授權

關於可重用性:如果調用依賴客戶端驗證的業務層,則呼叫B2B無法使用驗證。

除了這些考慮因素之外,還有一些好的建議可以遵循。 例如,不要相信客戶端驗證

客戶端驗證對改善用戶體驗很有用,但不能替代服務器端驗證。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM