Spring中的拦截器
Spring MVC中的拦截器都是实现了HandlerInterceptor这个接口,接口中存在三个方法:
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; // 在请求找到对应的HandlerMapping之后,调用Handler方法之前执行
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception;// Handler方法完成后,渲染视图之前执行
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;// 视图渲染完成后,请求返回给客户端之前执行
创建一个拦截器
创建一个类继承org.springframework.web.servlet.handler.HandlerInterceptorAdapter该抽象类,根据自己的需要实现其中的方法
public class RoleInterceptor extends HandlerInterceptorAdapter { private static Logger logger = Logger.getLogger(RoleInterceptor.class); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { logger.info("RoleInterceptor preHandle..."); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { logger.info("RoleInterceptor postHandle..."); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { logger.info("RoleInterceptor afterCompletion..."); } }
Java Config方式
@Configuration @EnableWebMvc @ComponentScan("jackaroo.web") public class WebConfig extends WebMvcConfigurerAdapter { ... @Override public void addInterceptors(InterceptorRegistry registry) { // 添加拦截器并且配置匹配的拦截URI registry.addInterceptor(new RoleInterceptor()).addPathPatterns("/role/*"); } }
XML方式配置
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/role/*"/> <bean class="jackaroo.web.interceptor.RoleInterceptor"/> </mvc:interceptor> </mvc:interceptors>
注意:如果对于一个请求有多个拦截器拦截到该请求,那么会根据拦截器注册的顺序执行拦截器中的方法。当其中一个拦截器的preHandle方法返回false,那么后面的拦截器的preHandle都不会运行,并且控制器和所有拦截器的后置方法都不会执行。但是,执行过preHandle方法并且返回true的拦截器的afterCompletion方法会运行。