Spring攔截器(Interceptor)

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該抽象類,根據自己的需要實現其中的方法

  1. 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...");
       }
    }
  2. 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/*");
       }
    }
  3. 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方法會運行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章