当前位置:   article > 正文

SpringBoot 2.3.0.RELEASE版本后自定义404页面,SpringBoot 错误处理兼容Ajax请求

SpringBoot 2.3.0.RELEASE版本后自定义404页面,SpringBoot 错误处理兼容Ajax请求

SpringBoot 2.3.0.RELEASE版本后自定义404页面

SpringBoot 404异常处理兼容Ajax请求

SpringBoot 2.3.0.RELEASE版本后ErrorController无getErrorPath方法

================================

©Copyright 蕃薯耀 2021-07-27

https://blog.csdn.net/w995223851

一、问题描述

在spring-boot-starter-parent 2.3.0.RELEASE版本后,org.springframework.boot.web.servlet.error.ErrorController接口已经不建议采用getErrorPath方法,在2.5.3版本后,ErrorController接口已经无getErrorPath方法(直接删除)。

查看子类,发现有org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController这个类,默认是:

  1. @Controller
  2. @RequestMapping("${server.error.path:${error.path:/error}}")
  3. public class BasicErrorController extends AbstractErrorController {
  4. }

那么就可以通过server.error.path进行配置的覆盖或者通过error.path进行配置覆盖,如果都不配置,就默认是:/error

建议配置成:error.path=/deprecated/error,这样自己就能定义/error的路径

配置error.path能同时覆盖处理页面和Ajax(Rest)请求,配置server.error.path只能覆盖处理页面跳转的请求,不能处理Ajax(Rest)请求,因为ErrorProperties默认是/error,需要通过error.path修改

二、SpringBoot 2.3.0.RELEASE版本后自定义404错误页面

1、创建GlobalErrorController全局错误处理类

  1. import java.io.IOException;
  2. import javax.servlet.RequestDispatcher;
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpServletResponse;
  5. import org.springframework.http.HttpStatus;
  6. import org.springframework.http.MediaType;
  7. import org.springframework.stereotype.Controller;
  8. import org.springframework.web.bind.annotation.RequestMapping;
  9. import org.springframework.web.bind.annotation.ResponseBody;
  10. import org.springframework.web.servlet.ModelAndView;
  11. import com.lqy.common.bean.Result;
  12. /**
  13. * 全局异常处理
  14. * 在spring-boot-starter-parent 2.3.0.RELEASE版本后,需要在application.properties增加配置:error.path=/deprecated/error,覆盖默认的全局异常处理。
  15. * <p>2.5.3后,ErrorController接口已经无getErrorPath方法。</p>
  16. * <p>查看子类,发现有org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController这个类,默认是:</p>
  17. * <p>@RequestMapping("${server.error.path:${error.path:/error}}")</p>
  18. * <p>那么就可以通过server.error.path进行配置的覆盖或者通过error.path进行配置覆盖,如果都不配置,就默认是:/error</p>
  19. * <p>建议配置成:error.path=/deprecated/error,这样自己就能定义/error的路径</p>
  20. * <p>配置error.path能同时覆盖处理页面和Ajax(Rest)请求,配置server.error.path只能覆盖处理页面跳转的请求,不能处理Ajax(Rest)请求,因为ErrorProperties默认是/error,需要通过error.path修改</p>
  21. *
  22. * @see org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController
  23. * @see org.springframework.boot.web.servlet.error.ErrorController
  24. *
  25. *
  26. */
  27. @Controller
  28. @RequestMapping
  29. public class GlobalErrorController {
  30. public final static String STATUS_CODE = "javax.servlet.error.status_code";
  31. /**
  32. * 获取HTTP请求状态码
  33. * @param request
  34. * @return
  35. */
  36. public HttpStatus getStatus(HttpServletRequest request) {
  37. Integer statusCode = (Integer) request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
  38. if (statusCode == null) {
  39. return HttpStatus.INTERNAL_SERVER_ERROR;
  40. }
  41. try {
  42. return HttpStatus.valueOf(statusCode);
  43. }
  44. catch (Exception ex) {
  45. return HttpStatus.INTERNAL_SERVER_ERROR;
  46. }
  47. }
  48. /**
  49. * 处理html页面请求的错误
  50. * @param request
  51. * @param response
  52. * @return
  53. * @throws IOException
  54. */
  55. @RequestMapping(value="/error", produces = MediaType.TEXT_HTML_VALUE)
  56. public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) throws IOException {
  57. Integer statusCode = (Integer) request.getAttribute(STATUS_CODE);
  58. ModelAndView mav = new ModelAndView();
  59. if(statusCode == 401) {
  60. mav.addObject("statusCode", 401);
  61. mav.setViewName("error/4xx");
  62. }else if(statusCode == 403) {
  63. mav.addObject("statusCode", 403);
  64. mav.setViewName("error/4xx");
  65. }else if(statusCode == 404) {
  66. mav.addObject("statusCode", 404);
  67. mav.setViewName("error/404");
  68. }else {
  69. mav.addObject("statusCode", 500);
  70. mav.setViewName("error/500");
  71. }
  72. return mav;
  73. }
  74. /**
  75. * 处理Ajax请求的错误
  76. * @param request
  77. * @param response
  78. * @return
  79. * @throws IOException
  80. */
  81. @RequestMapping(value="/error")
  82. @ResponseBody
  83. public Result error(HttpServletRequest request, HttpServletResponse response) throws IOException {
  84. Integer statusCode = (Integer) request.getAttribute(STATUS_CODE);
  85. return Result.failCode(statusCode);
  86. }
  87. }

2、覆盖默认的错误请求处理

在application.properties文件配置error.path=/deprecated/error

  1. #覆盖默认的全局异常处理路径,配合GlobalErrorController使用
  2. error.path=/deprecated/error

三、spring-boot-starter-parent 2.3.0.RELEASE版本之前的自定义异常页面

SpringBoot 自定义异常页面,SpringBoot 自定义404页面和500页面,SpringBoot 错误兼容Ajax请求,见:

https://blog.csdn.net/w995223851/article/details/116259412

(时间宝贵,分享不易,捐赠回馈,^_^)

================================

©Copyright 蕃薯耀 2021-07-27

https://blog.csdn.net/w995223851

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/615356
推荐阅读
相关标签
  

闽ICP备14008679号