Tomcat 運行 JSP 頁面拋出 HTTP Status 500,堆疊追蹤顯示 java.lang.StringIndexOutOfBoundsException: String index out of range: -1,發生在 FCKeditor.retrieveBrowserVersion 中。本文詳細解析異常堆疊、定位問題代碼行、修復方案與預防措施。
org.apache.jasper.JasperException: java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:541)
...
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(String.java:1938)
at java.lang.String.substring(String.java:1905)
at com.fredck.FCKeditor.FCKeditor.retrieveBrowserVersion(FCKeditor.java:263) ← 關鍵行
at com.fredck.FCKeditor.FCKeditor.isCompatible(FCKeditor.java:251)
at com.fredck.FCKeditor.FCKeditor.create(FCKeditor.java:292)
at com.fredck.FCKeditor.tags.FCKeditorTag.doAfterBody(FCKeditorTag.java:689)
at org.apache.jsp.admin.news.edit_jsp._jspx_meth_FCK_005feditor_005f0(edit_jsp.java:322) ← JSP 頁面行號
...
| 信息 | 值 | 含義 |
|---|---|---|
| 異常類型 | StringIndexOutOfBoundsException | 字符串索引越界,訪問負索引或超過長度 |
| 具體索引 | -1 | substring 參數為負數,通常是 indexOf 返回 -1 未檢查直接傳給 substring |
| 觸發類 | com.fredck.FCKeditor.FCKeditor | FCKeditor 編輯器組件 (舊版 CKEditor 前身) |
| 觸發方法 | retrieveBrowserVersion | 解析 User-Agent 判斷瀏覽器版本兼容性 |
| JSP 頁面 | admin/news/edit.jsp 第 322 行 | <FCK:editor ... /> 標籤位置 |
| Tomcat 版本 | 6.0.13 | 極舊版本 (2007 年),建議升級 |
| 措施 | 說明 |
|---|---|
| 升級編輯器組件 | FCKeditor → CKEditor 5 / TinyMCE 6,現代瀏覽器原生支持、安全維護 |
| 升級 Tomcat | 6.0.13 → 9.0.x / 10.1.x,安全漏洞修復、Servlet/JSP 規範更新 |
| 異常處理中間件 | 配置 web.xml <error-page> 捕獲 500 錯誤頁面,避免暴露堆疊信息 |
| 輸入驗證習慣 | 所有 indexOf/lastIndexOf 結果用於 substring 前必須判斷 != -1 |
| 日誌監控告警 | ELK/日誌服務監控 500 錯誤率,異常激增即時告警 |
HTTP Status 500 配合 StringIndexOutOfBoundsException: -1,定位到 FCKeditor.retrieveBrowserVersion 中 indexOf 返回 -1 未檢查直接 substring。根因是舊版編輯器組件不兼容現代瀏覽器 User-Agent。徹底解決請升級編輯器組件,臨時可修補源碼或 JSP 層面繞過。同步升級 Tomcat 至維護版本,構建完整異常監控體系。