SpringBoot+Vue学习(三)
拦截器学习
拦截器简介
- 拦截器在Web系统中很常见,对于某些全局统一的操作,我们可以把它提取到拦截器中实现,比如以下几种情景:
- 权限检查:如登录检测,进入处理程序检测是否登录,如果没有,则直接返回登录界面
- 性能监控:有时系统在某段时间莫名奇妙很慢,可以通过拦截器在进入处理程序之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间
- 通用行为:读取Cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用。还有提取Locale、Theme信息等,只要是多个处理程序都需要的,即可使用拦截器实现
- SpringBoot定义了HandlerInterceptor接口来自定义拦截器的功能。HnadlerInterceptor接口定义了preHandle、postHandle、afterCompletion三种方法,我们可以通过重写这三种方法来实现请求前、请求后、页面渲染后等操作。示意图如下:
拦截器的定义
- 拦截器的经典定义如下
public class LoginInterceptor implements HandlerInterceptor{
//preHandle方法是在Controller的方法调用之前进行处理
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{
if(条件){
System.out.printlin("通过");
return true;
}else{
System.out.println("不通过");
return false;
}
}
}
拦截器的注册
- 在定义完拦截器后,还需要对拦截器进行注册,否则该拦截器无法使用
- addPathPatterns方法定义拦截的地址
- excludePathPatterns定义排除某些地址不被拦截
- 注册某一拦截器如果没有addPathPatterns任何一个url的话,则表示拦截所有的请求
- 注册某一拦截器如果没有excludePathPatterns任何一个请求的话,则表示不放过任何一个请求
拦截器的注册示例如下:
@Configuration
public class WebConfigurer implements WebMvcConfigurer{
@Override
public void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/user/**");
}
}
//LoginInterceptor是之前定义的拦截器,这里表示该拦截器需要拦截所有/user开头的请求
拦截器应用
创建拦截器
- 在com.example.helloworld下创建interceptor包,在包中新建LoginInterceptor类,并重写preHandle方法
注册拦截器
- 在com.example.helloworld下创建config包,在包中新建WebConfig类,并注册LoginInterceptor拦截器
测试拦截器
- 在HelloController中定义相关的控制器方法,接收来自/user这一URL的get请求
- 启动项目后在浏览器向/user发送get请求,后端成功返回相应的数据
- 同时查看IDEA的终端,发现成功进入LoginInterceptor拦截器,输出“preHandle拦截器”字样
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Yuichi's Blog!