• Java框架(八)--SpringMVC拦截器(1)--拦截器开发流程、多Interceptor执行顺序及preHandle返回值


    拦截器-Interceptor

    拦截器(Interceptor)用于对URL请求进行前置/后置过滤。
    Interceptor与Filter用途相似,但实现方式不同。
    Interceptor为SpringMVC的标准组件。
    Filter为J2EE的标准组件。
    Interceptor底层就是基于Spring AOP面向切面编程实现。

    HandlerInterceptor接口

    preHandle - 前置执行处理
    postHandle - 目标资源已被SpringMVC框架处理
    afterCompletion - 响应文本已经产生

    拦截器开发流程

    Maven依赖servlet-api
    实现HandlerInterceptor接口
    applicationContext配置过滤地址

    新建工程interceptor并把RESTful风格的应用部分的restfull工程源代码复制到当前工程
    在这里插入图片描述
    打开pom.xml引入servlet依赖

            <dependency>
                <groupId>javax.servletgroupId>
                <artifactId>javax.servlet-apiartifactId>
                <version>3.1.0version>
                <scope>providedscope>
                
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在com.ql.restful.interceptor包下创建MyInterceptor类

    package com.ql.restful.interceptor;
    
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    public class MyInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {
            System.out.println(request.getRequestURL()+"准备执行");
            return true;
        }
    
        @Override
        public void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println(request.getRequestURL()+"-目标处理成功");
        }
    
        @Override
        public void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println(request.getRequestURL()+"-响应内容已产生");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    修改com.ql.restful.controller包下RestfulController类的findPersons方法

        @GetMapping("/persons")
        public List<Person> findPersons(){
            List list = new ArrayList();
            Person person1 = new Person();
            person1.setName("lily");
            person1.setAge(23);
            person1.setBirthday(new Date());
            list.add(person1);
            Person person2 = new Person();
            person2.setName("smith");
            person2.setAge(22);
            person2.setBirthday(new Date());
            list.add(person2);
            System.out.println("RestfulController.findPersons() - return list");
            return list;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在applicationContext.xml中配置拦截器

        <mvc:interceptors>
            <mvc:interceptor>
                
                
                <mvc:mapping path="/restful/**"/>
                
                <mvc:exclude-mapping path="/**.js"/>
                <mvc:exclude-mapping path="/**.css"/>
                <mvc:exclude-mapping path="/**.ico"/>
                
                <mvc:exclude-mapping path="/resources/**"/>
                <bean class="com.ql.restful.interceptor.MyInterceptor"/>
            mvc:interceptor>
        mvc:interceptors>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    运行工程,在浏览器地址栏中输入http://localhost:8080/restful/persons,控制台中会输出
    在这里插入图片描述

    多Interceptor执行顺序

    有多个拦截器时按照配置的顺序依次访问执行。
    在这里插入图片描述
    在com.ql.restful.interceptor目录下再创建一个拦截器MyInterceptor1

    package com.ql.restful.interceptor;
    
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    public class MyInterceptor1 implements HandlerInterceptor {
        @Override
        public boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {
            System.out.println(request.getRequestURL()+"准备执行1");
            return true;
        }
    
        @Override
        public void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println(request.getRequestURL()+"-目标处理成功1");
        }
    
        @Override
        public void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println(request.getRequestURL()+"-响应内容已产生1");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    然后在applicationContext.xml中配置拦截器

        <mvc:interceptors>
            <mvc:interceptor>
                
                
                <mvc:mapping path="/restful/**"/>
                
                <mvc:exclude-mapping path="/**.js"/>
                <mvc:exclude-mapping path="/**.css"/>
                <mvc:exclude-mapping path="/**.ico"/>
                
                <mvc:exclude-mapping path="/resources/**"/>
                <bean class="com.ql.restful.interceptor.MyInterceptor"/>
            mvc:interceptor>
        mvc:interceptors>
    
        <mvc:interceptors>
            <mvc:interceptor>
                
                
                <mvc:mapping path="/restful/**"/>
                
                <mvc:exclude-mapping path="/**.js"/>
                <mvc:exclude-mapping path="/**.css"/>
                <mvc:exclude-mapping path="/**.ico"/>
                
                <mvc:exclude-mapping path="/resources/**"/>
                <bean class="com.ql.restful.interceptor.MyInterceptor1"/>
            mvc:interceptor>
        mvc:interceptors>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    运行工程,在浏览器中访问http://localhost:8080/restful/persons控制台输出为
    在这里插入图片描述

    preHandle返回值

    拦截器中preHandle方法返回boolean值,返回true则请求依次向后传递,如果返回false请求会被中断。

    修改com.ql.restful.interceptor包下的MyInterceptor拦截器

    package com.ql.restful.interceptor;
    
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    public class MyInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {
            System.out.println(request.getRequestURL()+"准备执行");
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().print("请求被拦截");
            return false;
        }
    
        @Override
        public void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println(request.getRequestURL()+"-目标处理成功");
        }
    
        @Override
        public void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println(request.getRequestURL()+"-响应内容已产生");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    运行项目浏览器中访问http://localhost:8080/restful/persons响应结果为
    在这里插入图片描述
    控制台中也只输出了preHandle中的打印语句内容。
    在这里插入图片描述

  • 相关阅读:
    产品经理就业喜报:有努力,回报就在眼前
    Linux——Linux驱动之iMX6ULL硬件平台下使用MfgTool工具进行系统烧写的原理及步骤总结(uboot、kernel、dtb、rootfs)
    效率工具之Arthas
    npm ,yarn 更换使用国内镜像源,淘宝源
    计算机毕业设计(附源码)python智能交通信息管理平台
    13.DesignForSip[Apd]\1.DownrevSip[Apd]17.2-17.4to16.6
    宇视大屏出现不规则闪烁故障排查方法
    FFmpeg源代码简单分析-编码-av_write_trailer()
    Kotlin调用Java代码时引起空指针异常,要怎么避免?
    宜搜科技死磕港交所上市:从搜索引擎到广告投放,业绩疲态凸显
  • 原文地址:https://blog.csdn.net/qq_32091929/article/details/126531464