【问题标题】:Spring MVC custom message for HTTP 400HTTP 400 的 Spring MVC 自定义消息
【发布时间】:2016-01-27 22:57:31
【问题描述】:

我有几个像下面这样的 SprigMVC 方法,返回一个 ModelAndView 或一个 Responsebody。当用户向这些缺少必需参数的 url 发出请求时,他们自然会得到消息“必需的字符串参数 '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";
}

【问题讨论】:

  • 所以绕过这个错误也会有所帮助,对吧?
  • @Rehman 不确定您所说的绕过是什么意思,但可能
  • 现在在编辑您的问题后就清楚了。我在想required=false。但你想要 400
  • 你能显示你的web.xml吗?特别是error-page 部分,如果您配置了它(这里有一些示例stackoverflow.com/questions/7066192/…
  • 你可以使用@ExceptionHandler。这是一个如何使用它的示例stackoverflow.com/questions/13356549/…

标签: java spring spring-mvc spring-security


【解决方案1】:

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

【讨论】:

  • tnx.这种方法比在我的 web.xml 中使用 有什么优势吗?我刚刚尝试过,我可以为所有 400 个错误显示我自己的自定义错误页面
  • 如果你只想显示一个简单的错误页面,那么不, 就足够了。但是您可以使用此处理程序来记录这种情况,并且由于您写过有关攻击的信息,因此您可能会对这些信息感兴趣。
  • 确实是记录! tnx 但不清楚如何将它用于单个控制器方法?有没有办法获取 HttpRequest 对象以进行详细日志记录
  • @ExceptionHandler 在班级级别上工作。如果你把它放在一个控制器类中,它会为这个类中的所有方法处理指定的异常。不幸的是,不可能只选择一种选定的方法。您需要一些自定义解决方案,例如,将请求传递给处理程序方法并验证您是否应该针对该 URL 执行处理程序或重新抛出异常。
【解决方案2】:

我个人赞成 Daniel Olszewski 的回答,因为它时髦、美观、简洁且易读,尽管在面向客户的公开网站上(当您超越 Spring Boot 阶段的快速原型设计并且需要完全确定 nothing 可以通过)人们可能想在 web.xml 方法中将它与普通的 error-page 一起使用(这里有一些示例:Handle error 404 with Spring controller)。

这可能不好玩(我个人鄙视任何与 XML 相关的东西,除了可解释性之外),但是(除非你根本没有使用 web.xml 来支持 WebApplicationInitializer),web.xml 几乎 em> web 应用程序的最低层,没有错误页面(无论是异常还是 URL 映射)将通过它,只要记住映射所有 HTTP 状态代码(即有一个默认的 error-page 元素没有子 @987654326 @元素)。

WebApplicationInitializer 的解决方案类似,这里有一些示例:Using Spring MVC 3.1+ WebApplicationInitializer to programmatically configure session-config and error-page

最低层的方法是设置错误页面内容,例如对于 Tomcat:http://linux-sxs.org/internet_serving/c581.html.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多