SpringBoot中,错误页和异常处理定制实现原理

Python连接高斯数据库踩坑实录:从SASL报错到SSL安全连接的完整指南 本文详细记录了Python连接高斯数据库时遇到的SASL authentication报错及其解决方法。通过剖析SASL认证机制,对比了修改数据库配置、使用官方驱动等方案的利弊,并重点提供了通过自动化脚本生成SSL证书,实现安全、免密连接的完整指南,帮助开发者彻底解决连接难题。 阅读详情
/**
 * <pre>
 *
 *     前置概念:
 *
 *          Servlet规范中定义的一种机制ErrorPage,用于处理发生在Servlet容器中的错误,当Servlet容器无法处理请求时
 *          (比如404页面不存在、500服务器错误等), 会根据配置的ErrorPage来展示相应的错误页面
 *
 *          在Tomcat处理请求的时候,出现异常就会找给Tomcat上下中注册的ErrorPage对象,其中ErrorPage中存在code,异常类型和转发的路径
 *          并且,会先根据响应错误码来找设置了一致code的ErrorPage,否则按照异常类型来找ErrorPage对象
 *          找了ErrorPage对象之后,会在request作用域中存入一大堆的数据,最终又会调用Servlet的API对ErrorPage中的location的URL进行转发
 *          RequestDispatcher rd = servletContext.getRequestDispatcher(errorPage.getLocation()).include(request.getRequest(), response.getResponse());;
 *
 *    在SpringBoot中,{@link org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryConfiguration}配置了TomcatServletWebServerFactory
 *    该类就是用于创建Tomcat对象的,对Tomcat的配置都在该工厂中配置,所以,对于ErrorPage,就是在{@link org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory#configureContext}完成的
 *    SpringBoot会将自身配置的ErrorPage对象,一一转换为Tomcat提供的ErrorPage对象,然后注册到Tomcat上下文中
 *
 *    而如何在SpringBoot中注册ErrorPage呢? 在SpringBoot的Web服务器的自动配置中,注入的一个{org.springframework.boot.web.server.ErrorPageRegistrarBeanPostProcessor}的Bean
 *    这个BeanPostProcessor在Bean的初始化前,会从Spring容器中获取ErrorPageRegistrar类型的Bean,然后通过回调ErrorPageRegistrar.registerErrorPages来注册ErrorPage
 *    而SpringBoot又提供了一个{@link org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration.ErrorPageCustomizer},注册了一个默认的ErrorPage
 *    // 接收ServerProperties的error属性中的path来配置默认的该ErrorPage转发的路径,默认为/error @Value("${error.path:/error}")
 *    ErrorPage errorPage = new ErrorPage(this.dispatcherServletPath.getRelativePath(this.properties.getError().getPath()));
 *    errorPageRegistry.addErrorPages(errorPage);
 *
 *    在SpringMVC中,就只能通过web.xml中配置ErrorPage,因为web.xml是tomcat需要的配置文件,对于tomcat的配置都可以在web.xml中配置
 *
 *    如果不需要用到ErrorPage机制,那么我们可以利用SpringMVC提供的异常解析器机制,使用自定义的HandlerExceptionResolver或者SpringMVC提供的异常解析器
 *    返回ModelAndView,设置自己固定的错误页面或者动态设置页面都可以, 这样,在出现异常的情况下,SpringMVC就可以处理,不需要将异常抛到Tomcat
 *
 *
 * 在Springboot-springmvc异常处理的核心原理{@link DispatcherServlet#processHandlerException}
 *
 *
 * 最后,在SpringBoot默认提供的ErrorPage有专门的处理类{@link org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration}
 * 该类的作用:
 *      1. BasicErrorController,处理/error请求的类
 *      2. DefaultErrorAttributes该类是一个HandlerExceptionResolver,进行异常解析
 *      3. ErrorPageCustomizer: 注册ErrorPage,规定路径为/error(默认,可以修改)
 *      4. PreserveErrorControllerTargetClassPostProcessor: 该类会对所有实现了ErrorController接口的BeanDefinition中设置preserveTargetClass,使用CBLIB代理
 *      5. DefaultErrorViewResolver: 默认的错误视图解析器,可以解析error/目录下的4xx,5xx.html视图
 *      6: StaticView: /error返回的View视图,因为/error可以返回页面,json,多种情况都要兼容
 *      7: BeanNameViewResolver: 解析View(StaticView)对象的视图解析器
 * </pre>
 */
public class DispatcherServlet {
    //  请求处理的核心逻辑
    public void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
        // 正常执行返回的结果
        ModelAndView mv = null;
        // 执行过程中是否出现异常
        Exception dispatchException = null;

        try {
            // 获取处理请求的Handler类
            mappedHandler = getHandler(processedRequest);
            // 执行Handler的方法
            mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
        } catch (Exception ex) {
            // 执行过程出现异常
            dispatchException = ex;
        } catch (Throwable err) {
            dispatchException = new NestedServletException("Handler dispatch failed", err);
        }
        // 处理最终的结果
        this.processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
    }

    /**
     * 处理最终结果
     *
     * @param request       请求对象
     * @param response      响应对象
     * @param mappedHandler 处理请求的handler类
     * @param mv            正确执行返回的模型和视图对象,如果出现异常则没有
     * @param exception     执行过程中的异常对象
     */
    private void processDispatchResult(HttpServletRequest request, HttpServletResponse response, HandlerExecutionChain mappedHandler, @Nullable ModelAndView mv, Exception exception) {
        // 是否存在异常的view
        boolean errorView = false;
        // 如果存在异常对象,表示出现异常了
        if (exception != null) {
            // 获取到处理接口的Handler
            Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
            // 处理异常情况,使用异常解析器,看是否能处理该异常情况,并且返回一个模型和视图对象
            mv = this.processHandlerException(request, response, handler, exception);
            // 异常解析器如果成功返回ModelAndView,表示给定了指定的视图
            errorView = (mv != null);
        }
        // 存在ModelAndView对象
        if (mv != null && !mv.wasCleared()) {
            // 就可以调用View对象的render方法
            this.render(mv, request, response);
            // 如果存在异常的ModelAndView对象
            if (errorView) {
                // 删除保存到请求域中的异常数据,处理异常的时候保存的
                WebUtils.clearErrorRequestAttributes(request);
            }
        }
    }

    // 视图解析渲染
    public void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception {
        // 最终渲染的视图对象
        View view;
        // 获取视图名称
        String viewName = mv.getViewName();
        // 如果存在视图名,就需要根据视图解析器根据名称解析成View对象
        if (viewName != null) {
            // 根据所有的视图解析器对该名称进行解析,直到解析到View对象为止
            view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
            // 如果所有视图解析器都无法解析该视图名,抛出异常,因为没有视图对象View可以渲染
            if (view == null) {
                throw new ServletException("Could not resolve view with name '" + mv.getViewName() + "' in servlet with name '" + getServletName() + "'");
            }
        } else {
            // 没有视图名,那么就可能直接在ModelAndView中设置的是View对象
            view = mv.getView();
            if (view == null) {
                throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a " + "View object in servlet with name '" + getServletName() + "'");
            }
        }
        // 如果设置了状态
        if (mv.getStatus() != null) {
            // 保存该状态,并且设置到响应对象中
            request.setAttribute(View.RESPONSE_STATUS_ATTRIBUTE, mv.getStatus());
            response.setStatus(mv.getStatus().value());
        }
        // 调用View对象的渲染流程,该转发转发,重定向重定向,自定义就自定义
        view.render(mv.getModelInternal(), request, response);
    }

    // 处理异常的核心逻辑
    public ModelAndView processHandlerException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 最终异常解析器处理完成返回的模型视图对象
        ModelAndView exMv = null;
        if (this.handlerExceptionResolvers != null) {
            // 遍历所有的异常解析器对象
            for (HandlerExceptionResolver resolver : this.handlerExceptionResolvers) {
                // 执行解析异常逻辑,返回ModelAndView对象
                exMv = resolver.resolveException(request, response, handler, ex);
                // 直到有异常解析器返回ModelAndView结束
                if (exMv != null) {
                    break;
                }
            }
        }
        // 如果异常解析器解析完成,并且解析到了ModelAndView
        if (exMv != null) {
            // 返回的是否是一个空视图,并且Model中也没有数据,直接结束,也不需要干嘛了
            if (exMv.isEmpty()) {
                request.setAttribute(EXCEPTION_ATTRIBUTE, ex);
                return null;
            }
            // 如果不存在视图View对象,要执行一些默认的操作,比如按照默认的策略找视图名
            if (!exMv.hasView()) {
                // 获取默认的视图名,默认情况url就是视图名
                String defaultViewName = getDefaultViewName(request);
                // 如果url获取到视图名
                if (defaultViewName != null) {
                    // 保存需要解析该视图对象
                    exMv.setViewName(defaultViewName);
                }
            }
            // 将异常信息保存到请求域中
            WebUtils.exposeErrorRequestAttributes(request, ex, getServletName());
            // 只要拿到ModelAndView,那么SpringMVC就会当正常逻辑来进行视图解析渲染
            return exMv;
        }
        // 如果没有视图解析能解析该异常并返回ModelAndVie对象,则继续抛出异常
        throw ex;
    }
}

2024最新指南:如何用Python批量下载Sentinel-2数据(附避坑清单) 本文提供2024年最新Python批量下载Sentinel-2遥感数据的完整指南,涵盖环境配置、API准备、核心下载流程实现及实战避坑清单。通过智能查询器、断点续传下载器等实用工具,帮助用户高效获取遥感数据,避免常见网络问题和数据完整性验证失败。 阅读详情

相关推荐

Win11注册表没有MMC的解决方法

本文详细介绍了在Win11系统中解决注册表没有MMC项的问题的方法。通过创建并导入注册表修复文件,我们可以成功地在注册表中添加缺失的MMC项。在操作过程中,需要注意备份注册表、以管理员身份运行工具以及系统更新等事项。希望本文能够帮助到遇到类似问题的用户,提高系统管理的效率和便捷性。如果你还有其他关于Windows操作系统的问题或疑问,欢迎随时提问并寻求帮助。

nntxthml的博客 1552

SpringBoot Whitelabel Error Page的根本原因,三种解决方案以及其特点

0、简述 在学习这个学习笔记之前最好能够对spring mvc以及Tomcat有些了解,这样理解起来更加方便,如果需要知道最直接的解决方案,拖到最底部看样例代码即可。 介绍了springboot的白页出现的真正原因,主要是没有合适的匹配情况出现404情况,然后跳转到系统默认的第一个ErrorPage,也就是白页内容上,然后根据其特定分别从三个角度,1、拦截器,2、新ErrorPage,3、自定...

mnhpo_Q的博客 1万+

【顾邦小讲堂】第十九期 RC Snubber吸收电路详解:抑制MOSFET振铃现象与过冲的设计技巧!

通过RC Snubber电路有效抑制MOSFET DS端的过冲及振铃现象,帮助工程师们在设计中提升电路的稳定性和可靠性

GBupupup的博客 3780

springboot自定义errorPage详解(本地正常访问403页面,部署到服务器就无法访问问题)

一、开发环境:springboot1.5.13, 二、普通ssm框架配置errorPage:在普通的web项目中,自定义errorPage方式为:在web.xml中添加如下配配置,location表示自定义jsp页面的存放路径,error-code表示错误状态,这样就完成了自定义errorPage的设置 &lt;error-page&gt; &lt;error-code&gt;...

hp_yangpeng的博客 8669

联想拯救者恢复出厂设置全攻略

通过本文介绍的几种方法,你可以轻松地将联想拯救者恢复到出厂系统状态。无论是通过Windows恢复选项、高级启动选项还是一键恢复功能,都能帮助你解决系统问题、清除个人信息或重置软件环境。在重置前,请务必备份重要数据,并确保了解重置的影响。重置完成后,进行适当的系统设置和软件安装,让你的联想拯救者焕然一新,继续为你提供高效、稳定的计算体验。

mmoo_python的博客 3252

点云特征提取的实战对比:Voxel-based 与 Pillar-based 在自动驾驶中的表现

本文深入对比了自动驾驶中点云特征提取的两种主流方法:Voxel-based与Pillar-based。Voxel-based方法通过三维体素化保留完整几何信息,检测精度高,但计算消耗大;Pillar-based方法将点云压缩为二维柱状特征图,牺牲部分垂直细节以换取极高的处理速度,更适合实时性要求高的量产场景。文章结合实战数据,为不同算力、精度与工程需求的场景提供了清晰的选型指南。

weixin_29045001的博客 220

SpringBoot中ErrorPage(错误页面)的使用--【ErrorPage组件】

error-page元素用于将一段错误代码或一个异常类型映射到Web应用中的资源路径,从而在产生特殊的HTTP错误或指定的Java异常时,将显示相关的资源。数据源里的datasource 的名字。本质上就是让你原来的错误页数,换了一个“肤”,所以,其实,错误页面是接手了以前的那一堆的文字(这个会让客户很难受)第二困惑,就是不知道以什么样的顺序去学,有的时候乱看一堆视频有遗漏,有的时候,两边的视频还有重复。事实上成熟的程序员更愿意看到的是这样的出错页面,因为这里包括了出错的信息,方便程序员修正这个错误,

dearmite的专栏 2295

若依(ruoyivue)实现文档在线查看

1、Kkfileview部署 第一步:从kkfileview官方发行版本下载安装包,安装包下载路径: https://gitee.com/kekingcn/file-online-preview/releases, 第二步:解压kkFileView-x.x.x文件(Windows用.zip包,Linux/MacOS用.tar.gz包) 第三步:打开解压后文件夹的bin目录,运行startup脚本(Windows下以管理员身份运行startup.bat,Linux以root用户运行startup.sh) 第四

weixin_46953697的博客 9678

SpringBoot 多种方式配置错误页面

⏹静态资源文件 ⏹ErrorController接口 ⏹ErrorPageRegistrar接口 ⏹BasicErrorController类 ⏹@ControllerAdvice + @ExceptionHandler注解

菜鸟记录 3563

告别迷茫!用ETAS RTA-OS配置你的第一个AUTOSAR OS任务(含VRTA虚拟ECU实战)

本文详细介绍了如何使用ETAS RTA-OS工具链在VRTA虚拟ECU上配置和运行第一个AUTOSAR OS任务。通过从XML配置到任务调度的全流程实战,帮助开发者快速掌握嵌入式操作系统开发的核心步骤,特别适合刚接触AUTOSAR的开发者快速上手。

weixin_42533622的博客 418

RT-DETR算法优化改进:DCNv4更快收敛、更高速度、更高性能,效果秒杀DCNv3、DCNv2等 ,助力检测

DCNv4更快收敛、更高速度、更高性能,完美和RT-DETR结合,助力涨点

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1321

springboot 配置错误页面

springboot 配置错误页

qq_949796899的博客 1387

10、GPU发展历程:从光线追踪到网格着色器的技术革新

本文回顾了GPU的发展历程,重点探讨了从光线追踪到网格着色器的技术革新。涵盖了DirectX 12时代(2015-2020)光线追踪与AI结合的突破,包括NVIDIA的Volta架构、DLSS技术原理及可变速率着色的应用。随后介绍了DirectX 12 Ultimate时代(2020)网格着色器的引入,分析了其计算模型、细粒度控制能力及跨平台优势。最后总结了着色器的演变及GPU在多个领域的广泛应用。

ol789012345的博客 181

SpringBoot异常处理原理&定制错误页面/数据

SpringBoot异常处理原理&定制错误页面/数据 一 、原理 可以参照ErrorMvcAutoConfiguration类,错误处理的自动配置类: 主要是给容器添加了以下组件: ErrorPageCustomizer @Override // 注册错误页面 public void registerErrorPages(ErrorPageRegistry errorPageRegistry) { // 主要是这里的getPath方法,返回了下面/error的路径 ErrorPage error

XiaoBaiYiMei1的博客 331

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

SpringBoot定制错误响应

默认错误处理机制 默认效果: 浏览器会返回一个错误页面,404什么的 其他客户端会默认响应一个json数据 简易的部分原理: 容器中有以下组件 DefaultErrorAttributes:帮我们在页面共享信息。 BasicErrorController:处理默认/error请求。 ErrorPageCustomizer:系统出现错误以后来到error请求进行处理。 Default...

Kelo666的博客 607

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

springboot错误处理机制原理以及自定义异常处理

springboot错误处理原理以及自定义异常处理 1.springboot默认错误处理机制 1.1浏览器:默认返回一个错误界面 1.2其他客户端:默认返回json数据 2.springboot异常处理原理 ErrorMvcAutoConfiguration 这个和错误有关的自动配置类给容器中注入了几个组件:DefaultErrorAttributes、BasicErrorController、ErrorPageCustomizer、 DefaultErrorViewResolver 1.Defaul

xiaoshiguang3的博客 1051

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SpringBoot之异常处理

包含SpringBoot默认处理规则、如何定制错误(异常)处理逻辑、异常处理步骤流程、自定义处理代码。有精确的错误状态码页面就匹配精确(如404就找404.html),没有就找 4xx.html;如果都没有就触发白页。底层是 ResponseStatusExceptionResolver ,把responsestatus注解的信息底层调用 response.sendError(statusCode, resolvedReason);tomcat发送的/error。

浩泽学编程的博客 507

springboot2——7 异常处理 web原生组件 springboot定制化

异常处理、web原生组件、定制化springboot

yangpei的博客 423

SpringBoot-17-异常处理

SpringBoot异常处理     在web开发中,会遇到一些异常,这通常需要一个统一的异常处理机制,保证客户端能接受到友好的提示。Spring Boot 中存在的异常处理机制有两种:默认异常处理机制和全局异常处理机制。   1. 默认异常处理机制 Spring Boot 默认提供了一套默认的异常处理机制,一旦程序出现了异常,Spring Boot 就会自动识别出客户端的类型(浏览器客户端或机器客户端),并根据客户端的不同,以不同的形式展示异常信息 对于浏览器客户端而言,Spring Boot会响应一个

paiidds的博客 1031

【SpringBoot】24 核心功能 - Web开发原理 -Spring Boot 异常处理机制

Spring Boot提供了完善的异常处理机制,包括默认错误处理规则和多种定制方式。默认情况下,系统会通过/error路径处理异常,返回JSON或HTML格式的错误信息。开发者可以通过自定义错误页、使用@ControllerAdvice和@ExceptionHandler注解,或实现HandlerExceptionResolver接口来定制异常处理逻辑。其底层通过ErrorMvcAutoConfiguration自动配置组件,采用责任链模式处理异常。这种机制兼顾了开箱即用和高度可定制性,为Web应用开发提供

杰西笔记 1365

java web的异常处理

1、异常处理 默认规则 默认情况下,Spring Boot提供/error处理所有错误的映射 对于机器客户端,它将生成JSON响应,其中包含错误,HTTP状态和异常消息的详细信息。对于浏览器客户端,响应一个“ whitelabel”错误视图,以HTML格式呈现相同的数据 要完全替换默认行为,可以实现 ErrorController并注册该类型的Bean定义,或添加ErrorAttributes类型的组件以使用现有机制但替换其内容。 error/下的4xx,5xx页面会被自动解析; 定制错

weixin_46429290的博客 1263

09SpringBoot web 错误处理

原理 参照ErrorMvcAutoConfiguration,错误处理的自动配置给容器中添加的组件 1.DefaultErrorAttributes 2.BasicErrorController 3.ErrorPageCustomizer 4.DefaultErrorViewResolver 1.定制错误页面 有模板引擎的情况下;error/状态码; 【将错误页面命名为 错误状态码.html 放在...

iThinkSeven 1785

springboot 之 异常处理机制

文章目录springboot 默认异常处理机制springboot 异常处理机制原理分析定制错误响应定义错误页面定制错误返回的json数据 springboot 默认异常处理机制 当浏览器去访问的时候: 我们看看浏览器的请求头携带的参数: 这里我们使用其他客户端去请求以下(这里使用的是postman): 这里可以看出springboot 对异常响应的数据做了判断,如果是直接在浏览器请求返回页...

qq_43059674的博客 541

spring Boot2 —— 异常处理机制详细源码分析(附源码)

异常处理 文章目录异常处理一、错误处理1、默认规则2、定制错误处理逻辑二、异常处理自动配置原理1、自动配置异常处理规则2、异常处理步骤流程 一、错误处理 1、默认规则 (1)默认情况下,Spring Boot提供/error处理所有错误的映射 (2)对于机器客户端,它将生成JSON响应,其中包含错误,HTTP状态和异常消息的详细信息。对于浏览器客户端,响应一个“ whitelabel”错误视图,以HTML格式呈现相同的数据 (3)要对其进行自定义,添加View解析为error (4)要完全替换默认行为,

qq_35843514的博客 505

09异常处理【源码阅读】

阅读导航。

本人主攻Java,希望自己能成为出色的程序员。 298

springboot:错误处理机制

规划和健康

dfdvf的博客 474
上一篇: SpringBoot-SpringMVC中的ContentNegotiationStrategy内容协商策略的作用和原理
下一篇: SpringBoot-SpringMVC中,常用参数注解总结
安缇吖
博客等级 码龄9年 411粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值