使用Spring Web MVC的405错误的自定义处理

2022-09-04 07:04:03

在我的应用程序中,我有一些只允许POST的请求映射。如果有人碰巧在该特定路径处触发GET请求,他们会收到由容器(Tomcat)提供的405错误页面。我可以在web.xml中创建和定义405错误页面以进行自定义。

我想要什么:任何会导致405错误的请求都应该在特定的控制器方法中处理。

我尝试过:

  • 一个方法,其中“method = GET”作为所提到的每个映射的对应项。这工作正常,但需要我为每个只允许POST的路径创建一个实际的请求映射和方法。我发现这种不必要的重复和混乱。
  • 一个全局的“catch”方法(requestmapping /*):这不起作用,因为Spring认为GET方法是对仅用POST指定的路径的错误调用。
  • 一个 ExceptionHandler 注释的方法,用于处理类 HttpRequestMethodNotSupportedException 的异常:这不起作用。似乎Spring完全在其框架代码中抛出并捕获了此异常。
  • 在网络.xml中指定我自己的405。这并不完美,因为我希望有自定义处理而不是静态错误页面。

答案 1

我建议使用处理程序异常解析器。您可以使用spring的DefaultHandlerExceptionResolver。覆盖方法并返回自定义的 .这将适用于您的所有应用程序。handleHttpRequestMethodNotSupported()view

效果接近您在选项3中期望的效果。带注释的方法永远不会捕获异常的原因是,在找到成功的 Spring 控制器处理程序映射后,将调用这些异常处理程序带注释的方法。但是,您的异常在此之前会引发。@ExceptionHandler


答案 2

工作代码:

@ControllerAdvice
public class GlobalExceptionController {

    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
    public ModelAndView handleError405(HttpServletRequest request, Exception e) {
        ModelAndView mav = new ModelAndView("/405");
        mav.addObject("exception", e);  
        //mav.addObject("errorcode", "405");
        return mav;
    }
}

在 Jsp 页 (405.jsp):

<div class="http-error-container">
    <h1>HTTP Status 405 - Request Method not Support</h1>
    <p class="message-text">The request method does not support. <a href="<c:url value="/"/>">home page</a>.</p>
</div>

推荐