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

Spring MVC 實戰總結(五):後端校驗(Validator/JSR303)與文件上傳(Commons/Servlet3.0)完整指南

     編輯:Java 綜合教學

Spring MVC 實戰總結:後端校驗與文件上傳

Spring MVC 不僅優化架構分層,內建校驗與文件上傳支持更大幅提升開發效率。本文系統講解 Spring Validator 接口、JSR-303 Bean Validation (Hibernate Validator)、前端 jQuery Validate 三層校驗體系,以及 Commons FileUpload 與 Servlet 3.0 原生 兩種文件上傳方案。

一、Spring MVC 原生 Validator 接口

1.1 定義校驗器

public class ProductValidator implements Validator {
    @Override
    public boolean supports(Class<?> clazz) {
        return Product.class.isAssignableFrom(clazz);
    }
    @Override
    public void validate(Object target, Errors errors) {
        Product p = (Product) target;
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "required", "產品名稱必填");
        if (p.getPrice() < 0) errors.rejectValue("price", "price.negative", "價格不能為負");
        if (p.getProductType().getId() == 0) errors.rejectValue("productType.id", "type.required", "請選擇分類");
    }
}

1.2 Controller 執行校驗

@RequestMapping("/addSave")
public String addSave(Model model, Product product, BindingResult bindingResult) {
    new ProductValidator().validate(product, bindingResult);
    if (!bindingResult.hasErrors()) {
        productService.addProduct(product);
        return "redirect:/";
    }
    model.addAttribute("product", product); // 回顯數據
    model.addAttribute("productTypes", productTypeService.getAll());
    return "product/add";
}

1.3 JSP 顯示錯誤

<form:input path="name"/>
<form:errors path="name" cssClass="error"/> <!-- 渲染為 <span class="error">錯誤信息</span> -->

二、JSR-303 Bean Validation (Hibernate Validator) —— 推薦標準

2.1 依賴

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-validator</artifactId>
  <version>5.2.2.Final</version>
</dependency>

2.2 實體類聲明式校驗

public class Product implements Serializable {
    @Size(min=1, max=50, message="名稱長度 1-50")
    @Pattern(regexp="^[\\w\\u4e00-\\u9fa5]{0,10}$", message="只能字母數字中文")
    private String name;

    @Range(min=0, max=1000000, message="價格 0-100萬")
    private double price;

    @Valid // 級聯校驗關聯對象
    private ProductType productType;
    // getter/setter
}

2.3 常用註解速查

分類註解說明
空值@NotNull不為 null(不檢查空字符串/集合)
@NotEmpty不為 null 且 size > 0 (集合/數組/字符串/Map)
@NotBlank字符串 trim 後 length > 0
@Null必須為 null
布爾@AssertTrue / @AssertFalseBoolean 必須 true/false
長度@Size(min,max)字符串/集合/Map/數組長度範圍
@Length(min,max)僅字符串長度
日期@Past / @Future日期必須在當前時間之前/之後
正則@Pattern(regexp=,message=)字符串匹配正則
數值@Min / @Max數值下界/上界
@DecimalMin / @DecimalMaxBigDecimal 精度比較
@Digits(integer=,fraction=)整數位/小數位限制
@Range(min,max)數值閉區間 [min,max]
@Valid級聯校驗嵌套對象/集合元素
其他@Email @CreditCardNumber @URL @ScriptAssert特定格式校驗

2.4 Controller 啟用

@RequestMapping("/addGoodsSave")
public String addSave(Model model, @Valid Product product, BindingResult bindingResult) {
    if (!bindingResult.hasErrors()) { ... }
    // 失敗自動回顯,錯誤信息已綁定
}

三、前端校驗:jQuery Validate 插件(輔助,不可替代後端)

  • 規則聲明:rules: {name: {required: true, maxlength: 50}}
  • 信息定製:messages: {name: {required: "請輸入名稱"}}
  • 樣式控制:errorClass: "error", errorElement: "span"
  • 自定義方法:$.validator.addMethod("mobile", ...)
  • 複雜類型:radio/checkbox/select 同樣支持。

原則:前端校驗提升體驗、減輕服務器壓力;後端校驗保證安全、數據完整性,**兩者缺一不可**。

四、文件上傳方案對比

維度Commons FileUpload (Servlet < 3.0)Servlet 3.0 原生 (@MultipartConfig)
依賴commons-fileupload + commons-io無第三方,容器內建
配置XML 定義 CommonsMultipartResolver beanServlet 類上 @MultipartConfig 或 web.xml <multipart-config>
解析器 BeanCommonsMultipartResolverStandardServletMultipartResolver (id 必須為 multipartResolver)
Controller 參數MultipartFile[] files / MultipartHttpServletRequest相同,MultipartFile 來自 servlet-api
適用版本所有 Servlet 版本Tomcat 7+ / Jetty 8+

4.1 Commons 方案關鍵配置

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  <property name="defaultEncoding" value="utf-8"/>
  <property name="maxUploadSize" value="104857600"/> <!-- 100MB -->
  <property name="maxInMemorySize" value="40960"/>   <!-- 40KB 閾值 -->
</bean>

4.2 Servlet 3.0 方案關鍵配置 (web.xml)

<servlet>
  <servlet-name>springmvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <multipart-config>
    <max-file-size>5242880</max-file-size>       <!-- 5MB -->
    <max-request-size>20971520</max-request-size>  <!-- 20MB -->
    <file-size-threshold>0</file-size-threshold>
  </multipart-config>
</servlet>
<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"/>

4.3 統一 Controller 寫法

@RequestMapping(value="/fileSave", method=RequestMethod.POST)
public String upload(MultipartFile[] files, HttpServletRequest request) {
    String path = request.getServletContext().getRealPath("/files");
    for (MultipartFile file : files) {
        if (!file.isEmpty()) {
            String original = file.getOriginalFilename();
            File dest = new File(path, UUID.randomUUID() + original.substring(original.lastIndexOf('.')));
            file.transferTo(dest);
        }
    }
    return "success";
}

五、生產環境加固清單

  1. 文件重命名:UUID/雪花算法 + 原始擴展名,防覆蓋、防惡意腳本執行。
  2. 類型白名單:檢查 contentType + 文件頭魔數(如 JPEG: FF D8 FF),雙重校驗。
  3. 大小限制:前端 + 後端雙重攔截,配置 maxUploadSize / max-file-size。
  4. 存儲隔離:上傳目錄**不可執行腳本**,Nginx/Apache 禁用 PHP/Java/脚本解析;最佳方案上傳至對象存儲(OSS/S3/MinIO)。
  5. 異步/分片上傳:大文件(>100MB)採用前端分片 + 後端合併,支持斷點續傳。
  6. 病毒掃描:集成 ClamAV 或雲廠商安全服務。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved