spring拦截器使用说明
一.spring中的拦截器能干什么?
简而言之,拦截请求
二.如何实现一个拦截器?
以最简单的session校验为例,拦截请求,校验请求cookie中的session是否有效,无效则返回对应的错误提示信息。
三.拦截器的具体实现步骤
1.实现HandlerInterceptor接口
HandlerInterceptor接口中有3个方法
preHandle:方法执行之前执行,
postHandle:方法执行之后执行,
afterCompletion:方法执行完成时执行,
当preHandle返回结果为true,才会继续后面的postHandle方法
HandlerInterceptor接口
因为我们是要拦截请求校验session,是在controller层的方法之前,所以实现其中的preHandle,代码如下图所示
拦截器的具体实现
如图所示,获取请求中的cookie,校验是否携带sid字段,当不存在,直接返回sid缺失;再校验携带的sid是否有效,若无效,则处理缓存及数据库中的sid状态
2.注册拦截器
实现拦截器的基本功能后,实现WebMvcConfigurer接口,注册该拦截器
注册session校验的拦截器
注册时,添加需要拦截的路径,以及不需要拦截的路径。如上图,我们拦截所有请求,同时排除用户登录、注册的路径
四.使用拦截器的tips
当访问白名单中的接口过程中出现异常,例如/user/login接口,则会重定向到/error路径,而/error路径不在白名单中,所以也会被拦截,那么在当前的业务场景下,则会出现session无效的错误
如何解决上述问题?
使用全局异常处理,使用@RestControllerAdvice,可以将结果转为json格式,统一返回
全局异常处理
我们在拦截器发现sid无效时,可以直接抛出session无效的异常,通过GlobalExceptionHandler处理,格式化返回数据。同时在service层处理时也可以跑出对应的异常,统一处理,将返回数据格式化输出。