HandlerInterceptor接口简介
在SpringMVC中使用自拦截器时需要实现HandlerInterceptor接口,该接口有三个方法:preHandle,postHandle,afterCompletion。一个工程中可以配置多个拦截器,这些拦截器按照先后顺序添加到配置中后就形成了Interceptor chain。执行顺序:Interceptor1.preHandle->Interceptor2.preHandle->HandlerAdaptor->Interceptor2.postHandle->Interceptor1.postHandle->渲染View->Interceptor2.afterCompletion->Interceptor1.afterCompletion。其中HandlerAdapter负责处理请求并返回数据和视图。注意以上执行顺序是preHandle都返回true的情况,当Interceptor2.preHandle返回false时则直接跳到Interceptor1.afterCompletion,即前一个拦截器的afterCompletion。
另外,如果不是需要实现HandlerInterceptor的三个接口时,可以使用HandlerInterceptorAdaptor接口。在该接口中可以只指定单个方法的实现。
实现代码
自定义拦截器:
public class MyInterceptor implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("after");
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("post");
}
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("pre");
return true;
}
}
public class MyInterceptor implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("after");
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("post");
}
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("pre");
return true;
}
}
拦截器配置:
在继承于WebMvcConfigurerAdapter的子类WebConfig(自己的类)中重写addInterceptors方法。
@Override
public void addInterceptors(InterceptorRegistry registry) {
// TODO Auto-generated method stub
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/mvc/*");
}