SpringBoot起飞系列-拦截器和统一错误处理(七)
一、前言
在前边部分我们已经学会了基本的web开发流程,在web开发中,我们通常会对请求做统一处理,比如未登录的用户要拦截掉相关请求,报错页面统一显示等等,这些都需要配置,可以大大简化我们的代码,实现功能的完整性与统一性。
二、拦截器配置
首先我们先做一个登录身份验证拦截器,来拦截那些没有登录的用户,保护我们的资源。下面我们创建一个拦截器,需要实现拦截器接口。
package com.example.demo.component; import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class LoginHandlerInterceptor implements HandlerInterceptor { @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if(request.getSession().getAttribute("loginUser") == null){
request.setAttribute("msg","请先登录");
request.getRequestDispatcher("/index.html").forward(request,response);
return false;
}
return true;
} @Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { }
}
这个拦截器的作用是获取当前session中的loginUser属性,如果有值说明登录了就可以放行,当然我们需要在登录成功的代码里边设置好session的这个属性。
在WebConfig中添加我们的拦截器:
//所有的WebMvcConfigurerAdapter组件都会一起起作用
@Bean //将组件注册在容器
public WebMvcConfigurerAdapter webMvcConfigurerAdapter(){
WebMvcConfigurerAdapter adapter = new WebMvcConfigurerAdapter() {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("login");
registry.addViewController("/index.html").setViewName("login");
} @Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginHandlerInterceptor())
.excludePathPatterns("/index.html","/","/user/login");
}
};
return adapter;
}
第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页面:
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:
package com.example.demo.component; import org.springframework.boot.web.servlet.error.DefaultErrorAttributes;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.WebRequest; import java.util.Map; @Component
public class MyErrorAttributes extends DefaultErrorAttributes {
@Override
public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
Map<String, Object> map = super.getErrorAttributes(webRequest, includeStackTrace);
map.put("code",1);
map.put("msg","自定义错误");
return map;
}
}
访问错误页面和json返回:
四、总结
不得不说,springboot真是很懂我们,把所有东西都配置好了,只要我们稍微修修补补就能很好的满足我们的需求了,这里我们可以完全不要原始的错误信息,可以把错误信息获取数据组装成我们标准统一格式的错误信息,也可以在这里统一记录我们的错误日志,也是非常的方便。
SpringBoot起飞系列-拦截器和统一错误处理(七)的更多相关文章
- SpringBoot起飞系列-国际化(六)
一.前言 国际化这个功能可能我们不常用,但是在有需要的地方还是必须要上的,今天我们就来看一下怎么在我们的web开发中配置国际化,让我们的网站可以根据语言来展示不同的形式.本文接续上一篇SpringBo ...
- Springboot + redis + 注解 + 拦截器来实现接口幂等性校验
Springboot + redis + 注解 + 拦截器来实现接口幂等性校验 1. SpringBoot 整合篇 2. 手写一套迷你版HTTP服务器 3. 记住:永远不要在MySQL中使用UTF ...
- Mybatis利用拦截器做统一分页
mybatis利用拦截器做统一分页 查询传递Page参数,或者传递继承Page的对象参数.拦截器查询记录之后,通过改造查询sql获取总记录数.赋值Page对象,返回. 示例项目:https://git ...
- SpringBoot如何添加拦截器
在web开发的过程中,为了实现登录权限验证,我们往往需要添加一个拦截器在用户的的请求到达controller层的时候实现登录验证,那么SpringBoot如何添加拦截器呢? 步骤如下: 1.继承Web ...
- SpringBoot起飞系列-Web开发(四)
一.前言 从今天你开始我们就开始进行我们的web开发,之前的一篇用SpringBoot起飞系列-使用idea搭建环境(二)已经说明了我们如何进行开发,当然这是搭建起步,接下来我们就开始进行详细的开发, ...
- 在springboot中使用拦截器
在springMVC中可以实现拦截器,是通过实现HandlerInterceptor接口,然后在springmvc-web.xml中配置就可以使用拦截器了.在springboot中拦截器也是一样的思想 ...
- springmvc以及springboot中的拦截器配置
拦截器两种实现 如果不同的controller中都需要拦截器,不能使用相同的拦截器,因为拦截器不能跨controller,这个时候只能为不同的controller配置不同的拦截器,每一个拦截器只能 ...
- SpringBoot入门系列(十一)统一异常处理的实现
前面介绍了Spring Boot 如何整合定时任务已经Spring Boot 如何创建异步任务和定时任务.不清楚的朋友可以看看之前的文章:<Spring Boot 入门系列文章> 接下来主 ...
- SpringBoot之HandlerInterceptor拦截器的使用 ——(一)
HandlerInterceptor简介拦截器我想大家都并不陌生,最常用的登录拦截.或是权限校验.或是防重复提交.或是根据业务像12306去校验购票时间,总之可以去做很多的事情.我仔细想了想这里我分三 ...
随机推荐
- 我爱网络流之最大流Dinic
直接上大佬博客: Dinic算法详解及实现来自小菲进修中 Dinic算法(研究总结,网络流)来自SYCstudio 模板步骤: 第一步,先bfs把图划分成分成分层图网络 第二步,dfs多次找增广路 当 ...
- HMM 隐马尔科夫 Python 代码
import numpy as np # -*- codeing:utf-8 -*- __author__ = 'youfei' # 隐状态 hidden_state = ['sunny', 'rai ...
- Django-自定义web框架
自定义web框架 1.准备登录的html <!DOCTYPE html> <html lang="en"> <head> <meta ch ...
- 部署Hadoop2.0高性能集群
废话不多说直接实战,部署Hadoop高性能集群: 拓扑图: 一.实验前期环境准备: 1.三台主机配置hosts文件:(复制到另外两台主机上) [root@tiandong63 ~]# more /et ...
- springboot+shiro 跨域解决(OPTIONS)
拦截器判断 拦截器截取到请求先进行判断,如果是OPTIONS请求的话,则放行 import com.alibaba.fastjson.JSON; import com.zp.demo.util.Jwt ...
- Java 多线程:什么是线程安全性
线程安全性 什么是线程安全性 <Java Concurrency In Practice>一书的作者 Brian Goetz 是这样描述"线程安全"的:"当多 ...
- Leetcode题目236.二叉树的最近公共祖先(中等)
题目描述: 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的祖先 ...
- 搭建Django项目虚拟环境(Windows系统下)
一.安装virtualenv 我们可以使用正式的Python环境中的pip进行安装.进入cmd界面,运行“ pip install virtualenv ”,完成安装后,可以运行“ where vir ...
- 前端知识点回顾——HTML,CSS篇
前端知识点回顾篇--是我当初刚转行为了面试而将自己学过的前端知识整理成的一份笔记,个人目的性很强,仅供参考. doctype 有什么用 doctype是一种标准通用标记语言的文档类型声明,目的是告诉标 ...
- 自定义 TreeView 第三种状态(C#自定义控件)
本文核心部分采用 http://blog.csdn.net/am2004/article/details/1621349 此网站代码. 在增加了部份事件的同时,将点击图片更改节点选中状态 这一小地方作 ...