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

SSH 整合項目:驗證碼刷新報錯 `NumberFormatException: For input string: "1429250952505"` 根因與修復

     編輯:程式設計綜合問答

錯誤堆疊分析

WARN OgnlValueStack:68 - Error setting value [[Ljava.lang.String;@1597a48] with expression [1429250952505]
java.lang.NumberFormatException: For input string: "1429250952505"
    at java.lang.Integer.parseInt(Integer.java:495)
    at ognl.OgnlParserTokenManager.makeInt(OgnlParserTokenManager.java:63)

核心原因

Struts2 OGNL 表達式解析器嘗試將請求參數 1429250952505(時間戳毫秒數)轉換為 Integer,但該數值 **超過 `Integer.MAX_VALUE (2,147,483,647)`**,導致解析失敗。

觸發鏈路

  1. JS 刷新驗證碼:img.src = ".../checkImage.action?" + new Date().getTime(); 生成 13 位毫秒級時間戳。
  2. 請求到達 Action,Struts2 將查詢字符串參數(無名參數)綁定到 ValueStack。
  3. OGNL 解析器將該參數視為表達式嘗試求值,發現純數字嘗試轉 int,溢出拋異常。

修復方案(任選其一)

方案一:JS 使用秒級時間戳(推薦,最簡單)

function changeImage() {
    var img = document.getElementById("checkImage");
    img.src = "${pageContext.request.contextPath}/checkImage.action?" + Math.floor(Date.now() / 1000);
}

10 位秒級時間戳(如 1429250952)在 Integer 範圍內,OGNL 可正常解析。

方案二:給參數起名,避免被當表達式

img.src = ".../checkImage.action?t=" + Date.now(); // 帶參數名 t=,OGNL 視為普通屬性賦值

對應 Action 添加 private Long t; // 或 String t 接收即可,不參與表達式求值。

方案三:自定義類型轉換器(徹底)

// struts.xml
 // 關閉轉換錯誤攔截(不推薦)

// 或註冊 Long 類型轉換器
public class LongConverter extends StrutsTypeConverter {
    public Object convertFromString(Map context, String[] values, Class toClass) {
        return Long.parseLong(values[0]);
    }
    public String convertToString(Map context, Object o) { return o.toString(); }
}

最佳實踐總結

  • **防禦性編程**:前端傳參盡量帶名字(?t=xxx),避免無名參數被 OGNL 誤解析。
  • **數據類型匹配**:Action 屬性用 Long/String 接收大數字,不要用 int。
  • **驗證碼機制**:生產環境建議用成熟庫(如 Kaptcha, Google reCAPTCHA),而非手寫 Servlet。

修改 JS 為秒級或帶參數名,即可徹底解決此報錯,無需動後端代碼。

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