Spring学习笔记<四> AOP 拦截器的基本实现

来源:互联网 发布:xampp1.6.8设置mysql 编辑:程序博客网 时间:2024/06/06 01:37

1.添加文件

继续在《 Spring学习笔记<三> 获取请求对象和请求头》的项目基础上再添加三个文件:

test_Interceptor.jsp文件(WebContent文件夹下面)

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>helloWorld</title></head><body>    <a href="testInterceptor">testInterceptor</a>    <br/><br/>    <a href="testSecondInterceptor">testSecondInterceptor</a>    <br/><br/></body></html>

InterceptorTest.java文件(com.shi.springmvc.interceptors包下面)

import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;@Controllerpublic class InterceptorTest {    private String SUCCESS = "success";    @RequestMapping(value = "/testInterceptor")    public String testInterceptor() {        System.out.println("testInterceptor被执行");        return SUCCESS;    }    @RequestMapping(value = "/testSecondInterceptor")    public String testSecondInterceptor() {        System.out.println("testSecondInterceptor被执行");        return SUCCESS;    }}

还有两个实现了HandlerInterceptor接口的拦截器对象,在实现的三个方法中分别打印当前方法被执行了,以方便我们查看这些方法是否执行以及执行的顺序。
FirstInterceptor.java对象文件(com.shi.springmvc.interceptors包下面)

public class FirstInterceptor implements HandlerInterceptor {    @Override    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)            throws Exception {        System.out.println("FirstInterceptor:afterCompletion被执行");    }    @Override    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,            ModelAndView modelAndView) throws Exception {        System.out.println("FirstInterceptor:postHandle被执行");    }    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)            throws Exception {        System.out.println("FirstInterceptor:preHandle被执行");        return true;    }}

SecondInterceptor.java对象文件(com.shi.springmvc.interceptors包下面)

public class SecondInterceptor implements HandlerInterceptor {    @Override    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)            throws Exception {        System.out.println("SecondInterceptor:afterCompletion被执行");    }    @Override    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,            ModelAndView modelAndView) throws Exception {        System.out.println("SecondInterceptor:postHandle被执行");    }    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)            throws Exception {        System.out.println("SecondInterceptor:preHandle被执行");        return true;    }}

2. HandlerInterceptor接口

  Spring MVC中对于一个请求可以添加多个拦截器,而这个拦截器集合中会链式调用这些拦截器。每个拦截器会执行固定顺序的方法,而这些方法就定义在HandlerInterceptor类中。这是拦截器的一个基础接口,里面有三个方法,分别是:

  • boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;

      使用时机:在处理请求之前

      应用场景:可以在该方法中放入一些初始化的操作,比如权限验证,日志管理等

      注意:该方法的返回值是boolean类型,若返回值为true,则继续调用后面的拦截器和目标方法,若返回为false,则不会调用后面的拦截器和目标方法,表示请求结束

  • void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)throws Exception;

      使用时机:在调用目标方法之后,渲染视图之前被调用。具体来说,是在调用了Controller中定义的方法之后,但在DispatcherServlet 处理视图返回渲染结果之前被调用。

      应用场景:根据使用的时机就可以知道,该方法可以对Controller处理之后ModelAndView进行操作

      注意:当有多个interceptor的时候,对于preHandler的调用顺序和postHandler的调用顺序是恰恰想法的。

      举例来说,现在有一个FirstInterceptor和一个SecondInterceptor,单独调用FirstInterceptor的三个方法的顺序为:

        FirstInterceptor.preHandle->HandlerAdapter.handle->FirstInterceptor.postHanle->DispatcherServlet.render->FirstInterceptor.afterCompletion。

      对于两个interceptor的调用顺序大致如下:

      可以总结出preHandler是先进先执行,而postHandler是先进后执行

  • void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception;

      使用时机:渲染视图之后

      应用场景:释放资源

3.然后在springmvc.xml文件中添加:

    <mvc:interceptors>        <bean class="com.shi.springmvc.interceptors.FirstInterceptor"></bean>        <mvc:interceptor>            <!-- 特定请求拦截器,只拦截path=testSecondInterceptor的请求 -->            <mvc:mapping path="/testSecondInterceptor" />            <bean class="com.shi.springmvc.interceptors.SecondInterceptor"></bean>        </mvc:interceptor>    </mvc:interceptors>

我们在配置文件配置拦截器FirstInterceptor和SecondInterceptor,并指定SecondInterceptor只对path=”/testSecondInterceptor”的请求进行拦截。

好了,看一下效果图:
效果图

最后附上demo下载地址:戳我进入

0 0
原创粉丝点击