- 基于springmvc的拦截器接口 , 编写其实现类即可
package com.imooc.demo.intercepter;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
/**
* 基于spring提供的intercepter编写拦截器
* 该方式也有问题
* 1. 该方式获取不到具体牵连方法的参数值.
* 2. 通过查看源码 -> DispatcherServlet.doService() 即可获知
* 解决:
* 1. 通过spring提供的切片功能可实现. -> aspect
*/
@Component
public class MyIntercepter implements HandlerInterceptor{
/**
* 请求前
* @param request
* @param httpServletResponse
* @param handler controllerHandler对象
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse httpServletResponse, Object handler) throws Exception {
System.out.println("preHandle...");
System.out.println(((HandlerMethod)handler).getBean().getClass().getName());
System.out.println(((HandlerMethod)handler).getMethod().getName());
request.setAttribute("startTime",System.currentTimeMillis());
return true;
}
/**
* 请求后 , 无抛出异常时
* @param request
* @param httpServletResponse
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse httpServletResponse, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle...");
Long start = (Long) request.getAttribute("startTime");
System.out.println("time.." + start);
}
/**
* 请求后,无论是否抛出异常 , 均执行
* @param httpServletRequest
* @param httpServletResponse
* @param o
* @param e
* @throws Exception
* 注意: controlleradvice的执行是在该方法之前的.对exception进行处理过. 该方法接收不到该异常
* 2. 会拦截所有的controller,包括spring提供的controller , 如baseerrorcontroller 异常处理handler
*/
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("afterCompletion...");
System.out.println(e.getStackTrace());
System.out.println("end...");
}
}
- 配置文件 , 实现WebMvcConfigurerAdapter , 将拦截器添加到拦截器链中
package com.imooc.demo.intercepter.config
import com.imooc.demo.filter.MyFilter2
import com.imooc.demo.intercepter.MyIntercepter
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.web.servlet.FilterRegistrationBean
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.web.servlet.config.annotation.InterceptorRegistry
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
import java.util.ArrayList
import java.util.List
@Configuration
public class SpringmvcWebconfig extends WebMvcConfigurerAdapter{
@Autowired
private MyIntercepter myIntercepter
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myIntercepter)
}
}