SpringMVC_拦截器

4.拦截器

4.1拦截器概述

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

4.2图示

  • 图示

    4.3案例实现

  • 模拟没有登录拦截操作

  • 新定义拦截器

    java 复制代码
    @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");
        }
    }
  • 修改SpringMvc 配置

    java 复制代码
    @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/*");
        }
    }
  • controller 确实被拦截

    java 复制代码
    @RestController
    @RequestMapping("/item")
    public class ItemController {
    
        @GetMapping("/{id}")
        public String getById(@PathVariable Long id){
            return "query"+id;
        }
    
        @GetMapping
        public String list(){
            return "list";
        }
    }

4.4拦截器参数讲解

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

4.5拦截器链

  • 新增拦截器

    java 复制代码
    @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方法");
        }
    }
  • 添加到拦截器链中

    java 复制代码
    @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/*");
        }
    }
  • 拦截器链注意点

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

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

  • 区别

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

相关推荐
h***673716 小时前
SpringBoot整合easy-es
spring boot·后端·elasticsearch
叫致寒吧18 小时前
Tomcat详解
java·tomcat
S***26751 天前
基于SpringBoot和Leaflet的行政区划地图掩膜效果实战
java·spring boot·后端
马剑威(威哥爱编程)1 天前
鸿蒙6开发视频播放器的屏幕方向适配问题
java·音视频·harmonyos
JIngJaneIL1 天前
社区互助|社区交易|基于springboot+vue的社区互助交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·社区互助
V***u4531 天前
MS SQL Server partition by 函数实战二 编排考场人员
java·服务器·开发语言
这是程序猿1 天前
基于java的ssm框架旅游在线平台
java·开发语言·spring boot·spring·旅游·旅游在线平台
i***t9191 天前
基于SpringBoot和PostGIS的云南与缅甸的千里边境线实战
java·spring boot·spring
k***08291 天前
【监控】spring actuator源码速读
java·spring boot·spring
麦麦鸡腿堡1 天前
Java_网络编程_InetAddress类与Socket类
java·服务器·网络