首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

服務端輸入驗證體系建設:從手工校驗到 Struts2 聲明式/編程式/自定義驗證器全景指南

     編輯:Java 綜合教學

前言

「永遠不要信任客戶端輸入」是安全鐵律。本文系統梳理服務端驗證演進路線:**手工編碼 → Struts2 內建聲明式/編程式 → 自定義驗證器**,並給出最佳實踐代碼與避坑指南。

一、無框架手工驗證

public String execute() {
    if (StringUtils.isBlank(username)) {
        addFieldError("username", "用戶名不能為空");
        return INPUT;
    }
    if (!EmailValidator.getInstance().isValid(email)) {
        addFieldError("email", "郵箱格式錯誤");
        return INPUT;
    }
    return SUCCESS;
}

缺點:代碼分散、難複用、與業務邏輯耦合。

二、Struts2 內建驗證體系

1. 核心攔截器

  • validation:執行驗證邏輯,收集 `FieldError` 到 `ActionContext`。
  • workflow:檢查是否有錯誤,有則返回 `INPUT` 結果(默認),無則繼續執行。

Action 必須實現 `ValidationAware` 接口(`ActionSupport` 已實現)。

2. 18 種內建驗證器速查

名稱類典型參數
requiredRequiredFieldValidator非 null
requiredstringRequiredStringValidatortrim+非空串
int/long/short/doubleXxxRangeFieldValidatormin/max
dateDateRangeFieldValidatormin/max (Date)
emailEmailValidator--
urlURLValidator--
stringlengthStringLengthFieldValidatorminLength/maxLength/trim
regexRegexFieldValidatorexpression
expressionExpressionValidatorexpression (OGNL)
visitorVisitorFieldValidatorcontext/prefix (級聯驗證嵌套對象)

3. 驗證規則配置文件命名規則

  • Action 級通用:`ActionName-validation.xml`(如 `UserAction-validation.xml`)。
  • 方法級專用:`ActionName-methodName-validation.xml`(如 `UserAction-register-validation.xml`)。
  • 放置位置:與 Action 類同包(classpath 下)。

4. 三種語法風格

<!-- 1. 字段驗證:針對單字段多規則 -->
<validators>
    <field name="age">
        <field-validator type="int">
            <param name="min">18</param>
            <param name="max">60</param>
            <message>年齡需在 ${min}-${max} 之間</message>
        </field-validator>
        <field-validator type="required">
            <message>年齡必填</message>
        </field-validator>
    </field>
</validators>

<!-- 2. 純驗證器:跨字段或無字段綁定 -->
<validators>
    <validator type="expression">
        <param name="expression"><![CDATA[password == confirmPassword]]></param>
        <message>兩次密碼不一致</message>
    </validator>
</validators>

<!-- 3. 短路優化:同字段多規則,首個失效跳過後續 -->
<field-validator type="stringlength" short-circuit="true">...</field-validator>

三、類型轉換錯誤攔截與友好提示

問題:`conversionError` 攔截器在 `validation` 前執行,捕獲類型轉換異常但**不返回 INPUT**,導致錯誤信息丟失。

解決:項目 `src` 下建立同名包覆蓋 `conversionError` 攔截器,修改 `intercept()` 邏輯:捕獲異常 → `addFieldError` → 返回 `INPUT`。

四、編程式驗證:實現 Validateable 接口

public class UserAction extends ActionSupport {
    @Override
    public void validate() {
        if (StringUtils.isBlank(username)) {
            addFieldError("username", "用戶名不能為空");
        }
        if (age != null && (age < 18 || age > 60)) {
            addFieldError("age", "年齡需在 18-60");
        }
        // 複雜業務規則:跨字段、查庫校驗等
        if (userService.exists(username)) {
            addFieldError("username", "用戶名已存在");
        }
    }
}

優點:Java 代碼完整表達力、易調試、可注入 Service。缺點:驗證邏輯與 Action 耦合。

五、自定義驗證器開發

  1. 繼承 `ValidatorSupport`(普通)或 `FieldValidatorSupport`(字段級)。
  2. 提供 `setXxx()` 接收參數、`getXxx()` 供錯誤訊息模板取值。
  3. 實現 `validate(Object)` / `validate(Object, String)` 核心邏輯。
  4. 在 classpath 根目錄建 `validators.xml` 註冊(參考 `default.xml` 格式)。
  5. 驗證配置中直接用 `` 或 ``。

六、最佳實踐總結

  1. 優先聲明式 XML:簡單規則(必填、長度、格式、範圍)用 XML,與業務解耦、可視化維護。
  2. 複雜規則編程式:跨字段、查庫、動態規則用 `validate()` 方法。
  3. 短路優化:同字段多規則加 `short-circuit="true"`,減少無效校驗。
  4. 類型轉換錯誤友好化:覆蓋 `conversionError` 攔截器返回 `INPUT`。
  5. 國際化:`` 用鍵值 ``,配合 `global.properties` 多語言。

總結

Struts2 驗證體系提供「聲明式 XML、編程式 Java、自定義擴展」三層彈性。實戰中**簡單規則用 XML、複雜規則用 Java、通用規則做驗證器**,配合 `short-circuit`、類型轉換友好化、國際化,即可構建健壯、可維護的服務端防護牆。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved