热门标签 | 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"));}

 


推荐阅读
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
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社区 版权所有