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

猜你喜欢

转载自www.cnblogs.com/Doaoao/p/10695476.html