zoukankan      html  css  js  c++  java
  • SpringMVC_拦截器 interceptor

    一:拦截器

    拦截器是SpringMvc中提供的一种于 Filter 类似的过滤器技术,但拦截器智能拦截Controller的请求,而Filter 可以过滤所有的请求

    创建一个拦截器

    1:创建一个普通类,实现HandlerInterceptor接口

    package com.doaoao.interceptor;
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    public class MyInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("执行拦截器中的parHandle方法");
            return true;
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("执行拦截器中的postHandler方法");
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("执行拦截器中的afterCompletion方法");
        }
    }

    2:配置springmvc.xml中的内容,/** 表示拦截所有的Controller

        <!--注册拦截器-->
        <mvc:interceptors>
            <mvc:interceptor>
                <mvc:mapping path="/**"/>
                <bean class="com.doaoao.interceptor.MyInterceptor"/>
            </mvc:interceptor>
        </mvc:interceptors>

    3:创建一个测试用的 controller 

    package com.doaoao.interceptor;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.ModelAndView;
    @Controller
    public class testController {
        @RequestMapping("/test.do")
        public ModelAndView test(){
            ModelAndView mv = new ModelAndView();
            System.out.println("执行 test 方法");
         mv.serViewName("result")
    return mv; } }

    # 当执行后后输出:

    执行拦截器中的preHandle方法
    执行test方法
    执行拦截器中的postHandle方法
    执行拦截器中的afterCompletion方法

    # 拦截器中的执行顺序

    浏览器 -> preHandle -> handler -> postHandle -> acterCompletion -> 浏览器

     ...

    二:多个拦截器

    定义多个拦截器与上方方法一样,先定义一个类实现接口 HandlerInterceptor,再在配置文中注册拦截器(注册在前的拦截器会优先执行)

    1:定义第二个拦截器

    public class MyInterceptor2 implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("执行拦截器2中的parHandle方法");
            return true;
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("执行拦截器2中的postHandler方法");
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("执行拦截器2中的afterCompletion方法");
        }
    }

    2:在配置文件springmvc.xml中注册拦截器

        <!--注册拦截器1-->
        <mvc:interceptors>
            <mvc:interceptor>
                <mvc:mapping path="/**"/>
                <bean class="com.doaoao.interceptor.MyInterceptor"/>
            </mvc:interceptor>
        </mvc:interceptors>
        
        <!--注册拦截器2-->
        <mvc:interceptors>
            <mvc:interceptor>
                <mvc:mapping path="/**"/>
                <bean class="com.doaoao.interceptor.MyInterceptor2"/>
            </mvc:interceptor>
        </mvc:interceptors>

     # 执行后的输出

    执行拦截器中的preHandle方法
    执行拦截器2中的preHandle方法
    执行test方法
    执行拦截器2中的postHandle方法
    执行拦截器中的postHandle方法
    执行拦截器2中的afterCompletion方法
    执行拦截器中的afterCompletion方法

     # 多个拦截器的执行顺序

    浏览器 -> preHandler(拦截器1) -> preHandler(拦截器2) -> handler -> postHandle(拦截器2) -> postHandle(拦截器1) -> afterCompletion1 -> afterCompletion2->浏览器

     ...

    本笔记参考自:小猴子老师教程 http://www.monkey1024.com

  • 相关阅读:
    关于清除浮动的最佳方法
    Bootstrap学习——栅格系统
    人工智能、机器学习和深度学习之间的区别与联系
    speech
    爬虫—启新宝接口函数
    爬虫—天眼查接口函数
    python链接mysql获得某列最大值
    获取指定路径下特定后缀的文件
    python读Excel
    DataTable 递归 简单的程序,来实现无限级列表 结合 jquery.table.js 实现
  • 原文地址:https://www.cnblogs.com/Doaoao/p/10695476.html
Copyright © 2011-2022 走看看