SpringBoot起飞系列-拦截器和统一错误处理(七)

摘要:
在没有模板的情况下,会去找静态资源下的相关页面,如果静态资源下也没有,就用springboot默认的错误页面。
一、前言

在前边部分我们已经学会了基本的web开发流程,在web开发中,我们通常会对请求做统一处理,比如未登录的用户要拦截掉相关请求,报错页面统一显示等等,这些都需要配置,可以大大简化我们的代码,实现功能的完整性与统一性。

二、拦截器配置

首先我们先做一个登录身份验证拦截器,来拦截那些没有登录的用户,保护我们的资源。下面我们创建一个拦截器,需要实现拦截器接口。

1 packagecom.example.demo.component;
2 
3 importorg.springframework.web.servlet.HandlerInterceptor;
4 importorg.springframework.web.servlet.ModelAndView;
5 
6 importjavax.servlet.http.HttpServletRequest;
7 importjavax.servlet.http.HttpServletResponse;
8 
9 public class LoginHandlerInterceptor implementsHandlerInterceptor {
10 
11 @Override
12     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throwsException {
13         if(request.getSession().getAttribute("loginUser") == null){
14             request.setAttribute("msg","请先登录");
15             request.getRequestDispatcher("/index.html").forward(request,response);
16             return false;
17 }
18         return true;
19 }
20 
21 @Override
22     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throwsException {
23 
24 }
25 
26 @Override
27     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throwsException {
28 
29 }
30 }

这个拦截器的作用是获取当前session中的loginUser属性,如果有值说明登录了就可以放行,当然我们需要在登录成功的代码里边设置好session的这个属性。

在WebConfig中添加我们的拦截器:

1     //所有的WebMvcConfigurerAdapter组件都会一起起作用
2     @Bean //将组件注册在容器
3     publicWebMvcConfigurerAdapter webMvcConfigurerAdapter(){
4         WebMvcConfigurerAdapter adapter = newWebMvcConfigurerAdapter() {
5 @Override
6             public voidaddViewControllers(ViewControllerRegistry registry) {
7                 registry.addViewController("/").setViewName("login");
8                 registry.addViewController("/index.html").setViewName("login");
9 }
10 
11 @Override
12             public voidaddInterceptors(InterceptorRegistry registry) {
13                 registry.addInterceptor(newLoginHandlerInterceptor())
14                         .excludePathPatterns("/index.html","/","/user/login");
15 }
16 };
17         returnadapter;
18     }

第12-15行,注册我们拦截器之后,排除掉不需要验证的页面,默认情况下静态资源不会做验证。

三、统一错误处理

springboot默认已经配置了统一错误处理,只不过错误页面是内置的,可能不是我们想要的,所以如果我们要自定义错误页面,还得重新配置。

3.1 定制错误页面

在使用模板的情况下,springboot默认会找到/templates/error/xxx.html页面作为错误页面显示,比如我们用4xx.html处理所有httpstatuscode以4开头的错误,比如401,403,404,如果有具体的数字,就先用具体的数字对应页面,如果没有就用有前缀开头的页面。

显示错误页面时,页面上能获取到以下信息,可以让我们看到详细的错误信息:

timestamp:时间戳。

status:状态码。

error:错误提示。

exception:异常对象。

message:异常消息。

errors:JSR303数据校验的错误都在这里。

在没有模板的情况下,会去找静态资源下的相关页面,如果静态资源下也没有,就用springboot默认的错误页面。如下,我添加了一个4xx.html的错误处理页面,当我访问一个不存在的路径(404错误)时,就会显示我添加的4xx.html页面:

SpringBoot起飞系列-拦截器和统一错误处理(七)第1张

SpringBoot起飞系列-拦截器和统一错误处理(七)第2张

3.2 自定义返回的json数据

默认情况下springboot会出现自适应的错误显示,当用浏览器访问(接受类型为text/html)时会显示错误页面,当用postman(接受类型为application/json)会显示错误json数据。不过显示的字段都是内置固定的,如果我们想要添加自己的错误数据,就要自己定制了。

在springboot中,出现错误以后,会来到/error请求,会被BasicErrorController处理,响应出去可以获取的数据是由getErrorAttributes得到的(是AbstractErrorController(ErrorController)规定的方法),这里我们就可以编写一个ErrorController的实现类【或者是编写AbstractErrorController的子类】,放在容器中替换掉原来的ErrorController,页面上能用的数据,或者是json返回能用的数据都是通过errorAttributes.getErrorAttributes得到。

添加自定一个ErrorAttribute,重写errorAttributes.getErrorAttributes,返回自己的数据map:

1 packagecom.example.demo.component;
2 
3 importorg.springframework.boot.web.servlet.error.DefaultErrorAttributes;
4 importorg.springframework.stereotype.Component;
5 importorg.springframework.web.context.request.WebRequest;
6 
7 importjava.util.Map;
8 
9 @Component
10 public class MyErrorAttributes extendsDefaultErrorAttributes {
11 @Override
12     public Map<String, Object> getErrorAttributes(WebRequest webRequest, booleanincludeStackTrace) {
13         Map<String, Object> map =  super.getErrorAttributes(webRequest, includeStackTrace);
14         map.put("code",1);
15         map.put("msg","自定义错误");
16         returnmap;
17 }
18 }

访问错误页面和json返回:

SpringBoot起飞系列-拦截器和统一错误处理(七)第3张

SpringBoot起飞系列-拦截器和统一错误处理(七)第4张

四、总结

不得不说,springboot真是很懂我们,把所有东西都配置好了,只要我们稍微修修补补就能很好的满足我们的需求了,这里我们可以完全不要原始的错误信息,可以把错误信息获取数据组装成我们标准统一格式的错误信息,也可以在这里统一记录我们的错误日志,也是非常的方便。

免责声明:文章转载自《SpringBoot起飞系列-拦截器和统一错误处理(七)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android动画学习笔记-Android Animation文本摘要下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

小程序真机上报错 for developer: some selectors are not allowed in component wxss , including tag name selectors, id selectors, and attribute selectors

在引用组件的组件和页面中使用后代选择器在某些极端情况下会产生意想不到的性能。如果是,请避免使用它们。子元素选择器只能在视图组件及其子节点之间使用,其他组件可能会导致意外情况。继承的样式(如字体和颜色)将从组件外部继承到组件内部。除了继承样式之外,app.wxss中的样式和组件所在页面的样式对于自定义组件无效。...

将txt、csv等文本文件导入Hive

将txt、csv等文本文件导入Hive目录将txt、csv等文本文件导入Hive00.数据在虚拟机外01.启动hadoop、hdfs02.将文件放置在hdfs目录下03.登录hive并进入指定数据库04.根据文件创建表05.执行导入语句00.数据在虚拟机外如果数据在虚拟机内,请跳过此步,直接执行接下来的操作。...

C#探秘系列(十)WPF:打开文件选择器选择文件并保存

//此为点击按钮的监听事件,点击按钮弹出文件选择器privatevoidimageButton_Click(objectsender,RoutedEventArgse){vardialog=newOpenFileDialog();dialog.Filter=".jpg|*.jpg|.png|*.png|.jpeg|*.jpeg";if(dialog.Show...

华为交换机堆叠配置

请参考华为交换机的配置堆栈。[Leaf1-stack-port0/1]portinterfaceg0/0/12启用物理接口12加入堆栈组[Leaf1]stackslot0priority255修改优先级255,默认值为100警告:不要频繁修改优先级,因为它会使堆栈分裂。持续...

说说接口封装

今天,我为同事封装了一个接口。当谈到接口封装时,有很多关于它的讨论。在很多情况下,说一个服务好,一个服务坏,实际上是在吐槽服务团队之外暴露的界面质量。无论哪种语言,抽象的封装接口都由一个函数名、几个参数和几个返回值组成。总之,参数不应该被封装……我们在内部尝试接口_Catch不会抛出异常,所有信息都将以错误代码的形式返回。就php而言,建议进行异常处理。...

IDEA的设置打不开,点了没反应解决办法

把它去掉用回英文d就可以了。...