springMVC-拦截器-前篇-2

请求到达前端控制器,前端控制器先执行拦截器的preHandle方法,如果不想请求继续往下执行可以做处理。否则继续执行Controller的相关方法,等Controller的相关方法执行完后再执行拦截器的postHandle,最后会去执行afterCompletion。

后端控制器方法执行之前,先执行拦截器preHandle(),后端控制器方法执行结束之后,执行的是拦截器的postHandle(),当前端控制器解析控制层返回的ModelandView并交给视图解析器渲染解析完成后,才会执行拦截器的afterCompletion()方法。

自定义注解
/spring-mvc-v2/src/main/java/com/in/annotation/TimeMonitor.java

package  com.in.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)//定义注解运行时有效
@Target(ElementType.METHOD)//target用于描述注解修饰方法
public @interface TimeMonitor {

}

配置拦截器的重点部分











    
    
    
    
    
    
        
        
    
    
    
        
            
            
            
            
            
            
        
    

package com.in.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.in.annotation.TimeMonitor;



@Controller
@RequestMapping("/")

public class InterceptorController {
    @RequestMapping("doSomeThing")
    @ResponseBody
    @TimeMonitor
    public String doSomeThing() {
        System.out.println("InterceptorController.doSomeThing()");
        // 获取方法执行时长
        String result = "do some thing";
        try {
            Thread.sleep(500);
        } catch (Exception e) {
        }
        return result;
    }

    @RequestMapping("doStudyInterceptor")
    @ResponseBody
    public String doStudyInterceptor() {
        System.out.println("InterceptorController.doStudyInterceptor()");
        // 获取方法执行时长
        String result = "do study Interceptor";
        try {
            Thread.sleep(600);
        } catch (Exception e) {
        }
        return result;
    }
    @RequestMapping("doStudyMVC")
    @ResponseBody
    public String doStudyMVC(){
        System.out.println("InterceptorController.doStudyMVC()");
        String result = "do study MVC";
        try {
            Thread.sleep(700);
        } catch (Exception e) {
        }
        return result;
    }
}

package com.in.interceptor;

import java.lang.reflect.Method;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import com.in.annotation.TimeMonitor;

/**
 * 拦截器的编写:是实现HandlerInterceptor接口或继承HandlerInterceptorAdapter 继承适配器只需要实现一部分功能
 * 拦截器的配置 1)xml方式(spring-config.xml) 2)基于annotation方式
 */
public class TimeInterceptor implements HandlerInterceptor {

    public TimeInterceptor() {
        System.out.println("TimeInterceptor.TimeInterceptor()");
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println("TimeInterceptor.preHandle()");
        long startTime = System.currentTimeMillis();
        HandlerMethod hMethod = (HandlerMethod) handler;
        TimeMonitor timeMonitor = hMethod.getMethodAnnotation(TimeMonitor.class);
        if (timeMonitor != null) {
            // 没有共享就没有伤害
            request.setAttribute("startTime", startTime);
        }

        return true;// false表示拦截。true表示放行
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("TimeInterceptor.postHandle()");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("TimeInterceptor.afterCompletion()");

        System.out.println(handler.getClass().getName());
        // 将handler向下转型(目的获取方法信息)
        if (handler instanceof HandlerMethod) {
            // 将handler向下转型-获取方法相关信息
            HandlerMethod hMethod = (HandlerMethod) handler;
            TimeMonitor timeMonitor = hMethod.getMethodAnnotation(TimeMonitor.class);
            if (timeMonitor != null) {
                // 没有共享就没有伤害
                long endTime = System.currentTimeMillis();
                long startTime = (Long) request.getAttribute("startTime");
                long totalTime = endTime - startTime;
                // 获取方法对象
                Method method = hMethod.getMethod();
                // 获取执行方法所在的类的信息
                String beanCls = hMethod.getBeanType().getName();
                System.out.println(beanCls + "." + method.getName() + "()" + "总时长" + totalTime);
            }

        }

    }

}

http://localhost/spring-mvc-v2/doSomeThing.do

TimeInterceptor.preHandle()
InterceptorController.doSomeThing()
TimeInterceptor.postHandle()
TimeInterceptor.afterCompletion()
org.springframework.web.method.HandlerMethod
com.in.controller.InterceptorController.doSomeThing()总时长501

http://localhost/spring-mvc-v2/doStudyMVC.do

TimeInterceptor.preHandle()
InterceptorController.doStudyMVC()
TimeInterceptor.postHandle()
TimeInterceptor.afterCompletion()
org.springframework.web.method.HandlerMethod

http://localhost/spring-mvc-v2/doStudyInterceptor.do

InterceptorController.doStudyInterceptor()

你可能感兴趣的:(springMVC-拦截器-前篇-2)