热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringBoot自定义错误页

在内嵌容器为tomcat的情况下,springboot一个请求发生内部错误需要调用错误页时,其实是在StandardHostValve里查找错误页&#x

在内嵌容器为tomcat的情况下,springboot一个请求发生内部错误需要调用错误页时,其实是在StandardHostValve里查找错误页,再触发一次错误页请求调用。具体代码如下

public final void invoke(Request request, Response response)throws IOException, ServletException {......Throwable t = (Throwable) request.getAttribute(RequestDispatcher.ERROR_EXCEPTION);// Protect against NPEs if the context was destroyed during a// long running request.if (!context.getState().isAvailable()) {return;}// Look for (and render if found) an application level error pageif (response.isErrorReportRequired()) {if (t != null) {throwable(request, response, t);} else {status(request, response);}}......
}private void status(Request request, Response response) {int statusCode = response.getStatus();// Handle a custom error page for this status codeContext context = request.getContext();if (context == null) {return;}/* Only look for error pages when isError() is set.* isError() is set when response.sendError() is invoked. This* allows custom error pages without relying on default from* web.xml.*/if (!response.isError()) {return;}//根据错误码查找已注册的错误页ErrorPage errorPage = context.findErrorPage(statusCode);if (errorPage == null) {//注意这里,springboot默认只注册一个错误页/error,所以在默认情况下//所有异常错误码都会跳转到/error// Look for a default error pageerrorPage = context.findErrorPage(0);}......
}

默认情况下,springboot只注册一个错误页/error,因此查找错误码页时不会找到任何匹配的,只能跳转到/error。springboot内注册错误页是通过添加ErrorPageRegistrar实现的

private void postProcessBeforeInitialization(ErrorPageRegistry registry) {for (ErrorPageRegistrar registrar : getRegistrars()) {registrar.registerErrorPages(registry);}}private Collection getRegistrars() {if (this.registrars &#61;&#61; null) {// Look up does not include the parent contextthis.registrars &#61; new ArrayList<>(this.beanFactory.getBeansOfType(ErrorPageRegistrar.class, false, false).values());this.registrars.sort(AnnotationAwareOrderComparator.INSTANCE);this.registrars &#61; Collections.unmodifiableList(this.registrars);}return this.registrars;}

所以我们要在springboot环境内注册自己的错误码配置的话&#xff0c;添加一个自定义的ErrorPageRegistrar就可以了。为了方便起见&#xff0c;我把错误码定义和错误页配置放一起了&#xff0c;只要把下面的代码拷到任意一个Controller里就可以了

&#64;Beanpublic ErrorPageRegistrar errorPageRegistrar(){return registry -> {registry.addErrorPages(new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR,"/500"));registry.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND,"/404"));registry.addErrorPages(new ErrorPage(HttpStatus.FORBIDDEN,"/403"));registry.addErrorPages(new ErrorPage(HttpStatus.UNAUTHORIZED,"/401"));};}&#64;RequestMapping("/500")&#64;ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)public RequestResult error500(HttpServletRequest request){Map body &#61; getErrorAttributes(request,true);return new RequestResult(false,"服务器异常",body);}&#64;RequestMapping("/404")&#64;ResponseStatus(HttpStatus.NOT_FOUND)public RequestResult error404(HttpServletRequest request){Map body &#61; getErrorAttributes(request,true);return new RequestResult(false,"无此路径:"&#43;body.get("path"));}&#64;RequestMapping("/403")&#64;ResponseStatus(HttpStatus.FORBIDDEN)public RequestResult error403(HttpServletRequest request){Map body &#61; getErrorAttributes(request,true);return new RequestResult(false,"无此资源访问权限:"&#43;body.get("path"));}&#64;RequestMapping("/401")&#64;ResponseStatus(HttpStatus.UNAUTHORIZED)public RequestResult error401(HttpServletRequest request){Map body &#61; getErrorAttributes(request,true);return new RequestResult(false,"未授权的访问:"&#43;body.get("path"));}

 


推荐阅读
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • ImmutableX Poised to Pioneer Web3 Gaming Revolution
    ImmutableX is set to spearhead the evolution of Web3 gaming, with its innovative technologies and strategic partnerships driving significant advancements in the industry. ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • andr ... [详细]
  • 本文探讨了 Spring Boot 应用程序在不同配置下支持的最大并发连接数,重点分析了内置服务器(如 Tomcat、Jetty 和 Undertow)的默认设置及其对性能的影响。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 深入解析 Spring Security 用户认证机制
    本文将详细介绍 Spring Security 中用户登录认证的核心流程,重点分析 AbstractAuthenticationProcessingFilter 和 AuthenticationManager 的工作原理。通过理解这些组件的实现,读者可以更好地掌握 Spring Security 的认证机制。 ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • 本文详细介绍如何在联想Y700平板电脑上从Windows 10重装为Windows 7,包括进入BIOS设置、调整启动模式和使用U盘安装系统的具体步骤。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 本文详细介绍了 JavaScript 中的条件判断(if-else 和 switch)以及循环控制(for、while 和 do-while)。我们将探讨这些结构的基本语法、使用场景及注意事项,并补充一些实用技巧。 ... [详细]
author-avatar
mobiledu2502910181
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有