SpringBoot中拦截器使用
一、如何使用拦截器
1.1 为什么使用拦截器?
拦截器顾名思义即在请求真正接口逻辑时先经过拦截器拦截,通过拦截器之后才可以访问真正的业务逻辑接口,否则返回登录界面或做其他失败处理。
1.2 SpringBoot中如何使用拦截器
首先在使用拦截器时先了解一个接口HandlerInterceptor,该接口中主要有3个方法分别为:
第一个方法preHandle执行时机是:在Controller中的方法调用前调用,第二个方法postHandle方法是在Controller方法执行后执行并在返回模版引擎前执行,所以第二个方法中参数多了一个ModelAndView,因此你可以在数据填充到模版之前再次进行组装数据,最后再去渲染模版。第三个方法afterCompletion是在模版引擎之后执行
因此,我们自定义的拦截器必须要继承这个接口,然后根据具体业务去实现3个方法中的某一个或全部。下面我们来模拟一个场景说明下;我们知道无论什么系统都会有登录功能,而有些其他的功能又都是建立在登录之上,如:只有登录的用户才可以将商品加入购物车、购买商品、收藏等,没登录的话则只能浏览商品。如果我们在每个Controller都去加上是否已经登录的校验则代码高度冗余,并且很不适合二次开发。我们可以使用拦截器将公共部分从业务代码里抽取出来。
1.3 代码演示
如上图所示,我们实现了接口之后,只需要实现接口中的preHandle方法,因为我们在判断是否登录的时候肯定要在执行具体业务的Controller前调用,此处有一个HostHolder,作用是从ThreadLocal中取出当前用户信息,handler里面包含的是你要调用的方法名即你要调用的Controller中的方法名,拿到方法名后看该方法上是否有注解LoginRequired表示是否需要登录以后才可以访问该方法,如果有注解并且用户不为空即当前是已经登录的用户则返回true,否则返回false并且跳转到登录页面让用户登录。看下HostHolder代码:
注解LoginRequired代码:
1.4 使用拦截器释放静态资源
上面介绍的拦截器使用会把静态资源如js、css都拦截,因此我们在页面上看起来可能就没有样式或者样式很难看,所以我们需要把这些静态资源的拦截放开。因为我们刚才自定义的拦截器已经被容器所托管,因此这里可以直接使用注入的方式,与此同时我们需要实现WebMvcConfigurer接口并重写里面的添加拦截器方法,将我们刚才自定义的拦截器添加到配置里,使用excludePathPatterns来表示要过滤css、js等静态资源。