• springmvc框架(八)——拦截器


    拦截器的概述

    1. SpringMVC框架中的拦截器用于对处理器进行预处理和后处理的技术。

    2. 可以定义拦截器链,连接器链就是将拦截器按着一定的顺序结成一条链,在访问被拦截的方法时,拦截器链 中的拦截器会按着定义的顺序执行。

    3. 拦截器和过滤器的功能比较类似,有区别 :

      1. 过滤器是Servlet规范的一部分,任何框架都可以使用过滤器技术。

      2. 拦截器是SpringMVC框架独有的。

      3. 过滤器配置了/*,可以拦截任何资源。

      4. 拦截器只会对控制器中的方法进行拦截。

    4. 拦截器也是AOP思想的一种实现方式

    5. 想要自定义拦截器,需要实现HandlerInterceptor接口。

    自定义拦截器的步骤

    1. 创建两个拦截器,实现HandlerInterceptor接口,重写需要的方法

    /**
     * 自定义拦截器1
     */
    public class MyInterceptor1 implements HandlerInterceptor {
        /**
         * 预处理,controller方法执行前
         * return true 表示放行,执行下一个拦截器,如果没有下一个拦截器,则执行controller中的方法
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("myinterception1执行了。。。前111");
            return true;
        }
    
        /**
         * 后处理方法,controller方法执行后,success.jsp之情之前
         */
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("myinterception1执行了。。。后111");
        }
    
        /**
         * success.jsp页面执行后,该方法会执行
         */
        @Override
        public void afterCompletion(HttpServletRequest request,HttpServletResponse response,Object handler,Exception ex) throws Exception{
            System.out.println("myinterception1执行了。。。最后111");
        }
    
    }
    
    ===================================
    
    /**
     * 自定义拦截器2
     */
    public class MyInterceptor2 implements HandlerInterceptor {
    
        /**
         * 预处理,controller方法执行前
         * return true 表示放行,执行下一个拦截器,如果没有下一个拦截器,则执行controller中的方法
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("myinterception2执行了。。。前222");
            return true;
        }
    
        /**
         * 后处理方法,controller方法执行后,success.jsp之情之前
         */
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("myinterception2执行了。。。后222");
        }
    
        /**
         * success.jsp页面执行后,该方法会执行
         */
        @Override
        public void afterCompletion(HttpServletRequest request,HttpServletResponse response,Object handler,Exception ex) throws Exception{
            System.out.println("myinterception2执行了。。。最后222");
        }
    }
    View Code

    2. 在springmvc.xml中配置拦截器类

        <!--配置拦截器-->
        <mvc:interceptors>
            <!--配置第一个拦截器-->
                <mvc:interceptor>
                <!--要拦截的具体的方法-->
                <mvc:mapping path="/user/*"/>
                <!--不要拦截的方法
                <mvc:exclude-mapping path=""/> -->
                <!--配置拦截器对象-->
                <bean class="com.churujianghudezai.interceptor.MyInterceptor1"/>
            </mvc:interceptor>
            <!--配置第二个拦截器-->
            <mvc:interceptor>
                <!--要拦截的具体的方法-->
                <mvc:mapping path="/**"/>
                <!--不要拦截的方法 <mvc:exclude-mapping path=""/> -->
                <!--配置拦截器对象-->
                <bean class="com.churujianghudezai.interceptor.MyInterceptor2"/>
            </mvc:interceptor>
        </mvc:interceptors>

    注意:这里加粗的语句表示拦截器2是对所有控制器及方法进行拦截,path一定要写成 /**,少一个*都会报错!!!

    3. 编写控制器

    @Controller
    @RequestMapping("/user")
    public class UserController {
    
        @RequestMapping("/testInterceptor")
        public String testInterceptor(){
            System.out.println("testInterceptor执行了...");
            return "success";
        }
    
    }

    4. 两个页面代码:

    index.jsp
    
    <body>
        <h3>拦截器</h3>
        <a href="user/testInterceptor" >拦截器</a>
    </body>
    
    ================================
    
    success.jsp
    
    <body>
        执行成功!
        <% System.out.println("success.jsp执行了..."); %>
    </body>

    运行结果:

     

    后台显示:

     

    知识点说明:

    HandlerInterceptor接口中的方法 :

    1. preHandle方法是controller方法执行前拦截的方法

      1. 可以使用request或者response跳转到指定的页面

      2. return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法。

      3. return false不放行,不会执行controller中的方法。

    2. postHandle是controller方法执行后执行的方法,在JSP视图执行前。

      1. 可以使用request或者response跳转到指定的页面

      2. 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。

    3. postHandle方法是在JSP执行后执行

      1. request或者response不能再跳转页面了

    多个拦截器的执行顺序:

    多个拦截器是按照配置的顺序决定的。

  • 相关阅读:
    s2-032批量脚本
    javascript 1
    threading模块和queue模块实现程序并发功能和消息队列
    Python标准库06 子进程 (subprocess包)
    常用服务对应的正则
    re
    requests
    198. 打家劫舍
    746. 使用最小花费爬楼梯
    70. 爬楼梯
  • 原文地址:https://www.cnblogs.com/churujianghudezai/p/12390717.html
Copyright © 2020-2023  润新知