目录
🍃前言
前面我们基本实现了图书股管理系统的功能,但是我们依旧存在一个问题。
就是我们不论是否登录,我们直接访问图书列表。也可以进行访问及修改
而我们希望达到的效果是,必须要进行登录后才能进行一系列操作
这里我们使用拦截器来完成着一系列操作
🍀什么是拦截器?
拦截器是Spring框架提供的核⼼功能之⼀,主要⽤来拦截⽤⼾的请求,在指定⽅法前后,根据业务需要执⾏预先设定的代码.
也就是说,允许开发⼈员提前预定义⼀些逻辑,在⽤⼾的请求响应前后执⾏.也可以在⽤⼾请求前阻⽌其执⾏.
在拦截器当中,开发⼈员可以在应⽤程序中做⼀些通⽤性的操作,⽐如通过拦截器来拦截前端发来的请求,判断Session中是否有登录⽤⼾的信息.如果有就可以放⾏,如果没有就进⾏拦截.
就⽐如我们去银⾏办理业务,在办理业务前后,就可以加⼀些拦截操作,办理业务之前,先取号,如果带⾝份证了就取号成功。业务办理结束,给业务办理⼈员的服务进⾏评价.这些就是"拦截器"做的⼯
🌲拦截器的基本使用
拦截器的使⽤步骤分为两步:
- 定义拦截器
- 注册配置拦截器
🚩自定义拦截器
⾃定义拦截器:实现HandlerInterceptor接⼝,并重写其所有⽅法
这里涉及到的三个方法
- preHandle()⽅法:⽬标⽅法执⾏前执⾏. 返回true:继续执⾏后续操作;返回false:中断后续操作.
- postHandle()⽅法:⽬标⽅法执⾏后执⾏
- afterCompletion()⽅法:视图渲染完毕后执⾏,最后执⾏(后端开发现在⼏乎不涉及视图,暂不了解)
🚩注册配置拦截器
注册配置拦截器:实现WebMvcConfigurer接⼝,并重写addInterceptors⽅法
WebMvcConfigurer这个接口并不是只给拦截器使用的,而是WebMVC相关的配置都在这里
启动服务,试试访问任意请求,观察后端⽇志
可以看到preHandle⽅法执⾏之后就放⾏了,开始执⾏⽬标⽅法,⽬标⽅法执⾏完成之后执⾏ postHandle和afterCompletion⽅法.
我们把拦截器中preHandle⽅法的返回值改为false,再观察运⾏结果
运行结果:可以看到,拦截器拦截了请求,没有进⾏响应
🚩拦截路径
关于注册配置拦截器的拦截路劲,拦截路径是指我们定义的这个拦截器,对哪些请求⽣效.我们在注册配置拦截器的时候,通过 addPathPatterns() ⽅法指定要拦截哪些请求.也可以通过
excludePathPatterns() 指定不拦截哪些请求.上述代码中,我们配置的是 /** ,表⽰拦截所有的请求.
在拦截器中除了可以设置 /** 拦截所有资源外,还有⼀些常⻅拦截路径设置,比如在该项目中
🚩拦截器执行流程
学会了拦截器的基本使用,那么拦截器的执行流程是什么样的呢?
我们先来看一下正常的执行流程
当我们有了拦截器以后,我们的执行流程为
- 添加拦截器后,执⾏Controller的⽅法之前,请求会先被拦截器拦截住.执⾏ preHandle() ⽅法,这个⽅法需要返回⼀个布尔类型的值.如果返回true,就表⽰放⾏本次操作,继续访问controller中的⽅法.如果返回false,则不会放⾏(controller中的⽅法也不会执⾏).
- controller当中的⽅法执⾏完毕后,再回过来执⾏ postHandle() 这个⽅法以及afterCompletion() ⽅法,执⾏完毕之后,最终给浏览器响应数据.
🎄项目实现统一拦截
🚩定义拦截器
代码实现如下:
代码解释如下:
- 对服务中所存在的session进行判断,如果存在,则返回true,放行
- 若不存在,则使用setStatus()方法设置http状态码为401,前端收到响应进行跳转到登录页面
当前按照上述配置拦截器的代码来看,会拦截所有的路径,那么此时在没有登录的情况下,访问每个接口都会进行拦截,包括登录接口
所以我们需要把上述配置拦截器中的拦截路径重新配置一下
🚩注册配置拦截器
注意:拦截器也会拦截前端请求
代码:
访问用户登录接口:此时就可以访问了