00:00
好,接下来呢,我们来说一下WBOO中默认的错误处理机制,那么说起这个错误处理,我们以前再来写c rud的时候出现错误呢,Spring会给我们返回一个默认的页面,比如我来访问一个不存在的地址,诶这一块呢,由于我们做了权限验证,所以说呢,啊,它这提示没登录,我们为了咱们这个方便,期间我们就把这个权限验证的这个拦截器,我们就给它注掉,我们这个有一个config里边这一个intercept,把这个拦截器它注掉,好我来重新启动一下。我们来访问一个不存在的页面的时候呢,STEM boot默认给我们的效果就是来返回一个,哎,我们这个空白页面,这是STEM boot我们的默认效果,这个页面里边呢,有咱们这个错误的状态码404,包括呢错误的类型是note放的,包括错误的提示消息,包括呢还有时间,哎,我们这个时间等等等等。
01:03
来我们把这个默认页面呢,我们来保存一下,比如呢,Boot先给我们的我们这个默认效果,我们来看第一个默认效果。哎,返回一个默认的错误页面。返回一个默认的错误页面页面。好,那么这个图片呢,它在images下。好,我们这个图片,这是我们第一个效果,当然我们访问这个请求的时候,可不只是我们浏览器在访问,有可能呢是其他客户端,比如我们这个安卓手机iOS客户端等等等等,我们其他客户端工具,我们就来模拟一下,我在这呢装了一个软件。叫postman给大家呢,这个课件里边,软件里边也发送了它的安装包,再把这个安装上,我们用它来模拟其他客户端来访问这个请求,那postman呢,来。
02:05
打开。好,我们还是这个请求,当我们来发送,诶我们发现呢,其他客户端的时候,它响应的呢,就是数据说明我们spring boot还是非常智能的,好把这个呢,我再来保存一下,如果是它的这个效果,第二种如果是其他客户端访问,如果是是其他客户端。默认呢,响应一个咱们这个接省数据,这个节省数据呢,我们给大家拿过来。诶,SOBOO端呢,可以智能的识别你是不是浏览器在访问,是不是在客户端访问,而如果浏览器,那就给你返回页面,如果客户端呢,返回杰森数据,那客户端使用杰森也是非常方便的,数据里边呢,有时间戳,状态码,错误信息,提示消息,以及我们访问路径等等等等,当然这是它的这个默认效果,而为什么会产生这个默认效果所有的原理呢?
03:16
我们都可以参照spring boot自动配置,我们来可以看一下在这一块web章节,我们auto confi们来打开它的这个自动配置auto confi。在我们这个web章节呢,有一处自动配置跟错误处理有关,叫什么呢?叫mvcfiration,就是咱们这个类。哎,原理可以参照,哎,I mvc auto,咱们这个错误处理的自动配置。我们,嗯,因为这个呢,没有什么跟我们这个网站的风格他都有点不符,我们希望呢啊,给我们返回一个我们类似网站风格的这个错误页面,这是第一种,第二种呢,如果是客户端来访问,可能呢,我们这这些返回的阶层数据,我们是需要定制的,所以呢,我们主要来看我们是如何定制,如何定制错误啊咱们这个响应。
04:28
那么就牵扯到两个啊,如何定制想错误的页面,如何定制错误的页面,第二个呢啊,如果是其他客户端啊,我们如何定制错误的,咱们这个结算数据。诶,只要把这两个啊写好,我们以后呢就直接能用了,但是呢,我们说这两个之前,我们把这个原理还是解释清楚,我们打开LMVC,跟错误有关的自动配置,这个自动配置呢,首先我们来看它给我们容器中添加了哪些组件,第一个呢,叫default error attributes。
05:08
它给容器中添加的规则就是叫conditional啊Miss,就是说容器中没有这个类型的组件的时候会来填它,包括下边呢都一样,至于它们是什么作用,我们暂时先不管,我先把它复制过来,那一会儿再来解释作用,然后呢,它们给容器中添加了。以下组件。第一个。叫。Default error attributes,然后呢,我们来看第二个。第二个呢,叫base controller。哎,还有呢,第三个。第三个呢,叫a page customer啊,我们这个错误的定制页面,然后呢,我们在最重要的呢,我们再来看一下第四个啊,我们把这几个重要的配置,这还有一个con,它呢给容器中还添加了一个叫default error reserve,我呢就把这几个重要的组件来放在这,那么这几个组件合起来到底产生了什么样的化学反应呢?来给大家解释一下。
06:16
首先啊,我们来说一下它的步骤。首先一旦我们发生错误,一旦系统出现咱们这个四叉叉,或者咱们这五百五叉叉等等之类的错误之类的错误呢,我们这个a page customer哎,它呢,会是就会生效啊,它是怎么生效呢?它是来定它来定制咱们这个错误的响应。规则。什么叫定制的错误的响应规则呢?哎,我们来点进来看一下,这有一个叫error page custom好,他用了一个,他这里边呢,主要是来注册错误页面的响应规则的,这有一个错误页面,我呢,我们发生错误以后去,哎去哪里去哪个路径,比如呢,我在这来看一下,主要有一个get pass点过来,这个pass呢就叫杠error,这个杠error呢,就是从配置文件中取出error pass啊得值的,所以它的这个作用呢,我就来简单来说一下,它呢就是系统出现错误。
07:29
啊,主要呢,就是这一段配置系统出现错误以后。出现出现错误以后,来到A请求,来到error。请求进行处理。这个呢,就是类似于我们在web插面中,我们以前学的时候定制错误页面,哎,比如发生什么错误啊,比如我们定义咱们这个。
08:01
异常的类型要去哪个页面,包括呢,我们定义咱们这个状态码要去哪个页面,就相当于是我们在那个插中注册的这些啊,类似于它。注册的咱们这个错误页面页面规则,哎,这是第一个,它呢起作用,那它起作用呢,一旦发生错误,相当于就会来到来到哪呢,来到杠error请求,那么就得有人处理这个请求啊,那接下来呢,他又起作用了,叫base error controller,哎,我们一听就叫啊基本的咱们这个错误处理器,我们来看一下这个base error controller,在我们这个自动配置的上边,这个best error ctrl呢,也是容器中没有这个病的时候才配点进来,你看啊,它就是一个ctrler,它来处理我们这个配置文件中,诶我们取出solid select port pass,它处理的路径是取出这个配置的值,冒号呢,就是如果取不出这个值用我们这个配置,而冒号呢,也就说如果我们也没配它,那就用杠L,所以呢,它其实就是来处理我们杠L请求的。
09:13
他是呢,哎,我来给大家记录在这。处理默认的处理默认啊杠A请求,那么相当于呢,我们一旦系统发生错误,就会来到杠error请求就会被被谁处理呢?被我们这个被error controller处理。啊。它是怎么处理的呢?我们再来看一下,在这个best error controller里边啊,有一个非常重要的写法,诶,它这叫。Model and view request map,哎,他来处理这个请求了,只不过呢,它这写了两种请求的处理方式,哎,我们CTRLC我来复制过来。
10:03
这两种,这两种呢,Request,也就说我们处理的请求径都是一样,都是杠L,而我们这一块叫produce htm,它的作用呢,就是说我们将会产生产生T类型的数据,而这一块呢,它就是我们来产生数据。产生,我们叫产生。节省数据的。那么这就是我们看到的效果,为什么说浏览器访问得到的是HTML页面,而其他客户端得到的是JS,为什么呢?就在这都是处理杠error请求,但是呢,这有两个方法,这个呢是返回HTML页面,哎,返回端U啊,这个呢是来返回结算数据,那么为什么它能区分哪个是浏览器,哪个是客户端呢?我们其实来看一下就行了。
11:03
如果我F12打开浏览器。AAA,那浏览器发请求,我们来到我们看发送AU请求四零主要呢,我们来看浏览器发请求的时候呢,有一个请求头request head这一块呢,标志了有一个叫accept,它优先来接收HTML数据的。这就是浏览器发请求,哎主要呢在这儿,我们呢,把咱们这个引入进来。啊,我们来说一下浏览器发送请求,浏览器发送请求的请求头,它呢就是通过这个请求头识别的浏览器发送请求的请求头,请求头里边呢,主要呢,有咱们这个啊images。下边的他,哎,比如说有我们这个,而如果是其他客户端,哎,其他客户端我们模拟其他客户端,我还是打开我们的这个po门。
12:02
那看他发请求的时候做了什么呢?他给我们来发这个请求的时候呢,我们把这个请求复制过来,复制过来好,我们来发送,发送的时候呢,我们来打开控制台这一块无用,有一个叫postman的控制台,在控制台上我们能看到请求的详细信息,我点一个send,我们看到响应的接送数据,而控制台上当前请求我来展开,我们看到请求头里边accept字段。诶,他呢叫杠芯,他没有说他要接优先来接收HTML数据,所以呢,这就区别在这儿,哎。我们来把这一块复制过来。好。Images下边的它,那这样的话呢,相当于是浏览器发送的请求,浏览器发送的请求来到这个方法处理。
13:01
处理哎,其他客户端,其他客户端来到这个方法处理。好,那就是呢,当我们系统出现错误以后啊,我们会转到error请求,A请求呢,我们这个base error controller处理。如果呢他来处理,那就会有两种方式,一种呢是响应页面,一种是响应结算数据,那我们先来讨论它响应页面。他怎么来到这个页面的呢?我们来可以看一下响应页面呢,我们来到这个方法里边,诶他在这呢,拿到我们这个,呃,什么状态码当中出错的一些状态码,包括拿到一些model数据,诶注意呢,返回一个model and无model and view就是我们要去的页面地址,然而这个model and5u是怎么得出来的,它掉了一个叫ERROR5U方法,我点进来也就说呢,要去哪个页面,哎,我们在这注意一下就是这个方法。
14:03
来去哪个页面作为错误页面,哎,它是在这得到了model and u model and5u里边呢,包含页面地址和咱们这个页面内容啊,Model里面的一些数据,而它的这个解析呢,是通过这段代码我来复制的。复制过来。哎,响应页面,响应页面的这段解析代码。我们来可以看一下啊,这段解析代码,这段解析代码呢,这个张,我们把这写一个张va,它呢主要掉了一个东西叫ERROR5U reserver叫异常视图的解析器,它是拿到所有异常视图的解析器,得到model and view u,如果得到了就返回,如果得不到就回呢。哎,它的这一块处理呢,就是所有的咱们这个error得到。
15:05
得到咱们这个model and view,而I view reserve又是谁呢?我们来看一下I view reserve其实就是我们这个有一个叫他填的这个组件叫default error u server就会被它处理来响应页面啊。去哪个页面,去哪个页面是由咱们这个T。是由at error解析得到的。而它又是怎么解析呢?哎,我们来看一下对我们注册的这个default error view。我们点进来这有一个叫default error view reserve点进来它怎么解析呢?它给这个map里边放了一些客户端错误用四叉叉表示啊,服务端错误用五叉叉表示,它怎么得到model and5u的,我们看下边的图,诶它在这呢解析解析呢,它是将我们这个视图名,诶视图名呢拼在error后边,Error后边,而这个视图名是什么?
16:13
其实呢,我们看到在上边调用这个resource方法的时候,这个视图名呢,它传入的是这个series view里边,哎,它叫series,这呢就是我们这个状态嘛,也就说这一块呢,虽然很绕,但是呢,我把。这一块的主要内容我来复制来,我们来总结出我们一句话就行了。好,我们把这段加va代码呢,我们来粘在这儿,也就是说呢,默认啊,我们把这一块,哎这句话的意思呢,就是默认spring boot可以去找到,找到某个页面,找到一个页面,找到什么页面呢?是来找到咱们这个error。
17:01
Error。Error error下的我们这个状态码,比如我们是404,诶这个视图名呢,就叫ERROR404来找这个页面,而且呢,它这一块大家注意下边的这一块判断呢,还是模板引擎,诶一看这个他里的呃呃,完了贝也就说呢,如果模板引擎能起作用,模板引擎可以解析这个页面地址。就用咱们这个模板引擎解析,如果不行你看啊,模板引擎解析呢,就会返回,哎这块return一个model and view,我们把引擎可用的情况下。情况下来返回到艾若五右视图。指定的视图地址。视图地址,而如果模板引擎不可用,它就是调这个方法,模板引擎不可用。
18:02
不可用,它呢调哪个方法呢,叫resources resources,我点进来大家看一下,它呢,又是找这个u name,这VO u name呢,还是error下的什么什么,哎,就是把这个传进去了,它是在哪找呢?你看啊,它是在static locations里边,要说找咱们这个静态资源文件夹下,哎相当于呢,它可以。我们在这记录一下,那引擎不可用,就在静态资源文件夹下。这下找找咱们这个error对应的页面。就是呢,相当于他去找error,若四零四点HTMMR相当于是他来找,他来给这儿批注一下。同呢,你可以放在静态资源文件夹下。第2HTM2。哎,这是这个包括呢,我们来看它的这个写法呢,哎,更好,如果说这个静态资源文件夹里边存在有这个东西,当然就用,如果没有呢,那也是返回为空,也就是说静态资源文件夹里边没有就是返回为空,那按照这个道理,我们呢,只总结出我们能用的如何定制错误页面,非常简单,我们有模板引擎的情况下。
19:27
有。有模板引擎情况下,我们直接呢,可以给咱们这个模板引擎下,哎,因为它是找A下的状态码。哎,他的这个视图地址呢,是艾下的状态码。装。太,所以说呢,我就来给艾下,我们专门来给我们这一块。哎,我们模板引擎都在他里之下,我来创建一个文件夹。
20:00
我们就叫error,这是它的这个视图地址,Error下呢,我来写一个404,哎,我把之前我们的404页面我放在这儿,放进来以后呢,我们来重启一下我们的服务器,看一下现在能不能出现我们自己定制的404页面。好,我点一个回车,诶,我们发现这个404页面是我们自己定制的,这就是呢,我们总结的第一个情况,我们在模板引擎的情况下,我们将啊相当于我们总结能用到这句话,就是将错误页面,错误页面命名为命名为咱们这个错误状态码点HTML,然后呢,放在什么项呢?放在A文件夹下。来放在模板引擎文件夹,模板引擎文件夹里边的咱们这个error文件夹下,然后呢,发生此发生发生此状态码的错误。
21:09
状态码的错误就会,哎,来到来到咱们这个啊,对应的页面,当然还有咱们这个第二个规则,因为我们这个四状态码有404有400等等状态码非常多,如果我们每一个状态码都这么来写,那也太麻烦了,那我们怎么做呢?我们可以看一下这个默认的。错误页面解析器,这个错误页面解析器呢,它里边还放了一个叫四叉叉,五叉叉,也就是说呢,我们所有以四开头的错误,其实呢,我们都可以用一个页面,好我CTRLC我来复制过来,我们呢就叫4XX。这样呢,所有以四开头的错误,只要没有匹配这个状态码,我们就来到这个页面,好,我们把这个页面呢,我们给它的这个提示,我们就不叫404了,我们把下边改一下。
22:05
改一下在这个主页面,好,这个我们就叫4XS,好,我们来重新来尝试一下,是不是能来到这个页面呢。首先如果是404有精确匹配的情况下,我们下边有这个精确的404页面,那么呢,当然是来到我们404,而如果没有,比如呢,我们来登录进来,来模拟一个400的错误。123456来我们来员工,员工添加,比如呢,我输了一个错误的数据,那这就是400错误,我添加哎,他就会来到四叉叉页面,所以呢,我们接下来还有第二种情况,就是我们可以使使用4XX。和5XX作为咱们这个错误页面的文件名来匹配这种类型的所有错误,当然它的原则就是啊,咱们这个精确有限,如果说人家有精确的这个错误状态码页面啊,那么我们就不用找这些四叉叉了,比如说呢啊。
23:15
优先寻找。精确的咱们这个状态码点页面。HTML,而如果说没有的话,才能这么用,当当然五叉叉的原理是一样的,包括呢,我们有模板引擎的情况下,如果说我们在页面,我们真正的要取出状态码等等这些信息,比如说页面能获取的内容。获取的信息都有哪些呢?哎,其实我们直接可以看一下它是如何解析的就行。我们打开咱们这个默认的咱们这个错误处理器,当我们要响应页面的时候,会返回model and无U,而视图名解析就是我们刚才说的这个逻辑,主要呢,里边能用的这个模型数据model model是怎么来的呢?它是掉了get error attributes这个方法来点进来这个get error attributes呢是就是来调用error attribute的get error attribute,而且error attribute。
24:17
我们来点进来,它是一个接口,而它的实现呢,就叫det error attributes,那么它的作用,诶,我们来可以看到注册了四个组件,还有最终的第一个组件,它呢就是帮我们来,它的作用就是帮我们,帮我们在页面共享信息,这只是它的一处作用。因为呢,我们这个model的值是调用它里边的get error attribute方法的,诶而这个方法的写法就在这儿,诶在这我们看到呢,他给页面相当于放呢这几个属性,只要能获取到属性,我都呢在这儿记录一下能获取的信息,他们step,这就是时间戳,哎,那这个时间戳。
25:06
这是第一个他能获取到信息来,我们把所有能获取的都列举出来,我们从这来获取一下,这有他们step时间戳,包括呢,你看还调了这个方法叫and stas添加状态码,那这个状态码呢,那就在这sta,这是它真正的状态码,那我们都能获取,包括呢,我们再来看到其他的,包括我们这个error错误的啊提示。Error错误提示。好。包括呢,我们在这一块再来往下翻,诶这一块我们看到的都能拿到exception,那就是我们这个异常,如果是由于某个异常来到错误页面,那这就是异常的下,哎,包括咱们这个异常,包括呢我们再来看。还有什么呢?当然还有这个异常的异常消息。
26:01
异常消息还有什么呢?我们来看啊,页面呢还能取出叫arows,而这个as呢,它是跟这个result帮丁,Result就是说是跟我们GSR303数据校验有关的,那呢GSR。303数据校验的错误啊,都在这这里,那呢能取出这些信息,那我们就在页面呢,我们就来获取它真正的内容,我们就不写这些四叉叉什么东西了,好,我们就来写上几个,第一个status啊,我们就来写一个状态码,怎么获取呢?哎,我们就直接用行内表达式do符大括号,哎,人家共享了一个变量。叫stas,那剩下的呢,我们都来取出来,那剩下呢,我们就来用HR,哎,我们来取出几个代表一下,那剩下的呢,大家就来自己来取,还有呢,能取出一个时间戳啊,我们就来拿这个吧。
27:01
时间错中科二。好,我们到福大括号,我们用行内写法,我们来取时间戳,好这是这样子的,包括404页面也一样,把404页面啊,我们这个错误信息的获取,我们放在这CTRLF9,包括呢,我们四叉叉页面一样,CTRLF9我们重新刷新了以后呢,我们来尝试一下。刷新。诶,错误状态码呢,400时间戳有,但是当我们哎来一个404,诶错误状态码404时间戳也有,这就是哎,我们来定制错误页面获取咱们这个信息的,当然这个错误页面呢,我们是在有模板引擎的情况下,那么剩下两个情况呢,大家就可以来哎了解一下,那么接下来就是没有模板引擎,比如说如果我们没有用模板引擎,我们没有用SIM life,它默认呢也是在静态资源文件。
28:02
加下有说呢。模板引擎没有模板引擎的意思就是模板引擎找不到这个错误页面,哎,什么艾若下的这些状态嘛,比如呢,我来搬一个家,我整个艾呢,我放在静态资源文件夹下,这样呢,模板引擎下就没有这个东西了。我们来,我们不用这个。我们来拉过来拉过来,我们这个就来,直接来移移过去就行了。好移过去,然后呢,我们来重启一下服务器。往下看模板引擎下呢?没有这个error页面,而我们现在都放在了静态资源文件夹上。好。我来访问一个错误的,哎,这样呢,也是来到这个页面了,包括呢,我们来进行什么都行,只不过我们在静态资源文件夹没有模板引擎,那这些动态就不能获取了,所以说呢,这个就了解一下啊,那也可以放在静态资源文件夹下。
29:08
这是咱们第二种,第三种情况就是呢,模板引擎跟静态资源文件夹下都没有,我们以前就是这样,我们从未写过error的时候,那就是我们以前的情况。都没有呢,那就是默认。以上都没有,以上都没有错误里面就是默认,默认来到哪呢?来到我们这个spring的默认的空白页面啊,咱们这个错误提示页面。当然第三种规则的这个逻辑,我们也完全可以在我们这个base error controller里边找到,然后说呢,它在这解析异常视图,如果按照我们之前的逻辑,拿这些什么异常视图解析器来找L下的状态码页面,找不到的情况下呢,就返回now,而返回now呢,它就默认要返回到一个AR视图,而A视图是不是什么呢?就在mvc auto configuration里边,它的这一块配置里边呢,在容器中有一个视图对象,它就叫error,而这个error呢,就是这个default error5u,诶,就是我们这段页面代码,什么write啊,什么error page,就是我们看到的有这些状态码等等,这是用SP表达式解析出来的一个页面。
30:28
好,我们呢,这就说完了,咱们这个spring boot默认的咱们这个错误处理里边怎么定制错误页面,原理呢,听起来很复杂,但是呢,大家把下边这个啊用好,特别呢,把第一个啊用会就行了,那么剩下两个呢啊作为一个了解,那么接下来下一节课呢,我们就来说如何定制错误的杰森数据。
我来说两句