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

相关推荐
我命由我123458 分钟前
Android Camera - 获取当前设备屏幕的旋转角度、保存帧到外部存储的私有空间
android·java·开发语言·java-ee·android jetpack·android-studio·android runtime
深念Y9 分钟前
微服务抽取路线图:从胖单体到 ARM 集群
前端·arm开发·数据库·后端·微服务·云原生·架构
苏灿烤鱼9 分钟前
一个用 Nim 写的隐私优先 Twitter 替代前端,源码级技术剖析
后端·github·twitter
niuniudengdeng22 分钟前
从小程序到 WebView:一个理发店管理系统的全栈架构设计与落地实践
java·python
LccKyI29 分钟前
C#基础编程 面试题汇总(二)
java·面试·c#
灯澜忆梦29 分钟前
【基于GO的Web开发14】gin请求重定向
前端·后端·golang·gin
一晌小贪欢32 分钟前
Python办公17:暴力拆分——按页数或指定范围提取 PDF 核心页面
java·开发语言·python·pdf·excel·数据可视化·python办公
2401_8346369933 分钟前
Docker 容器化技术全解:从镜像构建到容器编排的完整教案1
java·docker·容器
东风破_38 分钟前
博客数据库进阶设计:点赞、收藏、评论、标签与文件表怎么建?
后端·mysql
jjjava2.039 分钟前
初步认识接口测试
java·可用性测试