最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring攔截器之HandlerInterceptor使用方式

 更新時間:2024年08月21日 15:09:13   作者:?abc!  
這篇文章主要介紹了Spring攔截器之HandlerInterceptor使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

概述

有時候我們需要進(jìn)行一些預(yù)處理后處理,或者是攔截請求,在請求前后后做一些處理

使用Spring MVC框架,那么建議使用HandlerInterceptor,它可以類似于普通bean直接注冊到Spring容器中被管理

HandlerInterceptor的三個抽象方法

public interface HandlerInterceptor {
    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }

    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }

    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }
}

preHandle

在執(zhí)行Handler之前(執(zhí)行業(yè)務(wù)邏輯之前),根據(jù)攔截器鏈順序執(zhí)行

  • 每個Interceptor 的調(diào)用會依據(jù)它的聲明順序依次執(zhí)行,而且最先執(zhí)行的都是Interceptor 中的preHandle 方法
  • 所以可以在這個方法中進(jìn)行一些前置初始化操作或者是對當(dāng)前請求的一個預(yù)處理
  • 也可以在這個方法中進(jìn)行一些判斷來決定請求是否要繼續(xù)進(jìn)行下去

該方法的返回值是布爾值Boolean 類型的,

  • 當(dāng)它返回為false 時,表示請求結(jié)束,后續(xù)的Interceptor 和Controller 都不會再執(zhí)行;
  • 當(dāng)返回值為true 時就會繼續(xù)調(diào)用下一個Interceptor 的preHandle 方法,如果已經(jīng)是最后一個Interceptor 的時候就會是調(diào)用當(dāng)前請求的Controller 方法。

postHandle

在執(zhí)行Handler成功(執(zhí)行業(yè)務(wù)邏輯成功)之后,根據(jù)攔截器鏈倒序執(zhí)行,如果前面的流程中拋出異?;蛘哒埱蟊粩r截則不會執(zhí)行!

  • 在當(dāng)前所屬的Interceptor 的preHandle 方法的返回值為true 時才能被調(diào)用
  • 在當(dāng)前請求進(jìn)行處理之后,也就是Controller 方法調(diào)用之后執(zhí)行,但是它會在DispatcherServlet 進(jìn)行視圖返回渲染之前被調(diào)用,
  • 所以我們可以在這個方法中對Controller 處理之后的ModelAndView 對象進(jìn)行操作
  • postHandle 方法被調(diào)用的方向跟preHandle 是相反的,也就是說先聲明的Interceptor 的postHandle 方法反而會后執(zhí)行

afterCompletion

在請求處理完畢之后執(zhí)行,無論是否有響應(yīng)視圖,無論有沒有通過preHandle,無論有沒有拋出異常。

只會對此前放行成功(preHandle返回true)的攔截器進(jìn)行倒序調(diào)用。

  • 在當(dāng)前所屬的Interceptor 的preHandle 方法的返回值為true 時才能被調(diào)用
  • 該方法將在整個請求結(jié)束之后,也就是在DispatcherServlet 渲染了對應(yīng)的視圖之后執(zhí)行。
  • 這個方法的主要作用是用于進(jìn)行資源清理工作的

使用

構(gòu)建攔截器(HandlerInterceptor )

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import com.gildata.gup.domain.User;
import com.gildata.gup.domain.UserEncryptReset;
import com.gildata.gup.repository.UserEncryptResetRepository;

@Component // 不可少
public class xxxStateInterceptor implements HandlerInterceptor { // 必須實(shí)現(xiàn)HandlerInterceptor接口

    
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // TODO Auto-generated method stub
        // ....
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // TODO Auto-generated method stub
        return;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // TODO Auto-generated method stub
    }
}

注冊攔截器(WebMvcConfigurerAdapter )

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import com.gildata.gup.interceptor.PasswordStateInterceptor;

@Configuration // 配置
public class WebConfigfilter extends WebMvcConfigurerAdapter{
    
    @Autowired
    private XxxStateInterceptor xxxStateInterceptor ; // 實(shí)例化攔截器

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // super.addInterceptors(registry);
        // 注冊自定義的攔截器passwordStateInterceptor
        registry.addInterceptor(xxxStateInterceptor)
            .addPathPatterns("/api/*") //匹配要過濾的路徑
            .excludePathPatterns("/api/changeUser/*") //匹配不過濾的路徑。/api/changeUser后面的所有接口不能攔截
            .excludePathPatterns("/api/getAge", "/api/getName") // /api/getAge也不能攔截,/api/getName這個接口的請求不能攔截
    }
}

兩個常用方法:

  • .addPathPatterns():增加url的攔截路徑,“/**”意思是所有請求都要攔截;
  • .excludePathPatterns():排除url的攔截路徑,如:“/api/getAge”, “/api/getName”:意為這兩個接口不做攔截;

注意

springBoot2.0以上 WebMvcConfigurerAdapter 方法過時,有兩種替代方案:

  • 繼承 WebMvcConfigurationSupport 類;
  • 實(shí)現(xiàn) WebMvcConfigurer 接口;

但是,繼承WebMvcConfigurationSupport會讓Spring-boot對mvc的自動配置失效,所以 建議用實(shí)現(xiàn)WebMvcConfigurer接口的方式 。

所以上面的注冊攔截器更改為:

@Configuration // 配置
public class WebConfigfilter implements WebMvcConfigurer{
    
    @Autowired
    private XxxStateInterceptor xxxStateInterceptor ; // 實(shí)例化攔截器

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // super.addInterceptors(registry);
        // 注冊自定義的攔截器passwordStateInterceptor
        registry.addInterceptor(xxxStateInterceptor)
            .addPathPatterns("/api/*") //匹配要過濾的路徑
            .excludePathPatterns("/api/changeUser/*") //匹配不過濾的路徑。/api/changeUser后面的所有接口不能攔截
            .excludePathPatterns("/api/getAge", "/api/getName") // /api/getAge也不能攔截,/api/getName這個接口的請求不能攔截
    }
}

總結(jié)

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中的OkHttpClient 工具類

    Java中的OkHttpClient 工具類

    這篇文章主要介紹了Java中的OkHttpClient工具類,具有很好的參考價值,希望杜大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Java ExecutorService四種線程池使用詳解

    Java ExecutorService四種線程池使用詳解

    這篇文章主要介紹了Java ExecutorService四種線程池使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • Java實(shí)現(xiàn)順時針輸出螺旋二維數(shù)組的方法示例

    Java實(shí)現(xiàn)順時針輸出螺旋二維數(shù)組的方法示例

    這篇文章主要介紹了利用Java如何實(shí)現(xiàn)順時針輸出螺旋二維數(shù)組的方法示例,文中給出了詳細(xì)的示例代碼和注釋,相信對大家具有一定的參考價值,有需要的朋友們下面來一起看看吧。
    2017-02-02
  • 一小時迅速入門Mybatis之實(shí)體類別名與多參數(shù) 動態(tài)SQL

    一小時迅速入門Mybatis之實(shí)體類別名與多參數(shù) 動態(tài)SQL

    這篇文章主要介紹了一小時迅速入門Mybatis之實(shí)體類別名與多參數(shù) 動態(tài)SQL,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • Java微服務(wù)開發(fā)之Swagger詳解

    Java微服務(wù)開發(fā)之Swagger詳解

    Swagger 是一個規(guī)范和完整的框架,用于生成、描述、調(diào)用和可視化 RESTful 風(fēng)格的 Web 服務(wù)??傮w目標(biāo)是使客戶端和文件系統(tǒng)作為服務(wù)器以同樣的速度來更新。文件的方法,參數(shù)和模型緊密集成到服務(wù)器端的代碼,允許API來始終保持同步
    2021-10-10
  • mybatis插入與批量插入返回ID的原理詳解

    mybatis插入與批量插入返回ID的原理詳解

    這篇文章主要給大家介紹了關(guān)于mybatis插入與批量插入返回ID的原理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用mybatis具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • java基礎(chǔ)之標(biāo)簽、按鈕和按鈕事件簡介

    java基礎(chǔ)之標(biāo)簽、按鈕和按鈕事件簡介

    本文給大家?guī)淼氖莏ava圖形界面的基礎(chǔ)知識,簡單介紹了標(biāo)簽、按鈕和按鈕事件,十分的詳細(xì),有需要的小伙伴可以參考下。
    2015-06-06
  • GSON實(shí)現(xiàn)Java對象的JSON序列化與反序列化的實(shí)例教程

    GSON實(shí)現(xiàn)Java對象的JSON序列化與反序列化的實(shí)例教程

    GSON是Google開發(fā)并開源的一個Java的JSON轉(zhuǎn)換庫,這里我們將來講解GSON實(shí)現(xiàn)Java對象的JSON序列化與反序列化的實(shí)例教程,需要的朋友可以參考下
    2016-06-06
  • springBoot啟動報錯log4j沖突的解決方案

    springBoot啟動報錯log4j沖突的解決方案

    這篇文章主要介紹了springBoot啟動報錯log4j沖突的解決方案,具有很好的參考價值,希望對大家有所幫助。
    2021-07-07
  • Java并發(fā)編程Callable與Future的應(yīng)用實(shí)例代碼

    Java并發(fā)編程Callable與Future的應(yīng)用實(shí)例代碼

    這篇文章主要介紹了Java并發(fā)編程Callable與Future的應(yīng)用實(shí)例代碼,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01

最新評論

怀集县| 石门县| 钟山县| 多伦县| 泾阳县| 古浪县| 天峨县| 北碚区| 漳州市| 平原县| 平安县| 娄烦县| 哈尔滨市| 原平市| 浏阳市| 梧州市| 宽城| 兰溪市| 敦煌市| 垣曲县| 同心县| 襄樊市| 嘉定区| 称多县| 乐业县| 淮安市| 湖州市| 兴业县| 汝阳县| 巨野县| 开平市| 乳源| 达尔| 尤溪县| 绥芬河市| 毕节市| 民权县| 全南县| 亚东县| 金沙县| 金秀|