利来w66-利来w66app

官网首页 > 信息资讯 > 网建知识 >
最新案例
点击这里给我发消息
建站咨询热线:
网建知识

让错误处理重新由web服务器接管

来源:   日期:2019-12-27 14:11
其实web服务器是会处理过错的在web.xml仍是随处可见的年代时,下面的这些装备应该都不生疏。依据过错代码处理过错,如下图01:依据反常类型处理过错,如下图0......


其实web服务器是会处理过错的


在web.xml仍是随处可见的年代时,下面的这些装备应该都不生疏。

依据过错代码处理过错,如下图01:










依据反常类型处理过错,如下图02:





不过咱们愈加了解的应该是springmvc的一致反常处理。如下图03:





看到@controlleradvice注解和@exceptionhandler注解都应该很了解吧。

处理原理便是在捕获到业务controller有反常抛出时,依据反常类型来这儿找到对应的办法并履行。

可见,整个反常的处理进程都是在springmvc内部给搞定了,底子就没有涉及到web服务器,如tomcat。

那么问题来了,分明web服务器能够处理反常,为啥springmvc还要自己处理呢?


是不想呢,仍是还有苦衷


读过本系列上一篇文章的小伙伴应该能猜出来一些。由于springmvc开发的工程终究打成war包,然后扔到tomcat下面即可。

并且springmvc和tomcat之间是通过java web的标准联系起来的,它们之间底子没有办法自在交互的。

但是tomcat的过错处理需求在web.xml里边装备。严格来说,web.xml其实和springmvc联系不大。

特别是spring全面进入java和注解装备年代今后,web.xml逐步被弱化,继而变得可有可无,直到终究完全消失。

所以springmvc可能不期望自己的用户到一个和自己联系不大的web.xml里边装备一些和业务相关的反常处理映射。

所以只好自己把反常处理消化掉。不劳tomcat大驾。因而才有了springmvc一致处理反常。


从头让web服务器来处理过错


当前史来到了springboot的年代,springboot翻身做主成了进口,web服务器居然成了一个组件。

springboot能够操作web服务器的api,通过编程的办法,对web服务器进行深度装备。

所以许多作业都变得简略起来,比方过错处理。

由于web.xml里的过错处理映射终究是注册到tomcat里边了,所以springboot只需操作tomcat的api,运用编程的办法也来注册一些过错处理映射不就能够了嘛。

由于用户直接是和springboot打交道的,所以springboot需求笼统出一套过错处理注册机制,让用户来注册。

这样springboot拿到用户注册的过错处理映射信息后,在生成web服务器时,把这些映射信息增加到web服务器中即可。


springboot注册过错处理映射的计划


先来看看过错处理映射是怎么描绘的,如下图04:

















































三个字段的意义是:

path是一个途径,它表明的是过错处理的url。

status是一个状况码,如404、500等。

exception是一个反常类型,如loginfailedexception。

一共有三种运用办法:

1)status + path,如404 + /404,表明假如遇到了404,就去履行/404这个url。

2)exception + path,如loginfailedexception + /loginfailed,表明假如遇到登陆失利反常,就去履行后边这个url

3)没有status和exception,只要path,这相当于通配符,匹配一切反常情况。

接下来就该考虑怎么注册了,按例给个接口就行了,如下图0506:





















spring是以bean打天下的,所以springboot给的办法当然也是和bean相关。

只需向容器中注册一个该接口类型的bean即可,如下图07:







这些信息会被收集到并存好,如下图08:





然后在创立web服务器时增加进去就行了,以tomcat为例,如下图09:





能够看到终究转换为tomcat的过错映射,如下图10:





这儿的setlocation、seterrorcode、setexceptiontype三个setter办法,就对应于web.xml里的 location 、 error-code 、 exception-type 这三个标签。

至此,过错处理现已被注册好了。


springboot仍需帮忙处理过错


有一点需求理解,springmvc交给tomcat的仅仅过错处理映射的匹配作业,但有些真实的过错处理仍是要自己做的。

所以整个进程是这样的,springmvc随意抛出反常,这个反常会被抛到tomcat里边,tomcat获取反常类型并依据注册的过错处理映射联系找到一个url,然后调用这个url。

那么请问这个url指向哪里呢?很大概率又回到了springmvc里边了,是不是很有意思,哈哈。

tomcat就像一面镜子,springmvc向它发射了一束光线,通过反射后又回来了。只不过发射的是一个反常,回来的是一个url。

这个url对应的是能够处理这个过错的一个controller的办法。这样履行这个controller办法就等于处理了反常。

这个controller是一个能够处理过错的controller,所以就叫errorcontroller。如下图11:























其实它主要是一个marker接口,也就起一个标志效果。

下面是真实用于处理过错的controller,完结了刚刚的标志接口,如下图12:







@requestmapping办法便是处理过错的,既能够回来json,也能够回来视图页面。

咱们能够自己写一个过错处理类,然后承继这个类,增加自己的过错处理办法,终究运用@controller注解从头注册即可。

能够把一个反常映射成和它称号相同的url途径,如把exception映射为/exception,如下图13:









这两个办法,一个回来html页面,一个回来一个json。

补白:反常类型和它映射的url之间的联系,能够按自己的需求去规划,一致规矩即可。

处理过错时,天然要取得过错相关信息才行,这个接口能够满意,如下图14:









能够取得过错特点和抛出的反常目标。

能够看到接口的两个办法都有webrequest这个参数,阐明过错信息是从request中获取出来的。

一起也阐明有些过错信息是有人专门放入request中的,是springboot放的,仍是web服务器放的?

其实都有,比方反常目标是springboot放的,呼应状况码是web服务器放的。

这也阐明web服务器履行过错处理的url时用的是转发而非重定向,由于要保存request中的信息。

还剩终究一个,过错视图解析器,如下图15:















springboot自己供给了默许的视图解析器完结,默许去classpath下面的error目录下寻觅.html视图页面。

如下图16:







支撑状况码到页面的映射,如404默许映射为/error/404.html,500默许映射为/error/500.html。

假如没有这么具体的页面,还支撑系列映射,如404映射为/error/4xx.html,500映射为5xx.html。

当然,默许的一般都无法满意需求,咱们能够承继这个默许的类,然后重写视图解析办法。

终究把这个类注册为bean即可,这样springboot就会运用咱们的类了。如下图17:












本文总结,重要


1)用户运用springboot供给的过错处理映射机制注册状况码和反常的映射url信息。

2)这些映射信息终究会被注册进web服务器中,如tomcat。

3)springboot把反常抛给web服务器,web服务器依据反常找到对应的url,并履行它。

4)流程再次回到springboot中,进入过错处理controller的办法中,履行过错处理办法。

5)假如需求解析视图的,运用过错视图解析器进行视图解析。不然便是直接回来json。

其间用户能参加的就三步,注册反常映射,扩展过错处理controller,扩展过错视图解析器。

具体参加办法文章中都有,无非便是完结接口或承继某个类,然后注册为bean即可。


















 

玩转springboot系列文章

 

装备文件yml的正确翻开姿态

用好条件相重视解,敞开主动装备之门

给主动装备来个全体大揭秘

看似杂乱的environment其实很简略

翻身做主人,一统web服务器

 

品spring系列文章

 

品spring:帝国的柱石

品spring:bean界说上梁山

品spring:完结bean界说时选用的 先进生产力

品spring:注解总算 成功上位

品spring:能工巧匠们对注解的 加持

品spring:springboot和spring究竟有没有实质的不同?

品spring:担任bean界说注册的两个 排头兵

品spring:springboot轻松制胜bean界说注册的 第一阶段

品spring:springboot建议bean界说注册的 二次攻坚战

品spring:注解之王@configuration和它的一众 小弟们

品spring:bean工厂后处理器的调用规矩

品spring:具体说明bean后处理器

品spring:对@postconstruct和@predestroy注解的处理办法

品spring:对@resource注解的处理办法

品spring:对@autowired和@value注解的处理办法

品spring:真没想到,三十步才干完结一个bean实例的创立

品spring:关于@scheduled守时使命的考虑与探究,成果为难了

 

抢手文章集锦

 

结业10年,我有话说

我是怎么面试他人list相关常识的,深度有点长文

我是怎么在结业不久只用1年就升为开发组长的

爸爸又给spring mvc生了个弟弟叫spring webflux

我是怎么在面试他人spring业务时 套路 对方的

spring业务面试考点吐血收拾

我是怎么在面试他人redis相关常识时 软怼 他的

吃透了这些redis常识点,面试官必定觉得你很nb

假如你这样答复 什么是线程安全 ,面试官都会对你刮目相看

迄今为止把同步/异步/堵塞/非堵塞/bio/nio/aio讲的这么清楚的好文章

一篇文章帮你完全搞清楚 i/o多路复用 和 异步i/o 的宿世此生

假如把线程当作一个人来对待,一切问题都瞬间理解了

java多线程通关 基础常识应战

品spring:帝国的柱石

 

作者是作业超越10年的码农,现在任架构师。喜爱研讨技能,崇尚简略高兴。寻求以通俗易懂的言语说明技能,期望一切的读者都能看懂并记住。下面是大众号的二维码,欢迎重视!