欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring攔截器之HandlerInterceptor使用方式

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

概述

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

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

HandlerInterceptor的三個(gè)抽象方法

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í)行

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

該方法的返回值是布爾值Boolean 類(lèi)型的,

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

postHandle

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

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

afterCompletion

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

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

  • 在當(dāng)前所屬的Interceptor 的preHandle 方法的返回值為true 時(shí)才能被調(diào)用
  • 該方法將在整個(gè)請(qǐng)求結(jié)束之后,也就是在DispatcherServlet 渲染了對(duì)應(yīng)的視圖之后執(zhí)行。
  • 這個(gè)方法的主要作用是用于進(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
    }
}

注冊(cè)攔截器(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);
        // 注冊(cè)自定義的攔截器passwordStateInterceptor
        registry.addInterceptor(xxxStateInterceptor)
            .addPathPatterns("/api/*") //匹配要過(guò)濾的路徑
            .excludePathPatterns("/api/changeUser/*") //匹配不過(guò)濾的路徑。/api/changeUser后面的所有接口不能攔截
            .excludePathPatterns("/api/getAge", "/api/getName") // /api/getAge也不能攔截,/api/getName這個(gè)接口的請(qǐng)求不能攔截
    }
}

兩個(gè)常用方法:

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

注意

springBoot2.0以上 WebMvcConfigurerAdapter 方法過(guò)時(shí),有兩種替代方案:

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

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

所以上面的注冊(cè)攔截器更改為:

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

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

總結(jié)

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

相關(guān)文章

  • 基于JWT的spring boot權(quán)限驗(yàn)證技術(shù)實(shí)現(xiàn)教程

    基于JWT的spring boot權(quán)限驗(yàn)證技術(shù)實(shí)現(xiàn)教程

    這篇文章主要給大家介紹了關(guān)于基于JWT的spring boot權(quán)限驗(yàn)證技術(shù)實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Java中JDBC連接數(shù)據(jù)庫(kù)詳解

    Java中JDBC連接數(shù)據(jù)庫(kù)詳解

    本文主要介紹了JDBC連接數(shù)據(jù)庫(kù)的相關(guān)知識(shí),具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-03-03
  • 使用Java 壓縮文件打包tar.gz 包的詳細(xì)教程

    使用Java 壓縮文件打包tar.gz 包的詳細(xì)教程

    本文帶領(lǐng)大家學(xué)習(xí)如何使用Java 壓縮文件打包tar.gz 包,主要通過(guò) Apache compress 工具打包,通過(guò)示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • 實(shí)例解析JAVA中代碼的加載順序

    實(shí)例解析JAVA中代碼的加載順序

    這篇文章主要介紹了舉例說(shuō)明Java中代碼塊的執(zhí)行順序,需要的朋友可以參考下
    2017-04-04
  • springboot+angular4前后端分離 跨域問(wèn)題解決詳解

    springboot+angular4前后端分離 跨域問(wèn)題解決詳解

    這篇文章主要介紹了springboot+angular4前后端分離 跨域問(wèn)題解決詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Mybatis-Plus可能導(dǎo)致死鎖的問(wèn)題分析及解決辦法

    Mybatis-Plus可能導(dǎo)致死鎖的問(wèn)題分析及解決辦法

    這篇文章給大家主要介紹了Mybatis-Plus可能導(dǎo)致死鎖的問(wèn)題分析及解決辦法,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-12-12
  • Spring Boot整合MyBatis-Plus實(shí)現(xiàn)CRUD操作的示例代碼

    Spring Boot整合MyBatis-Plus實(shí)現(xiàn)CRUD操作的示例代碼

    本文主要介紹了Spring Boot整合MyBatis-Plus實(shí)現(xiàn)CRUD操作,可以快速實(shí)現(xiàn)數(shù)據(jù)庫(kù)的增刪改查操作,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • MyBatis的五種批量查詢實(shí)例總結(jié)

    MyBatis的五種批量查詢實(shí)例總結(jié)

    為了提高代碼的執(zhí)行效率,我們有時(shí)需要采用批量查詢的查詢方法,下面這篇文章主要給大家介紹了關(guān)于MyBatis的五種批量查詢的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • Java模擬棧和隊(duì)列數(shù)據(jù)結(jié)構(gòu)的基本示例講解

    Java模擬棧和隊(duì)列數(shù)據(jù)結(jié)構(gòu)的基本示例講解

    這篇文章主要介紹了Java模擬棧和隊(duì)列數(shù)據(jù)結(jié)構(gòu)的基本示例,棧的后進(jìn)先出和隊(duì)列的先進(jìn)先出是數(shù)據(jù)結(jié)構(gòu)中最基礎(chǔ)的知識(shí),本文則又對(duì)Java實(shí)現(xiàn)棧和隊(duì)列結(jié)構(gòu)的方法進(jìn)行了細(xì)分,需要的朋友可以參考下
    2016-04-04
  • java8學(xué)習(xí)教程之lambda表達(dá)式的使用方法

    java8學(xué)習(xí)教程之lambda表達(dá)式的使用方法

    Java8最值得學(xué)習(xí)的特性就是Lambda表達(dá)式,下面這篇文章主要給大家介紹了關(guān)于java8學(xué)習(xí)教程之lambda表達(dá)式使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09

最新評(píng)論