SpringMVC的Interceptor拦截器

目录

  • 一、概念
  • 二、拦截器和过滤器的区别
  • 三、拦截器执行顺序
  • 四、放行静态资源

一、概念

类似于Servlet中的Filter,用于对处理器进行预处理和后处理。是AOP思想的具体应用。


@Order(1)
@Component
public class LoggerInterceptor implements HandlerInterceptor {

	final Logger logger = LoggerFactory.getLogger(getClass());
	
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		logger.info("preHandle {}...", request.getRequestURI());
		if (request.getParameter("debug") != null) {
			PrintWriter pw = response.getWriter();
			pw.write("

DEBUG MODE

"
); pw.flush(); return false; } return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { logger.info("postHandle {}.", request.getRequestURI()); if (modelAndView != null) { modelAndView.addObject("__time__", LocalDateTime.now()); } } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { logger.info("afterCompletion {}: exception = {}", request.getRequestURI(), ex);// 参数ex就是Controller方法抛出的异常(未抛出异常是null)。 } }

二、拦截器和过滤器的区别

SpringMVC的Interceptor拦截器_第1张图片
过滤器于拦截器的区别:
1.过滤器是所有请求(无论什么,包含jsp/html/css/image/js等)都会经过Filter链,然后才到DispatcherServlet
拦截器只会拦截Controller方法,jsp/html/css/image/js是不会进行拦截的,返回ModelAndView后,后续对View的渲染就脱离了Interceptor的拦截范围。拦截器比过滤器的范围小的多,但是更灵活。
2.过滤器实现 Filter接口后必然复写接口三个方法,doFilter、init和destroy方法
拦截器实现HandlerInterceptor接口后,可以一个也不复写,可以选择实现preHandle()、postHandle()和afterCompletion()方法。preHandle()是Controller方法调用前执行,postHandle()是Controller方法正常返回后执行,而afterCompletion()无论Controller方法是否抛异常都会执行( 渲染视图完毕之后执行,也就是页面渲染之后)。
3.过滤器是chain.doFilter(request, response);// 必须调用这个,调用了这个才是放行。
拦截器中的preHandle方法返回值return true;才会继续下一个拦截器才是放行,返回false就结束了。

三、拦截器执行顺序

SpringMVC的Interceptor拦截器_第2张图片
SpringMVC的Interceptor拦截器_第3张图片
注意:当第二个拦截器返回false的时候,第一个的afterCompletion还是会执行,返回false的那个拦截器会调用afterCompletion的方法处理,看源码可以知道。

四、放行静态资源

SpringMVC的Interceptor拦截器_第4张图片
SpringMVC的Interceptor拦截器_第5张图片
SpringMVC的Interceptor拦截器_第6张图片

你可能感兴趣的:(spring)