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

Spring MVC + Freemarker 僅 IE 正常,其他瀏覽器報 400 錯誤的排查與解決

     編輯:程式設計綜合問答

現象分析

項目使用 Spring MVC + Freemarker,IE 可正常訪問登錄頁,Chrome/Firefox/Edge 等現代瀏覽器直接報 **HTTP 400 Bad Request**,無法加載登錄頁。這通常不是 Freemarker 模板語法錯誤(那會拋 500),而是 **請求未能正確到達 Controller,或參數綁定/編碼導致 Spring 拋出 400**。

常見原因與解決

1. 請求編碼過濾器缺失或順序錯誤 (最常見)

現代瀏覽器默認發送 UTF-8 編碼請求,若 `web.xml` 中缺少 `CharacterEncodingFilter` 或其位置不在最前,導致參數解析亂碼,Spring 拋 400。

<!-- web.xml 最前面 -->
<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

2. Freemarker 模板輸出編碼聲明缺失

模板頂部必須聲明 HTML5 Doctype 和 charset,否則瀏覽器可能以錯誤編碼渲染導致後續表單提交編碼錯誤。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <!-- ... -->
</head>

提供的代碼片段中 `<@g.htmlDocType />` 應輸出正確的 Doctype,請檢查 `g.htmlDocType` 宏定義。

3. 隱藏字符 / BOM 導致模板解析異常

Freemarker 模板文件 (`.ftl`) **必須以 UTF-8 無 BOM 格式保存**。Windows 記事本保存可能帶 BOM,導致模板引擎解析錯誤,間接引發 400。請用 Notepad++ / VS Code / IDEA 另存為「UTF-8 無 BOM」。

4. Spring MVC 靜態資源映射衝突

若 `web.xml` 中 `DispatcherServlet` 映射為 `/`,且未正確配置 `` 或 ``,導致 `.css/.js` 請求進入 Controller 找不到處理器拋 404/400。檢查 `spring-mvc.xml`:

<mvc:resources mapping="/js/**" location="/js/" />
<mvc:resources mapping="/style/**" location="/style/" />
<mvc:default-servlet-handler />

5. 表單提交 Action URL 錯誤

登錄表單 `

` 若為空或相對路徑錯誤,不同瀏覽器解析基礎 URL 行為不一致。建議使用絕對路徑或 Spring 標簽:

<form action="<@spring.url '/login' />" method="post">

6. 瀏覽器緩存導致舊腳本執行

強制清除瀏覽器緩存 (Ctrl+Shift+Delete) 或在靜態資源 URL 加版本號:`

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