/**
* <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;
}
}
相关推荐
Win11注册表没有MMC的解决方法
本文详细介绍了在Win11系统中解决注册表没有MMC项的问题的方法。通过创建并导入注册表修复文件,我们可以成功地在注册表中添加缺失的MMC项。在操作过程中,需要注意备份注册表、以管理员身份运行工具以及系统更新等事项。希望本文能够帮助到遇到类似问题的用户,提高系统管理的效率和便捷性。如果你还有其他关于Windows操作系统的问题或疑问,欢迎随时提问并寻求帮助。
SpringBoot Whitelabel Error Page的根本原因,三种解决方案以及其特点
0、简述 在学习这个学习笔记之前最好能够对spring mvc以及Tomcat有些了解,这样理解起来更加方便,如果需要知道最直接的解决方案,拖到最底部看样例代码即可。 介绍了springboot的白页出现的真正原因,主要是没有合适的匹配情况出现404情况,然后跳转到系统默认的第一个ErrorPage,也就是白页内容上,然后根据其特定分别从三个角度,1、拦截器,2、新ErrorPage,3、自定...
【顾邦小讲堂】第十九期 RC Snubber吸收电路详解:抑制MOSFET振铃现象与过冲的设计技巧!
通过RC Snubber电路有效抑制MOSFET DS端的过冲及振铃现象,帮助工程师们在设计中提升电路的稳定性和可靠性
springboot自定义errorPage详解(本地正常访问403页面,部署到服务器就无法访问问题)
一、开发环境:springboot1.5.13, 二、普通ssm框架配置errorPage:在普通的web项目中,自定义errorPage方式为:在web.xml中添加如下配配置,location表示自定义jsp页面的存放路径,error-code表示错误状态,这样就完成了自定义errorPage的设置 <error-page> <error-code>...
联想拯救者恢复出厂设置全攻略
通过本文介绍的几种方法,你可以轻松地将联想拯救者恢复到出厂系统状态。无论是通过Windows恢复选项、高级启动选项还是一键恢复功能,都能帮助你解决系统问题、清除个人信息或重置软件环境。在重置前,请务必备份重要数据,并确保了解重置的影响。重置完成后,进行适当的系统设置和软件安装,让你的联想拯救者焕然一新,继续为你提供高效、稳定的计算体验。
点云特征提取的实战对比:Voxel-based 与 Pillar-based 在自动驾驶中的表现
本文深入对比了自动驾驶中点云特征提取的两种主流方法:Voxel-based与Pillar-based。Voxel-based方法通过三维体素化保留完整几何信息,检测精度高,但计算消耗大;Pillar-based方法将点云压缩为二维柱状特征图,牺牲部分垂直细节以换取极高的处理速度,更适合实时性要求高的量产场景。文章结合实战数据,为不同算力、精度与工程需求的场景提供了清晰的选型指南。
SpringBoot中ErrorPage(错误页面)的使用--【ErrorPage组件】
error-page元素用于将一段错误代码或一个异常类型映射到Web应用中的资源路径,从而在产生特殊的HTTP错误或指定的Java异常时,将显示相关的资源。数据源里的datasource 的名字。本质上就是让你原来的错误页数,换了一个“肤”,所以,其实,错误页面是接手了以前的那一堆的文字(这个会让客户很难受)第二困惑,就是不知道以什么样的顺序去学,有的时候乱看一堆视频有遗漏,有的时候,两边的视频还有重复。事实上成熟的程序员更愿意看到的是这样的出错页面,因为这里包括了出错的信息,方便程序员修正这个错误,
若依(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) 第四
SpringBoot 多种方式配置错误页面
⏹静态资源文件 ⏹ErrorController接口 ⏹ErrorPageRegistrar接口 ⏹BasicErrorController类 ⏹@ControllerAdvice + @ExceptionHandler注解
告别迷茫!用ETAS RTA-OS配置你的第一个AUTOSAR OS任务(含VRTA虚拟ECU实战)
本文详细介绍了如何使用ETAS RTA-OS工具链在VRTA虚拟ECU上配置和运行第一个AUTOSAR OS任务。通过从XML配置到任务调度的全流程实战,帮助开发者快速掌握嵌入式操作系统开发的核心步骤,特别适合刚接触AUTOSAR的开发者快速上手。
RT-DETR算法优化改进:DCNv4更快收敛、更高速度、更高性能,效果秒杀DCNv3、DCNv2等 ,助力检测
DCNv4更快收敛、更高速度、更高性能,完美和RT-DETR结合,助力涨点
springboot 配置错误页面
springboot 配置错误页
10、GPU发展历程:从光线追踪到网格着色器的技术革新
本文回顾了GPU的发展历程,重点探讨了从光线追踪到网格着色器的技术革新。涵盖了DirectX 12时代(2015-2020)光线追踪与AI结合的突破,包括NVIDIA的Volta架构、DLSS技术原理及可变速率着色的应用。随后介绍了DirectX 12 Ultimate时代(2020)网格着色器的引入,分析了其计算模型、细粒度控制能力及跨平台优势。最后总结了着色器的演变及GPU在多个领域的广泛应用。
SpringBoot异常处理原理&定制错误页面/数据
SpringBoot异常处理原理&定制错误页面/数据 一 、原理 可以参照ErrorMvcAutoConfiguration类,错误处理的自动配置类: 主要是给容器添加了以下组件: ErrorPageCustomizer @Override // 注册错误页面 public void registerErrorPages(ErrorPageRegistry errorPageRegistry) { // 主要是这里的getPath方法,返回了下面/error的路径 ErrorPage error
廖雪峰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...
ET2012新版免狗免安装绿色软件
ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,
springboot错误处理机制原理以及自定义异常处理
springboot错误处理原理以及自定义异常处理 1.springboot默认错误处理机制 1.1浏览器:默认返回一个错误界面 1.2其他客户端:默认返回json数据 2.springboot异常处理原理 ErrorMvcAutoConfiguration 这个和错误有关的自动配置类给容器中注入了几个组件:DefaultErrorAttributes、BasicErrorController、ErrorPageCustomizer、 DefaultErrorViewResolver 1.Defaul
老版QQ原生表情gif动态
这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。
SpringBoot之异常处理
包含SpringBoot默认处理规则、如何定制错误(异常)处理逻辑、异常处理步骤流程、自定义处理代码。有精确的错误状态码页面就匹配精确(如404就找404.html),没有就找 4xx.html;如果都没有就触发白页。底层是 ResponseStatusExceptionResolver ,把responsestatus注解的信息底层调用 response.sendError(statusCode, resolvedReason);tomcat发送的/error。
springboot2——7 异常处理 web原生组件 springboot定制化
异常处理、web原生组件、定制化springboot
SpringBoot-17-异常处理
SpringBoot异常处理 在web开发中,会遇到一些异常,这通常需要一个统一的异常处理机制,保证客户端能接受到友好的提示。Spring Boot 中存在的异常处理机制有两种:默认异常处理机制和全局异常处理机制。 1. 默认异常处理机制 Spring Boot 默认提供了一套默认的异常处理机制,一旦程序出现了异常,Spring Boot 就会自动识别出客户端的类型(浏览器客户端或机器客户端),并根据客户端的不同,以不同的形式展示异常信息 对于浏览器客户端而言,Spring Boot会响应一个
【SpringBoot】24 核心功能 - Web开发原理 -Spring Boot 异常处理机制
Spring Boot提供了完善的异常处理机制,包括默认错误处理规则和多种定制方式。默认情况下,系统会通过/error路径处理异常,返回JSON或HTML格式的错误信息。开发者可以通过自定义错误页、使用@ControllerAdvice和@ExceptionHandler注解,或实现HandlerExceptionResolver接口来定制异常处理逻辑。其底层通过ErrorMvcAutoConfiguration自动配置组件,采用责任链模式处理异常。这种机制兼顾了开箱即用和高度可定制性,为Web应用开发提供
java web的异常处理
1、异常处理 默认规则 默认情况下,Spring Boot提供/error处理所有错误的映射 对于机器客户端,它将生成JSON响应,其中包含错误,HTTP状态和异常消息的详细信息。对于浏览器客户端,响应一个“ whitelabel”错误视图,以HTML格式呈现相同的数据 要完全替换默认行为,可以实现 ErrorController并注册该类型的Bean定义,或添加ErrorAttributes类型的组件以使用现有机制但替换其内容。 error/下的4xx,5xx页面会被自动解析; 定制错
09SpringBoot web 错误处理
原理 参照ErrorMvcAutoConfiguration,错误处理的自动配置给容器中添加的组件 1.DefaultErrorAttributes 2.BasicErrorController 3.ErrorPageCustomizer 4.DefaultErrorViewResolver 1.定制错误页面 有模板引擎的情况下;error/状态码; 【将错误页面命名为 错误状态码.html 放在...
springboot 之 异常处理机制
文章目录springboot 默认异常处理机制springboot 异常处理机制原理分析定制错误响应定义错误页面定制错误返回的json数据 springboot 默认异常处理机制 当浏览器去访问的时候: 我们看看浏览器的请求头携带的参数: 这里我们使用其他客户端去请求以下(这里使用的是postman): 这里可以看出springboot 对异常响应的数据做了判断,如果是直接在浏览器请求返回页...
spring Boot2 —— 异常处理机制详细源码分析(附源码)
异常处理 文章目录异常处理一、错误处理1、默认规则2、定制错误处理逻辑二、异常处理自动配置原理1、自动配置异常处理规则2、异常处理步骤流程 一、错误处理 1、默认规则 (1)默认情况下,Spring Boot提供/error处理所有错误的映射 (2)对于机器客户端,它将生成JSON响应,其中包含错误,HTTP状态和异常消息的详细信息。对于浏览器客户端,响应一个“ whitelabel”错误视图,以HTML格式呈现相同的数据 (3)要对其进行自定义,添加View解析为error (4)要完全替换默认行为,
09异常处理【源码阅读】
阅读导航。
springboot:错误处理机制
规划和健康
1552



被折叠的 条评论
为什么被折叠?



