• 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

  • 相关阅读:
    Drcom账户管理Server端解说
    Hadoop常见异常及其解决方式
    PHP 获取网络接口文件流
    【刷题小记67】三角形面积
    Tiny语言编译器简单介绍
    矩阵十题【六】 poj3070 Fibonacci
    函数名称
    设计模式--6大原则--开闭原则
    LeetCode96:Unique Binary Search Trees
    [Swift]LeetCode958. 二叉树的完全性检验 | Check Completeness of a Binary Tree
  • 原文地址:https://www.cnblogs.com/Doaoao/p/10695476.html
Copyright © 2020-2023  润新知