SpringBoot-Vue学习(三)

拦截器学习

拦截器简介

  • 拦截器在Web系统中很常见,对于某些全局统一的操作,我们可以把它提取到拦截器中实现,比如以下几种情景:
    1. 权限检查:如登录检测,进入处理程序检测是否登录,如果没有,则直接返回登录界面
    2. 性能监控:有时系统在某段时间莫名奇妙很慢,可以通过拦截器在进入处理程序之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间
    3. 通用行为:读取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拦截器”字样

猜你喜欢

转载自blog.csdn.net/Qudoudou2020/article/details/133979597