中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringMVC攔截器怎么掌握

發布時間:2022-08-25 17:57:56 來源:億速云 閱讀:177 作者:iii 欄目:開發技術

這篇文章主要介紹“SpringMVC攔截器怎么掌握”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“SpringMVC攔截器怎么掌握”文章能幫助大家解決問題。

攔截器參數

前置處理方法

原始方法之前運行preHandle

public boolean preHandle(HttpServletRequest request,
                         HttpServletResponse response,
                         Object handler) throws Exception {
    System.out.println("preHandle");
    return true;
}
  • request:請求對象

  • response:響應對象

  • handler:被調用的處理器對象,本質上是一個方法對象,對反射中的Method對象進行了再包裝

使用request對象可以獲取請求數據中的內容,如獲取請求頭的Content-Type

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    String contentType = request.getHeader("Content-Type");
    System.out.println("preHandle..."+contentType);
    return true;
}

使用handler參數,可以獲取方法的相關信息

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    HandlerMethod hm = (HandlerMethod)handler;
    String methodName = hm.getMethod().getName();//可以獲取方法的名稱
    System.out.println("preHandle..."+methodName);
    return true;
}

后置處理方法

原始方法運行后運行,如果原始方法被攔截,則不執行

public void postHandle(HttpServletRequest request,
                       HttpServletResponse response,
                       Object handler,
                       ModelAndView modelAndView) throws Exception {
    System.out.println("postHandle");
}

前三個參數和上面的是一致的。

modelAndView:如果處理器執行完成具有返回結果,可以讀取到對應數據與頁面信息,并進行調整

因為咱們現在都是返回json數據,所以該參數的使用率不高。

完成處理方法

攔截器最后執行的方法,無論原始方法是否執行

public void afterCompletion(HttpServletRequest request,
                            HttpServletResponse response,
                            Object handler,
                            Exception ex) throws Exception {
    System.out.println("afterCompletion");
}

前三個參數與上面的是一致的。

ex:如果處理器執行過程中出現異常對象,可以針對異常情況進行單獨處理

因為我們現在已經有全局異常處理器類,所以該參數的使用率也不高。

這三個方法中,最常用的是preHandle,在這個方法中可以通過返回值來決定是否要進行放行,我們可以把業務邏輯放在該方法中,如果滿足業務則返回true放行,不滿足則返回false攔截。

攔截器鏈配置

目前,我們在項目中只添加了一個攔截器,如果有多個,該如何配置?配置多個后,執行順序是什么?

配置多個攔截器

創建攔截器類

實現接口,并重寫接口中的方法

@Component
public class ProjectInterceptor2 implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle...222");
        return false;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle...222");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion...222");
    }
}
配置攔截器類
@Configuration
@ComponentScan({"com.nefu.controller"})
@EnableWebMvc
//實現WebMvcConfigurer接口可以簡化開發,但具有一定的侵入性
public class SpringMvcConfig implements WebMvcConfigurer {
    @Autowired
    private ProjectInterceptor projectInterceptor;
    @Autowired
    private ProjectInterceptor2 projectInterceptor2;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //配置多攔截器
        registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");
        registry.addInterceptor(projectInterceptor2).addPathPatterns("/books","/books/*");
    }
}

然后我們運行程序,觀察順序:

SpringMVC攔截器怎么掌握

攔截器執行的順序是和配置順序有關。就和前面所提到的運維人員進入機房的案例,先進后出。

  • 當配置多個攔截器時,形成攔截器鏈

  • 攔截器鏈的運行順序參照攔截器添加順序為準

  • 當攔截器中出現對原始處理器的攔截,后面的攔截器均終止運行

  • 當攔截器運行中斷,僅運行配置在前面的攔截器的afterCompletion操作

SpringMVC攔截器怎么掌握

preHandle:與配置順序相同,必定運行

postHandle:與配置順序相反,可能不運行

afterCompletion:與配置順序相反,可能不運行。

這個順序不太好記,最終只需要把握住一個原則即可:以最終的運行結果為準

關于“SpringMVC攔截器怎么掌握”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

武安市| 秀山| 铁力市| 元江| 仙居县| 盐源县| 临沧市| 绵阳市| 萨嘎县| 南丰县| 杭锦后旗| 霍州市| 科技| 阿图什市| 榆树市| 天气| 永州市| 凉城县| 若羌县| 炎陵县| 晋州市| 怀集县| 房产| 肇州县| 湘阴县| 安岳县| 汤阴县| 龙门县| 锦屏县| 丁青县| 嫩江县| 嘉禾县| 浦县| 睢宁县| 额济纳旗| 贵州省| 遂宁市| 信丰县| 金湖县| 开封县| 三原县|