如何避免响应体中的异常堆栈

时间:2015-02-12 03:50:32

标签: spring-mvc

我目前正在使用Spring MVC 3.0.6。我的期望是在Spring级别抛出任何异常时(即在到达我的控制器的请求之前),不会将异常堆栈作为响应主体返回。当预期结果是HTML时,控件将转到包含自定义错误消息的错误页面。在这种情况下,结果符合我的预期。

但我遇到了问题,而预期的结果是JSON。在这种情况下,我将异常堆栈作为JSON格式。

e.g .-

请求的网址 - /MyApp/secure/employee/name.json?employee=815009& .........

让我们通过URL篡改一名员工= 815003333333333333333333333333333333333333333333333333333333333333333333333333333333339(意味着巨大的有效载荷)。

现在我得到的反应就像 -

{“exception”:{“value”:“8150 ......... ..9”, “errorCode”:“typeMismatch”,“requiredType”:“long”,“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”:[{..................... .. }]}}

我的预期回应就像 -

{“value”:[“一些自定义错误消息”],“成功”:false}

注意:在我的控制器中,我希望员工在@RequestParam中尽可能长(数据类型)。

我担心的是,由于异常堆栈包含有关从中传播异常的库的详细信息,因此可能会使我的应用程序在安全方面受到攻击。

有没有办法返回自定义消息而不是异常堆栈?

1 个答案:

答案 0 :(得分:0)

有很多方法可以处理有关要发送回调用者的异常的详细信息。

我相信@ControllerAdvise在这里很有用。你可以删除堆栈跟踪,只返回一个用户友好的消息。 (在删除堆栈跟踪之前记录)

有关其用法的更多信息,请参见here