SpringMvc拦截器入门 -- SpringMVC快速入门保姆级教程(五)
作者:mmseoamin日期:2024-03-20

文章目录

  • 前言
  • 发现宝藏
  • 五、拦截器入门
    • 1.拦截器简介
    • 2.拦截器入门案例
    • 3.拦截器参数
    • 4. 拦截器链配置
    • 总结

      前言

      为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评指正。

      (博客的参考源码可以在我主页的资源里找到,如果在学习的过程中有什么疑问欢迎大家在评论区向我提出)

      发现宝藏

      前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【宝藏入口】。

      五、拦截器入门

      1.拦截器简介

      1. 拦截器概念

      1. 拦截器( Interceptor )是一种动态拦截方法调用的机制
      2. 作用

        . 在指定的方法调用前后执行预先设定后的的代码

        . 阻止原始方法的执行

      SpringMvc拦截器入门 -- SpringMVC快速入门保姆级教程(五),在这里插入图片描述,第1张

      2. 拦截器与过滤器区别

      1. 归属不同 : Filter属于servlet技术,Interceptor属于springMVC技术
      2. 拦截内容不同:Filter对所有访问进行增强,Interceptor仅针对SpringMVC的访问进行增强

      2.拦截器入门案例

      1. 操作步骤

      1. 制作拦截器功能类
      2. 配置拦截器的执行位置

      2. 案例准备

      • 创建maven模块

      • 在pom.xml文件中导入相关技术及插件坐标

         
            
              javax.servlet
              javax.servlet-api
              3.1.0
              provided
            
            
            
              org.springframework
              spring-webmvc
              5.2.10.RELEASE
            
            
            
              com.fasterxml.jackson.core
              jackson-databind
              2.9.0
            
          
          
            
              
                org.apache.tomcat.maven
                tomcat7-maven-plugin
                2.1
                
                  80
                  /
                
              
              
                
                    org.apache.maven.plugins
                    maven-compiler-plugin
                    
                        8
                        8
                    
                
            
          
        
        • 创建config包,创建编写SpringMvcConfig类
          @Configuration
          @ComponentScan({"org.example.controller"})
          @EnableWebMvc
          public class SpringMvcConfig{
          }
          
          • 创建编写ServletContainersInitConfig类
            public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
                protected Class[] getRootConfigClasses() {
                    return new Class[0];
                }
                protected Class[] getServletConfigClasses() {
                    return new Class[]{SpringMvcConfig.class};
                }
                protected String[] getServletMappings() {
                    return new String[]{"/"};
                }
                //乱码处理
                @Override
                protected Filter[] getServletFilters() {
                    CharacterEncodingFilter filter = new CharacterEncodingFilter();
                    filter.setEncoding("UTF-8");
                    return new Filter[]{filter};
                }
            }
            
            • 创建domain包,创建编写实体类Book
              public class Book {
                  //此处省略getter、setter方法
                  private String name;
                  private double price;
              }
              
              • 创建controller包,创建编写BookController类
                @RestController
                @RequestMapping("/books")
                public class BookController {
                    @PostMapping
                    public String save(@RequestBody Book book){
                        System.out.println("book save..." + book);
                        return "{'module':'book save'}";
                    }
                    @DeleteMapping("/{id}")
                    public String delete(@PathVariable Integer id){
                        System.out.println("book delete..." + id);
                        return "{'module':'book delete'}";
                    }
                    @PutMapping
                    public String update(@RequestBody Book book){
                        System.out.println("book update..."+book);
                        return "{'module':'book update'}";
                    }
                    @GetMapping("/{id}")
                    public String getById(@PathVariable Integer id){
                        System.out.println("book getById..."+id);
                        return "{'module':'book getById'}";
                    }
                    @GetMapping
                    public String getAll(){
                        System.out.println("book getAll...");
                        return "{'module':'book getAll'}";
                    }
                }
                
                • 配置运行tomcat运行及代码文件结构示例

                  SpringMvc拦截器入门 -- SpringMVC快速入门保姆级教程(五),在这里插入图片描述,第2张

                  SpringMvc拦截器入门 -- SpringMVC快速入门保姆级教程(五),在这里插入图片描述,第3张

                  3.在controller包中创建包interceptor,并在包中创建编写拦截器ProjectInterceptor

                  @Component
                  //定义拦截器类,实现HandlerInterceptor接口
                  //注意当前类必须受Spring容器控制
                  public class ProjectInterceptor implements HandlerInterceptor {
                      @Override
                      //原始方法调用前执行的内容
                      //返回值类型可以拦截控制的执行,true放行,false终止
                      public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
                          System.out.println("preHandle...");
                          //实际开发中可以通过if判断决定是否继续执行方法
                          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...");
                      }
                  }
                  

                  4. 在config包下创建SpringMvcSupport类,并加载拦截器ProjectInterceptor

                  @Configuration
                  public class SpringMvcSupport extends WebMvcConfigurationSupport {
                      //先注入拦截器
                      @Autowired
                      private ProjectInterceptor projectInterceptor;
                      //过滤访问静态资源
                      @Override
                      protected void addResourceHandlers(ResourceHandlerRegistry registry) {
                          registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
                      }
                      //加载拦截器配置
                      @Override
                      protected void addInterceptors(InterceptorRegistry registry) {
                          //配置拦截器(添加哪个拦截器+拦截路径)
                          registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");
                      }
                  }
                  

                  5. 在SpringMvcConfig配置类中扫描拦截器类ProjectInterceptor

                  @ComponentScan({"org.example.controller","org.example.config"})
                  

                  6. 再次运行tomcat运行及文件结构示例

                  SpringMvc拦截器入门 -- SpringMVC快速入门保姆级教程(五),在这里插入图片描述,第4张

                  SpringMvc拦截器入门 -- SpringMVC快速入门保姆级教程(五),在这里插入图片描述,第5张

                  SpringMvc拦截器入门 -- SpringMVC快速入门保姆级教程(五),在这里插入图片描述,第6张

                  7.加载拦截器简化开发(直接写作SpringMvcConfig配置类中)

                  实现WebMvcConfigurer接口可以简化开发,但具有一定的侵入性

                  @Configuration
                  @ComponentScan({"com.itheima.controller"})
                  @EnableWebMvc
                  public class SpringMvcConfig implements WebMvcConfigurer {
                      @Autowired
                      private ProjectInterceptor projectInterceptor;
                      @Override
                      public void addInterceptors(InterceptorRegistry registry) {
                          //配置多拦截器
                          registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");
                      }
                  }
                  

                  8.拦截器执行流程

                  SpringMvc拦截器入门 -- SpringMVC快速入门保姆级教程(五),在这里插入图片描述,第7张

                  3.拦截器参数

                  1. 前置处理

                  1. 参数

                    . request: 请求对象

                    . response: 响应对象

                    . handler: 被调用的处理器对象,本质上是一个方法对象,对反射技术中的Method对象进行了再包装

                  2. 返回值

                    返回值为false,被拦截的处理器将不执行

                  3. 示例:

                  SpringMvc拦截器入门 -- SpringMVC快速入门保姆级教程(五),在这里插入图片描述,第8张

                  2.后置处理

                  1. modelAndview: 如果处理器执行完成具有返回结果,可以读取到对应数据与页面信息,并进行调整
                  2. 示例:

                  SpringMvc拦截器入门 -- SpringMVC快速入门保姆级教程(五),在这里插入图片描述,第9张

                  3.完成后处理

                  1. ex: 如果处理器执行过程中出现异常对象,可以针对异常情况进行单独处理
                  2. 示例:

                  SpringMvc拦截器入门 -- SpringMVC快速入门保姆级教程(五),在这里插入图片描述,第10张

                  4. 拦截器链配置

                  1. 多拦截器执行顺序

                  1. 当配置多个拦截器时,形成拦截器链
                  2. 拦截器链的运行顺序参照拦截器添加顺序为准
                  3. 当拦截器中出现对原始处理器的拦截,后面的拦截器均终止运行
                  4. 当拦截器运行中断,仅运行配置在前面的拦截器的afterCompletion操作

                  SpringMvc拦截器入门 -- SpringMVC快速入门保姆级教程(五),在这里插入图片描述,第11张

                  2. 创建第二个拦截器ProjectInterceptor2

                  @Component
                  public class ProjectInterceptor2 implements HandlerInterceptor {
                      @Override
                      public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
                          System.out.println("preHandle...222");
                          return true;
                      }
                      @Override
                      public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
                          System.out.println("postHandle...222");
                      }
                      @Override
                      public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
                          System.out.println("afterCompletion...222");
                      }
                  }
                  

                  3. 在SpringMvcConfig类中简化开发加载拦截器

                  @Configuration
                  @ComponentScan({"org.example.controller"})
                  @EnableWebMvc
                  //实现WebMvcConfigurer接口可以简化开发,但具有一定的侵入性
                  public class SpringMvcConfig implements WebMvcConfigurer {
                      @Autowired
                      private ProjectInterceptor projectInterceptor;
                      @Autowired
                      private ProjectInterceptor2 projectInterceptor2;
                      @Override
                      public void addInterceptors(InterceptorRegistry registry) {
                          //配置多拦截器
                          registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");
                          registry.addInterceptor(projectInterceptor2).addPathPatterns("/books","/books/*");
                      }
                  }
                  

                  4. 运行tomcat,在浏览器访问

                  SpringMvc拦截器入门 -- SpringMVC快速入门保姆级教程(五),在这里插入图片描述,第12张

                  SpringMvc拦截器入门 -- SpringMVC快速入门保姆级教程(五),在这里插入图片描述,第13张

                  5. 将拦截器ProjectInterceptor2中的返回值改为false,运行tomcat,通过浏览器访问

                  SpringMvc拦截器入门 -- SpringMVC快速入门保姆级教程(五),在这里插入图片描述,第14张

                  6. 小结

                  1. preHandle: 与配置顺序相同,必定运行
                  2. postHandle: 与配置顺序相反,可能不运行
                  3. afterCompletion: 与配置顺序相反,可能不运行

                  总结

                  欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下。

                  (博客的参考源码可以在我主页的资源里找到,如果在学习的过程中有什么疑问欢迎大家在评论区向我提出)