2015-02-12 85 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