Spring MVC拦截器:
HandlerInterceptor,HandlerInterceptorAdapter
二者差别不是太大,HandlerInterceptorAdapter是一个抽象类,里面有对HandlerInterceptor空实现,方便调用者有选择的实现相应的方法。
此拦截器能做到比filter更小粒度的拦截,能否在Spring MVC Controller执行前,执行后,View渲染完之后dosomething。
HandlerInterceptor
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception;
此方法在Controller执行前被调用:可以进行编码、安全控制等处理。
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView);
此方法在Controller执行后被调用:有机会修改ModelAndView。
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex);
此方法在View被渲染结束后被调用:可以根据ex是否为null判断是否发生了异常,进行日志记录。
HandlerInterceptorAdapter
包含HandlerInterceptor接口里的三个方法的空实现
同时还有HandlerInterceptor接口的空实现方法:
afterConcurrentHandlingStarted(),用于Controller中执行异步方法后调用(目前没有发现是这种用途)
public void afterConcurrentHandlingStarted(
HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
}
Demo
HomePageHandlerInterceptorAdapter.java
public class HomePageHandlerInterceptorAdapter extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("==============HomePageHandlerInterceptorAdapter.preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("==============HomePageHandlerInterceptorAdapter.postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("==============HomePageHandlerInterceptorAdapter.afterCompletion");
}
@Override
public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("==============HomePageHandlerInterceptorAdapter.afterConcurrentHandlingStarted");
}
}
HomePageHandlerInteceptor.java
public class HomePageHandlerInteceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.println("==============HomePageHandlerInteceptor.preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("==============HomePageHandlerInteceptor.postHandle");
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("==============HomePageHandlerInteceptor.afterCompletion");
}
}
WebMvcConfig.java
@Configuration
@EnableWebMvc
@ComponentScan("study.book.springinaction")
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
HomePageHandlerInteceptor homePageHandlerInteceptor = new HomePageHandlerInteceptor();
HomePageHandlerInterceptorAdapter homePageHandlerInterceptorAdapter = new HomePageHandlerInterceptorAdapter();
registry.addInterceptor(homePageHandlerInteceptor).addPathPatterns("/home");
registry.addInterceptor(homePageHandlerInterceptorAdapter).addPathPatterns("/home");
}
...其他代码...
}
home.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%>
<%@ page isELIgnored="false" %>
<% System.out.println("=======>home.jsp loaded");%>
HomeController.java
......
@RequestMapping(value = "/home", method = RequestMethod.GET)
public String homePage(Model model){
model.addAttribute("homekey","主页");
System.out.println(Thread.currentThread().getName()+"=========> access home page");
model.addAttribute("index", index++);
Runnable run = new Runnable() {
@Override
public void run() {
try {
TimeUnit.SECONDS.sleep(3);
System.out.println(Thread.currentThread().getName()+"========>thread executed<===========");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
ExecutorService service = Executors.newFixedThreadPool(3);
service.execute(run);
service.shutdown();
return "home";
}
......
控制台显示
==============HomePageHandlerInteceptor.preHandle
==============HomePageHandlerInterceptorAdapter.preHandle
http-nio-8085-exec-1=========> access home page
==============HomePageHandlerInterceptorAdapter.postHandle
==============HomePageHandlerInteceptor.postHandle
=======>home.jsp loaded
==============HomePageHandlerInterceptorAdapter.afterCompletion
==============HomePageHandlerInteceptor.afterCompletion
pool-1-thread-1========>thread executed<===========