HTTP 400的Spring MVC自定义消息


问题内容

我下面有几种SprigMVC方法,返回ModelAndView或Responsebody。当用户向这些网址请求缺少必需参数的请求时,他们自然会收到消息
“不存在必需的字符串参数’id’”

从安全角度来看,我想向用户 隐藏此详细描述消息
。因此,黑客不容易知道丢失的参数,并且会在没有任何描述的情况下得到400错误。这是可以通过spring配置/ 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";
}

问题答案:

您真正需要的是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。