2015-02-12 48 views
0

我目前正在使用Spring MVC 3.0.6。我的期望是每當在Spring級別拋出任何異常(即 - 在向我的控制器發出請求之前),沒有異常堆棧將作爲響應主體返回。當預期的結果是HTML時,控制轉到包含自定義錯誤消息的錯誤頁面。在這種情況下,結果與我的預期相符。如何避免響應正文中的異常堆棧

但我面臨的問題,而預期的結果是JSON。在這種情況下,我將異常堆棧作爲JSON格式。

EG-

請求的URL - /MyApp/secure/employee/name.json?employee=815009 & .........

讓通過URL篡改看跌員工說= 815003333333333333333333333333333333333333333333333333333333333333333333333333333333339(意味着巨大的有效載荷)。

現在我越來越喜歡的響應 -

{ 「異常」:{ 「值」: 「8150 ......... ..9」, 「錯誤碼」: 「typeMismatch」, 「requiredType」:「長「,」propertyName「:null,」propertyChangeEvent「:null,」message「:」無法將類型'java.lang.String'的值轉換爲所需類型'long';嵌套異常是org.springframework.core.convert。 ConversionFailedException:無法將值「8150 ............ 9」從類型'java.lang.String'轉換爲類型'long';嵌套異常是java.lang.NumberFormatException:對於輸入字符串:\「8150 ......... ............ ..9「,」rootCause「:{」cause「:null,」message「:」對於輸入字符串:\「8150 ........................... 9」,「localizedMessage 「:」對於輸入字符串:\「8150 ............ ..9 \」「,」stackTrace「:[{............... ... ..}]}}

我預期的反應會是怎樣 -

{ 「值」: 「一些自定義錯誤消息」], 「成功」:假}

注意:我的控制器我期望員工在@RequestParam中長(數據類型)。

我擔心的是,由於異常堆棧包含有關從中傳播異常的庫的詳細信息,可能會使我的應用程序從安全角度來看很容易受到攻擊。

有什麼辦法可以返回自定義消息而不是異常堆棧嗎?

+0

向我們展示行爲。 – 2015-02-12 03:51:47

+0

我已更新我的關注。 – user1468495 2015-02-12 05:00:15

回答

0

有很多方法可以處理有關您想要發回給調用者的異常的詳細信息量。

我相信@ControllerAdvise在這裏很有用。您可以放棄堆棧跟蹤並返回用戶友好的消息。 (在您放棄堆棧跟蹤之前記錄日誌)

有關其用法的更多信息,請參見here

+1

感謝毗溼奴。我想提一下我目前使用Spring MVC-3.0.6的一點。在Spring MVC 3.2中引入了@ControllerAdvise。我會嘗試使用提到的其他解決方案。 – user1468495 2015-02-12 11:50:13

+0

其他解決方案幫助..? – Vishnu 2015-02-17 07:44:09

+0

Vishnu,我通過implements_ org.springframework.web.servlet.HandlerExceptionResolver_ 開發了一個自定義異常解析器,而我的自定義異常解析器只攔截JSON類型(即 - URL包含.json)請求。在這個解析器中,我正在準備自定義消息。 非常感謝您的幫助。 – user1468495 2015-02-18 11:00:21