• SpringMVC_拦截器


    4.拦截器

    4.1拦截器概述

    • 概述:一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行
    • 实际开发中,静态资源(HTML/CSS)不需要交给框架处理,需要拦截的是动态资源

    4.2图示

    • 图示

      在这里插入图片描述

      4.3案例实现

    • 模拟没有登录拦截操作

    • 新定义拦截器

      @Component
      public class LoginInterceptor implements HandlerInterceptor {
          @Override
          public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
              System.out.println("登录拦截操作");
              String username = request.getParameter("username");
              if("sy".equals(username)){
                  return true;
              }
              System.out.println("preHandle");
              return false;
          }
      
          @Override
          public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
              System.out.println("postHandle");
          }
      
          @Override
          public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
              System.out.println("afterCompletion");
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
    • 修改SpringMvc 配置

      @Configuration
      @ComponentScan({"cn.sycoder.controller","cn.sycoder.interceptor"})
      @EnableWebMvc
      public class SpringMvcConfig implements WebMvcConfigurer {
      
          @Autowired
          LoginInterceptor loginInterceptor;
      
          @Override
          public void addInterceptors(InterceptorRegistry registry) {
              registry.addInterceptor(loginInterceptor).addPathPatterns("/item","/item/*");
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
    • controller 确实被拦截

      @RestController
      @RequestMapping("/item")
      public class ItemController {
      
          @GetMapping("/{id}")
          public String getById(@PathVariable Long id){
              return "query"+id;
          }
      
          @GetMapping
          public String list(){
              return "list";
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14

    4.4拦截器参数讲解

    • HttpServletRequest request
    • HttpServletResponse response
    • Object handler 相当于是对访问接口的一种包装

    4.5拦截器链

    • 新增拦截器

      @Component
      public class AuthInterceptor implements HandlerInterceptor {
          @Override
          public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
              System.out.println("权限拦截的方法");
              return true;
          }
      
          @Override
          public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
              System.out.println("权限拦截的postHandle方法");
          }
      
          @Override
          public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
              System.out.println("权限拦截的afterCompletion方法");
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
    • 添加到拦截器链中

      @Configuration
      @ComponentScan({"cn.sycoder.controller","cn.sycoder.interceptor"})
      @EnableWebMvc
      public class SpringMvcConfig implements WebMvcConfigurer {
      
          @Autowired
          LoginInterceptor loginInterceptor;
      
          @Autowired
          AuthInterceptor authInterceptor;
      
          @Override
          public void addInterceptors(InterceptorRegistry registry) {
              registry.addInterceptor(loginInterceptor).addPathPatterns("/item","/item/*");
              registry.addInterceptor(authInterceptor).addPathPatterns("/item","/item/*");
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
    • 拦截器链注意点

      • 拦截器有着先进后出的原则
      • preHandle : 与配置顺序保持一致的执行顺序
      • postHandle:与配置顺序相反,可能不运行
      • afterCompletion:与配置顺序相反,可能不运行

    4.6面试题拦截器与过滤器的区别

    • 区别

      • 技术所属不同
        • 过滤器:Servlet 技术
        • 拦截器:SpringMVC技术
      • 拦截内容不同
        • Filter : 是对所有访问进行过滤
        • Interceptor:仅仅针对访问SpringMVC
    • 访问流程

      在这里插入图片描述

  • 相关阅读:
    相机标定和双目相机标定标定原理推导及效果展示
    Java面经汇总
    Nacos 注册中心使用说明
    Docker基本操作三 (容器相关命令二)
    Java学习Day022(方法,方法重载,this关键字,局部与成员变量)
    CentOS 7.6安装JDK8过程(通过官网下载压缩包方式)
    管理者总结
    变量命名的规则与规范
    深度解读李彦宏的“不要卷模型,要卷应用”
    Scriban语言手册中文版
  • 原文地址:https://blog.csdn.net/Byron__/article/details/132763619