拦截器
实现强制登录的功能, 后端程序根据Session来判断⽤⼾是否登录, 但是实现⽅法是⽐较⿇烦的
需要修改每个接⼝的处理逻辑
需要修改每个接⼝的返回结果
接⼝定义修改, 前端代码也需要跟着修改
有没有更简单的办法, 统⼀拦截所有的请求, 并进⾏Session校验呢, 这⾥我们学习⼀种新的解决办法: 拦截器
拦截器快速入门
什么是拦截器?
拦截器是Spring框架提供的核⼼功能之⼀, 主要⽤来拦截⽤⼾的请求, 在指定⽅法前后, 根据业务需要执行预先设定的代码.
也就是说, 允许开发⼈员提前预定义⼀些逻辑, 在⽤⼾的请求响应前后执⾏. 也可以在⽤⼾请求前阻⽌其执⾏.
在拦截器当中,开发⼈员可以在应⽤程序中做⼀些通⽤性的操作, ⽐如通过拦截器来拦截前端发来的请求, 判断Session中是否有登录⽤⼾的信息. 如果有就可以放⾏, 如果没有就进⾏拦截.
⽐如我们去银⾏办理业务, 在办理业务前后, 就可以加⼀些拦截操作
办理业务之前, 先取号, 如果带⾝份证了就取号成功
业务办理结束, 给业务办理⼈员的服务进⾏评价.
这些就是"拦截器"做的⼯作.
拦截一般是在目标执行方法之前进行拦截,判断是否满足条件,返回true表示不拦截,返回false代表拦截。
而视图渲染部分现在基本已经不用了,不需要关注。
之前只是设置了拦截的条件和处理方法,实现WebMvcConfigurer接口的addInterceptors时定义要拦截哪些请求,并且调用之前定义的拦截方法。
需要注意的是,这个定义拦截请求需要将这个类交给spring保管,不然是不起效的。
拦截器详解
拦截路径
拦截器执⾏流程



登录校验
了解拦截器的基本操作之后,接下来需要完成最后⼀步操作:通过拦截器来完成图书管理系统中的登录校验功能
定义拦截器
从session中获取⽤⼾信息, 如果session中不存在, 则返回false,并设置http状态码为401, 否则返回true

这里检查了用户的cookie是否携带了需要的sessionid,以及对应的保存在服务器当中的session之中是否保存了需要的数据,如果有就允许访问,没有的话就需要设置状态码。需要注意的是,这些是serverlet的操作,如果要填充数据的话,需要手动修改数据格式等操作。

注册配置拦截器
统一数据返回格式
通过来实现该接口的方法,来完成对返回数据的统一处理
存在问题
多测试⼏种不同的返回结果, 发现只有返回结果为String类型时才有这种错误发⽣.
解决⽅案
再次测试就正确了
不过还需要做一些小修改
优点
统一异常处理


匹配的规则是从子类开始向上匹配,最后才会匹配到Exception。
参数就是异常类型的匹配。
也可以在@ExceptionHandler("异常类型")这样来标注匹配的异常类。
当有多个异常通知时,匹配顺序为当前类及其⼦类向上依次匹配