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方法會運行。