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

Commons FileUpload 報「content type header is null」:Controller 被重複調用,二次請求非 multipart

     編輯:程式設計綜合問答

錯誤堆棧核心

org.apache.commons.fileupload.FileUploadBase$InvalidContentTypeException:
the request doesn't contain a multipart/form-data or multipart/mixed stream, content type header is null

現象分析

  1. 首次請求:Content-Type: multipart/form-data; boundary=... → 解析成功,業務邏輯執行
  2. **同一 Controller 方法被再次調用** → 二次請求 **無** Content-Type 或非 multipart → 拋出異常

為什麼會重複調用?常見原因

原因排查點
前端表單重複提交按鈕未禁用、JS 多次 form.submit()、$.ajax 重複綁定
Spring MVC 視圖解析轉發循環返回 forward:/sameUrl 導致再次進入同一 Controller
攔截器/過濾器 chain.doFilter 調用兩次檢查 web.xml、HandlerInterceptor 配置
錯誤頁面配置導致轉發<error-page> 指向同一 URL

快速定位:加請求日誌

@RequestMapping(params = "save")
public String save(HttpServletRequest req) {
    log.info("URI={}, Method={}, Content-Type={}, SessionId={}",
        req.getRequestURI(), req.getMethod(), req.getContentType(), req.getSession(false)?.getId());
    // 業務邏輯
}

觀察日誌:同一 Session 短時間內出現兩次 POST /save,第二次 Content-Type=null。

修復策略

  1. 前端防重:提交後按鈕 disabled=true,表單添加 onsubmit="return !this.submitted; this.submitted=true;"
  2. 後端冪等:基於 Token(如 UUID 存 Session/Redis)校驗,重複 Token 直接返回成功
  3. 修正轉發邏輯:避免 forward: 指向自身,改用 redirect: 或獨立結果頁
  4. 檢查 Filter 鏈:確保 chain.doFilter(request, response) **只調用一次**

代碼層面防禦

public Map<String, Object> getMapOfRequest(HttpServletRequest req) {
    String ct = req.getContentType();
    if (ct == null || !ct.toLowerCase().startsWith("multipart/")) {
        log.warn("非 multipart 請求直接返回空 Map: URI={}, CT={}", req.getRequestURI(), ct);
        return Collections.emptyMap(); // 或拋出業務異常
    }
    // 正常解析
    return UploadFile.getParameter(req);
}

總結

異常本質是「二次請求非 multipart」,而非配置錯誤。重點排查「為什麼同一邏輯被執行兩次」,前端防重 + 後端冪等雙重保險。

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