zoukankan      html  css  js  c++  java
  • SpringMVC高级-拦截器如何正确运用?案例详解

     

    SpringMVC高级-拦截器【重点你get到了嘛!!!】

    springMVC:拦截器

    实现了HandlerInterceptor接口。

    作用:用来拦截控制器的

    二.定义一个拦截器

    1.环境搭建

    @Component
    public class Demo1Interceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            return false;
        }
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    
        }
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
        }
    }另外要注意:除了SpringMvc。我还整理了最新JAVA架构项目实战教程及大厂面试题库,有兴趣的可以进裙 783802103 免费获取,没基础勿进哦!
    

    2、注册拦截器

    @Configuration
    @ComponentScan(basePackages={"com.czxy"})
    @EnableWebMvc
    public class MVCConfiguration extends WebMvcConfigurerAdapter{

        /**
         * 视图解析器
         * @return
         */
        @Bean
        public InternalResourceViewResolver getInternalResourceViewResolver(){
            InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
            internalResourceViewResolver.setPrefix("/");
            internalResourceViewResolver.setSuffix(".jsp");
            return internalResourceViewResolver;
        }

        /*
        * 注册拦截器
        * */
        //1、定义一个成员变量,获取拦截器对象(变量名=类名小驼峰)
        @Resource
        private HandlerInterceptor demo1Interceptor;
        //2、重写注册拦截器方法,注册拦截器
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            //添加拦截器(注册拦截器)
            InterceptorRegistration i1 = registry.addInterceptor(demo1Interceptor);
            //设置该拦截器的拦截路径
            i1.addPathPatterns("/**");
        }
    }

    3.代码实现

    Demo1Interceptor:

    @Component
    public class Demo1Interceptor implements HandlerInterceptor {
        /*
        * 预处理方法:
        *       执行某个控制器之前执行
        *       true:执行控制器方法(放行)
        *       false:拦截下来,不执行控制器方法(不放行、拦截)
        * */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("demo1Interceptor-预处理方法");
            return true;
        }
        /*
        * 后处理方法:
        *       某个控制器方法执行之后
        *       ModelAndView:用来修改控制器的跳转路径
        * */
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("demo1Interceptor-后处理方法");
        }
        /*
        * 完成方法:
        *       所有功能都执行完毕后,最后执行该方法
        * */
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("demo1Interceptor-完成方法");
        }
    }
    

    4.注意事项:拦截器三大方法

    • preHandle:预处理方法

    是在控制器执行之前。

    特殊:通过返回值控制 控制器是否执行。

    true:放行,控制器执行

    false:不放行、拦截,控制器不执行

    适用环境:适用于在执行控制器之前进行判断。

    • postHandle:后处理方法

    前提:1、预处理方法,返回值true

          2、控制器没有出现异常

    在控制器执行之后执行。

    适用环境:适用于在执行控制器之后,修改跳转路径/跳转方式

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        modelAndView.setViewName("errorMsg");
        System.out.println("demo1Interceptor-后处理方法");
    }

    • afterCompletion:完成后方法

    前提:预处理方法,返回值true

    在所有流程执行之后执行,无论如何一定执行,相当于finally

    适用环境:若未设置异常处理器,完成后方法可以进行异常处理

    /*
    * 完成后方法:
    *       所有功能都执行完毕后,最后执行该方法
    * */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("控制器出现的异常是:"+ex);
        System.out.println("demo1Interceptor-完成方法");
    }

    5.注意事项:执行顺序图

    6.注意事项:过滤器和拦截器区别

    • 过滤器:

    实现了Filter接口

    用来拦截发给服务器的请求,或服务器内部的请求转发、包含、错误

    过滤器在servlet之前执行

    过滤器是web组件,拦截所有WEB资源

    • 拦截器:

    实现了HandlerInterceptor接口

    仅用来拦截发给 控制器的请求,或服务器内部跳转控制器的请求转发

    拦截器在servlet之后,控制器之前执行

    拦截器是springMVC组件,负责拦截控制器

    三. 定义多个拦截器

    1.代码实现

    Demo2Interceptor:

    @Component
    public class Demo2Interceptor implements HandlerInterceptor {
        /*
        * 预处理方法:
        *       执行某个控制器之前执行
        *       true:执行控制器方法(放行)
        *       false:拦截下来,不执行控制器方法(不放行、拦截)
        * */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("demo2Interceptor-预处理方法");
            return true;
        }
        /*
        * 后处理方法:
        *       某个控制器方法执行之后
        *       ModelAndView:用来修改控制器的跳转路径。
        * */
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    //        modelAndView.setViewName("errorMsg");
            System.out.println("demo2Interceptor-后处理方法");
        }
        /*
        * 完成后方法:
        *       所有功能都执行完毕后,最后执行该方法
        * */
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    //        System.out.println("控制器出现的异常是:"+ex);
            System.out.println("demo2Interceptor-完成方法");
        }
    }

    MVC配置类:

    @Configuration
    @ComponentScan(basePackages={"com.czxy"})
    @EnableWebMvc
    public class MVCConfiguration extends WebMvcConfigurerAdapter{

        /**
         * 视图解析器
         * @return
         */
        @Bean
        public InternalResourceViewResolver getInternalResourceViewResolver(){
            InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
            internalResourceViewResolver.setPrefix("/");
            internalResourceViewResolver.setSuffix(".jsp");
            return internalResourceViewResolver;
        }

        /*
        * 注册拦截器
        * */
        //1、定义一个成员变量,获取拦截器对象(变量名=类名小驼峰)
        @Resource
        private HandlerInterceptor demo1Interceptor;
        @Resource
        private HandlerInterceptor demo2Interceptor;
        //2、重写注册拦截器方法,注册拦截器
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            //添加拦截器(注册拦截器)
            InterceptorRegistration i1 = registry.addInterceptor(demo1Interceptor);
            //设置该拦截器的拦截路径
            i1.addPathPatterns("/**");

            //添加拦截器(注册拦截器)
            InterceptorRegistration i2 = registry.addInterceptor(demo2Interceptor);
            //设置该拦截器的拦截路径
            i2.addPathPatterns("/**");
        }
    }

    2.流程图

    谁先注册,谁先执行。

    ​​​​​​四.springMVC-高级-拦截器通配符设置

    通配符

    说明

    **

    任何0~多个字符 或 任意多层目录

    例如:/user/**

    /user/a/b/c/run1.action

    /user/run1.action

    *

    任何0~多个字符

    例如:/user/*

    /user/run1.action

    /user/run2.action

    ?

    任意一个字符

    例如:/user?/**

    /userA/run1.action

    /userb/run1.action

    /userc/run1.action

    总结:

    拦截器:实现HandlerInterceptor接口。

    拦截器:仅拦截控制器。

    • 预处理方法:

    在控制器执行之前执行。

    True:放行。

    False:拦截。

    • 后处理方法:

    在控制器正常执行之后。

    前提:①预处理方法返回true

    ②控制器不能抛出异常

    • 完成后方法:

    在流程都结束之后。

    前提:预处理方法返回true


    最后注意:除了SpringMvc。我还整理了最新JAVA架构项目实战教程及大厂面试题库,有兴趣的可以进裙 783802103 免费获取,没基础勿进哦!

    本文的文字及图片来源于网络加上自己的想法,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理

  • 相关阅读:
    什么是 CLR
    常用的数据结构以及算法
    Array和ArrayList的异同点
    什么是CMS?
    .NET Framework3.0答疑
    C#中的委托
    C#速成之三(Quick C#)
    C#速成之五(Quick C#)
    C#速成之四(Quick C#)
    类,对象,封装,接口,多态,继承
  • 原文地址:https://www.cnblogs.com/chengxuyuanaa/p/12930166.html
Copyright © 2011-2022 走看看