我有几个如下所示的SprigMVC方法,返回ModelAndView或Responsebody。当用户向这些网址发出错过所需参数的请求时,他们自然会收到消息"必填字符串参数' id'不存在" 。
从安全角度来看,我希望隐藏用户的详细说明消息。因此,黑客不容易知道丢失的参数,并且在没有任何描述的情况下会得到400错误。这可能是通过弹簧配置/ Spring Security实现的,或者我必须手动重构我的所有方法以某种方式返回自定义消息。
@RequestMapping(value = "/payment", method = RequestMethod.GET)
public ModelAndView getReponse(@RequestParam(value = "id", required = true)) {
return model;
}
@RequestMapping(value = "/status", method = RequestMethod.GET)
public @ResponseBody String getStatus(@RequestParam(value = "id", required = true) String id) {
return "string";
}
答案 0 :(得分:8)
您实际需要的是MissingServletRequestParameterException的全局处理程序,当缺少请求参数时Spring会抛出该处理程序。解决此问题的最简单方法是使用ControllerAdvice来处理所有控制器。
import org.springframework.web.bind.MissingServletRequestParameterException;
@ControllerAdvice
class MissingServletRequestParameterExceptionHandler {
@ExceptionHandler(MissingServletRequestParameterException.class)
@ResponseBody
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String handleMissingParameter() {
return "Your custom result";
}
}
如果您只想为特定控制器隐藏缺少的参数消息,只需将handleMissingParameter
方法移动到此控制器,而无需创建ControllerAdvice。
答案 1 :(得分:3)
我个人赞成Daniel Olszewski的答案,因为它的时尚,美观,简洁和可读,尽管面向客户,公开可用的网站(当你超越Spring Boot阶段的快速原型时,需要完全确定没有通过)人们可能希望将它与web.xml方法中的普通error-page
一起使用(这里的一些示例:Handle error 404 with Spring controller)。
它可能不是很有趣(我个人认为,除了可解释之外,任何与XML相关的东西),但是(除非你根本没有使用web.xml来支持WebApplicationInitializer),web.xml几乎 Web应用程序中的最低层,没有错误页面(无论是异常还是URL映射)都会通过它,只记得映射所有HTTP状态代码(即有一个默认的error-page
元素没有孩子error-code
元素。)
WebApplicationInitializer的解决方案是类似的,这里有一些示例:Using Spring MVC 3.1+ WebApplicationInitializer to programmatically configure session-config and error-page。
最低层方法是将错误页面设置为竞争对手,例如对于Tomcat:http://linux-sxs.org/internet_serving/c581.html。