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
  • 访问流程

相关推荐
毕业设计制作和分享25 分钟前
springboot150基于springboot的贸易行业crm系统
java·vue.js·spring boot·后端·毕业设计·mybatis
你的人类朋友5 小时前
【Node】认识multer库
前端·javascript·后端
小梁努力敲代码6 小时前
java数据结构--List的介绍
java·开发语言·数据结构
摸鱼的老谭6 小时前
构建Agent该选Python还是Java ?
java·python·agent
lang201509286 小时前
Spring Boot 官方文档精解:构建与依赖管理
java·spring boot·后端
夫唯不争,故无尤也6 小时前
Tomcat 启动后只显示 index.jsp,没有进入你的 Servlet 逻辑
java·servlet·tomcat
zz-zjx6 小时前
Tomcat核心组件全解析
java·tomcat
Deschen6 小时前
设计模式-外观模式
java·设计模式·外观模式
why技术7 小时前
从18w到1600w播放量,我的一点思考。
java·前端·后端
间彧7 小时前
Redis Cluster vs Sentinel模式区别
后端