org.apache.commons.fileupload.FileUploadBase$InvalidContentTypeException:
the request doesn't contain a multipart/form-data or multipart/mixed stream, content type header is null
Content-Type: multipart/form-data; boundary=... → 解析成功,業務邏輯執行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。
disabled=true,表單添加 onsubmit="return !this.submitted; this.submitted=true;"UUID 存 Session/Redis)校驗,重複 Token 直接返回成功forward: 指向自身,改用 redirect: 或獨立結果頁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」,而非配置錯誤。重點排查「為什麼同一邏輯被執行兩次」,前端防重 + 後端冪等雙重保險。