SpringMvc拦截器入门 -- SpringMVC快速入门保姆级教程(五)

这篇具有很好参考价值的文章主要介绍了SpringMvc拦截器入门 -- SpringMVC快速入门保姆级教程(五)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评指正。
(博客的参考源码可以在我主页的资源里找到,如果在学习的过程中有什么疑问欢迎大家在评论区向我提出)

发现宝藏

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

五、拦截器入门

1.拦截器简介

1. 拦截器概念

  1. 拦截器( Interceptor )是一种动态拦截方法调用的机制
  2. 作用
    . 在指定的方法调用前后执行预先设定后的的代码
    . 阻止原始方法的执行

SpringMvc拦截器入门 -- SpringMVC快速入门保姆级教程(五)

2. 拦截器与过滤器区别

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

2.拦截器入门案例

1. 操作步骤

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

2. 案例准备

  • 创建maven模块

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

 <dependencies>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
    
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.10.RELEASE</version>
    </dependency>
    
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.0</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.1</version>
        <configuration>
          <port>80</port>
          <path>/</path>
        </configuration>
      </plugin>
      
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>8</source>
                <target>8</target>
            </configuration>
        </plugin>
    </plugins>
  </build>
  • 创建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快速入门保姆级教程(五)

SpringMvc拦截器入门 -- SpringMVC快速入门保姆级教程(五)

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快速入门保姆级教程(五)
SpringMvc拦截器入门 -- SpringMVC快速入门保姆级教程(五)

SpringMvc拦截器入门 -- SpringMVC快速入门保姆级教程(五)

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快速入门保姆级教程(五)

3.拦截器参数

1. 前置处理

  1. 参数
    . request: 请求对象
    . response: 响应对象
    . handler: 被调用的处理器对象,本质上是一个方法对象,对反射技术中的Method对象进行了再包装
  2. 返回值
    返回值为false,被拦截的处理器将不执行
  3. 示例:

SpringMvc拦截器入门 -- SpringMVC快速入门保姆级教程(五)

2.后置处理

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

SpringMvc拦截器入门 -- SpringMVC快速入门保姆级教程(五)

3.完成后处理

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

SpringMvc拦截器入门 -- SpringMVC快速入门保姆级教程(五)

4. 拦截器链配置

1. 多拦截器执行顺序

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

SpringMvc拦截器入门 -- SpringMVC快速入门保姆级教程(五)

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快速入门保姆级教程(五)

SpringMvc拦截器入门 -- SpringMVC快速入门保姆级教程(五)

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

SpringMvc拦截器入门 -- SpringMVC快速入门保姆级教程(五)

6. 小结

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

总结

欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下。
(博客的参考源码可以在我主页的资源里找到,如果在学习的过程中有什么疑问欢迎大家在评论区向我提出)文章来源地址https://www.toymoban.com/news/detail-497003.html

到了这里,关于SpringMvc拦截器入门 -- SpringMVC快速入门保姆级教程(五)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringMVC:拦截器

    一般我们会做一些统一的操作这个时候我们需要使用springmvc提供的拦截器,例如token的验证,字段必填的操作,接口超时判断,签名验证,字段加密等操作,所以我们需要了解执行先后顺序。 我们来简单介绍下实现过程及对应代码,执行结果: 1、定义自己的spring mvc拦截器需

    2024年01月24日
    浏览(33)
  • SpringMVC拦截器 (Interceptor)

            Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、判断用户是否登录等。         拦截器依赖于web框架,在实现上基于Java的反射机制,属于面向切面编程(AOP)的

    2024年01月22日
    浏览(35)
  • 一文学会 SpringMVC 拦截器

    ✅作者简介:2022年 博客新星 第八 。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:SSM 框架从入门到精通 ✨特色专栏:国学周更-心性养成之路 🥭本文内容:一文学会 SpringM

    2024年02月02日
    浏览(36)
  • 12、SpringMVC之拦截器

    创建名为spring_mvc_interceptor的新module,过程参考9.1节和9.5节 与自定义的过滤器一样,自定义的拦截器也要配置后才能生效; 过滤器是服务器中的组件,所以配置到 web.xml 中; 拦截器是 springmvc 中的组件,因此要配置到 springmvc 的配置文件中。 因为在配置拦截器时,没有指定要

    2024年02月05日
    浏览(32)
  • SpringMVC Day 10 : 拦截器

    拦截器是Spring MVC框架提供的一种强大的机制,用于在请求到达控制器之前或之后进行预处理和后处理。它可以拦截并处理请求,对请求进行必要的修改或验证,以及在请求返回给客户端之前进行额外的操作。拦截器可以帮助我们实现各种需求,如身份验证、日志记录、性能监

    2024年02月06日
    浏览(31)
  • SpringMVC的拦截器(Interceptor)

    对于拦截器这节的知识,我们需要学习如下内容: 拦截器概念 入门案例 拦截器参数 拦截器工作流程分析 讲解拦截器的概念之前,我们先看一张图: (1)浏览器发送一个请求会先到Tomcat的web服务器 (2)Tomcat服务器接收到请求以后,会去判断请求的是静态资源还是动态资源 (3)如果是

    2024年02月09日
    浏览(32)
  • springmvc统一异常处理拦截器

    使用@RestControllerAdvice+@ExceptionHandler实现 也可以使用@ControllerAdvice+@ResponseBody+@ExceptionHandler实现 创建一个异常处理的类,放在config包下  组件类:  也可以让不同的异常返回不同的结果,捕获什么异常由@ExceptionHandler的value属性决定,传入一个类对象(可以通过反射获得)  

    2024年02月15日
    浏览(32)
  • SpringMvc拦截器和手写模拟SpringMvc工作流程源码详解

    目录 1. SpringMvc简介 1.1 什么是MVC 1.2 什么是SpringMvc 1.3 SpringMvc 能干什么 1.4 SpringMvc 工作流程 2. SpringMvc拦截器和过滤器 2.1 拦截器 2.1.1 拦截器作用 2.1.2 拦截器和过滤器的区别 2.1.3 拦截器方法说明 2.1.4 多个拦截器执行顺序 2.1.5 自定义拦截器 2.2 过滤器(附加) 3. 手写模拟Spri

    2024年02月09日
    浏览(36)
  • 第9章:SpringMVC的拦截器

    1. 拦截器的配置 SpringMVC中的拦截器用于拦截控制器方法的执行 SpringMVC中的拦截器需要实现HandlerInterceptor SpringMVC的拦截器必须在SpringMVC的配置文件进行配置 ①创建拦截器,继承接口HandlerInterceptor.  ②在springMVC配置文件里配置拦截器   !-- 拦截所有的请求,除了 /-- 2. 拦截器的

    2024年02月08日
    浏览(28)
  • SpringMVC下半篇之拦截器

    拦截器 文件上传 异常处理器 ssm整合 ​ Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、判断用户是否登录等。 ​ 拦截器依赖于web框架,在实现上基于Java的反射机制,属于面向

    2024年01月23日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包