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

SpringBoot過濾器與攔截器使用方法深入分析

 更新時間:2022年12月27日 12:01:50   作者:一個雙子座的Java攻城獅  
大家應(yīng)該都曉得實現(xiàn)過濾器需要實現(xiàn) javax.servlet.Filter 接口,而攔截器會在處理指定請求之前和之后進行相關(guān)操作,配置攔截器需要兩步,本文通過實例代碼給大家介紹SpringBoot 過濾器和攔截器的相關(guān)知識,感興趣的朋友一起看看吧

什么是過濾器

過濾器 Filter 基于 Servlet 實現(xiàn),過濾器的主要應(yīng)用場景是對字符編碼、跨域等問題進行過濾。Servlet 的工作原理是攔截配置好的客戶端請求,然后對 Request 和 Response 進行處理。Filter 過濾器隨著 web 應(yīng)用的啟動而啟動,只初始化一次。

Filter 使用時需要繼承 Filter 接口,實現(xiàn)對應(yīng)的 init、doFilter 以及 destroy 方法即可。

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.springframework.stereotype.Component;
@Component
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化攔截器");
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //做一些處理
        System.out.println("doSomeThing");
        chain.doFilter(request,response);
    }
    @Override
    public void destroy() {
        System.out.println("銷毀攔截器");
    }
}

1、init:在容器啟動時調(diào)用初始化方法,只會初始化一次

2、doFilter:每次請求都會調(diào)用 doFilter 方法,通過 FilterChain 調(diào)用后續(xù)的方法。

3、destroy:當(dāng)容器銷毀時,執(zhí)行 destory 方法,只會被調(diào)用一次。

什么是攔截器

攔截器是 SpringMVC 中實現(xiàn)的一種基于 Java 反射(動態(tài)代理)機制的方法增強工具,攔截器的實現(xiàn)是繼承 HandlerInterceptor 接口,并實現(xiàn)接口的 preHandle、postHandle 和 afterCompletion 方法。

1、preHandle:請求方法前置攔截,該方法會在 Controller 處理之前進行調(diào)用,Spring 中可以有多個 Interceptor,這些攔截器會按照設(shè)定的 Order 順序調(diào)用,當(dāng)有一個攔截器在 preHandle 中返回 false 的時候,請求就會終止。

2、postHandle:preHandle 返回結(jié)果為 true 時,在 Controller 方法執(zhí)行之后,視圖渲染之前被調(diào)用

3、afterCompletion:在 preHandle 返回 ture,并且整個請求結(jié)束之后,執(zhí)行該方法。

具體的代碼實現(xiàn)如下,首先編寫一個攔截器:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
@Component
public class UserInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle");
        String userName=request.getParameter("username");
        String password = request.getParameter("password");
        if (userName==null||password==null){
            response.setStatus(500);
            response.setContentType("text/html; charset=UTF-8");
            response.getWriter().print("參數(shù)缺失");
            return false;
        }
        //進行用戶校驗
        if (userName.equals("admin")&&password.equals("admin")){
            return true;
        }else {
            response.setStatus(500);
            response.setContentType("text/html; charset=UTF-8");
            response.getWriter().print("用戶名或密碼錯誤");
            return false;
        }
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion");
    }
}

編寫完攔截器之后,通過一個配置類設(shè)置攔截器,并且可以通過 addPathPatterns 和 excludePathPatterns 執(zhí)行哪些請求需要被攔截,哪些不需要被攔截。

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.WebMvcConfigurer;
@Configuration
public class MvcConfig implements WebMvcConfigurer {
    @Autowired
    private UserInterceptor userInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(userInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/error");
    }
}

再次訪問 /test 頁面,如果不帶任何參數(shù),就會在頁面上提示 參數(shù)缺失。只有當(dāng)帶上參數(shù) /test?username=admin&password=admin 才能夠訪問。

攔截器與過濾器的區(qū)別

相同點:

1、 攔截器與過濾器都是體現(xiàn)了 AOP 的思想,對方法實現(xiàn)增強,都可以攔截請求方法。

2、 攔截器和過濾器都可以通過 Order 注解設(shè)定執(zhí)行順序

不同點:

1、 過濾器屬于 Servlet 級別,攔截器屬于 Spring 級別。

Filter 是在 javax.servlet 包中定義的,要依賴于網(wǎng)絡(luò)容器,因此只能在 web 項目中使用。

Interceptor 是 SpringMVC 中實現(xiàn)的,歸根揭底攔截器是一個 Spring 組件,由 Spring 容器進行管理。

2、過濾器和攔截器的執(zhí)行順序不同:

下面通過一張圖展示 Filter 和 Interceprtor 的執(zhí)行順序:

首先當(dāng)一個請求進入 Servlet 之前,過濾器的 doFilter 方法進行過濾,進入 Servlet 容器之后,執(zhí)行 Controller 方法之前,攔截器的 preHandle 方法進行攔截,執(zhí)行 Controller 方法之后,視圖渲染之前,攔截器的 postHandle 方法進行攔截,請求結(jié)束之后,執(zhí)行攔截器的 postHandle 方法。

3、 過濾器基于函數(shù)回調(diào)方式實現(xiàn),攔截器基于 Java 反射(動態(tài)代理)機制實現(xiàn)。

到此這篇關(guān)于SpringBoot過濾器與攔截器使用方法深入分析的文章就介紹到這了,更多相關(guān)SpringBoot過濾器與攔截器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Springboot2以代碼的方式統(tǒng)一配置Jackson教程

    Springboot2以代碼的方式統(tǒng)一配置Jackson教程

    這篇文章主要介紹了Springboot2以代碼的方式統(tǒng)一配置Jackson教程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java8 Stream API之reduce使用說明

    java8 Stream API之reduce使用說明

    這篇文章主要介紹了java8 Stream API之reduce使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • SpringBoot數(shù)據(jù)層測試事務(wù)回滾的實現(xiàn)流程

    SpringBoot數(shù)據(jù)層測試事務(wù)回滾的實現(xiàn)流程

    這篇文章主要介紹了SpringBoot數(shù)據(jù)層測試事務(wù)回滾的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-10-10
  • SpringMvc web.xml配置實現(xiàn)原理過程解析

    SpringMvc web.xml配置實現(xiàn)原理過程解析

    這篇文章主要介紹了SpringMvc web.xml配置實現(xiàn)原理過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • 詳解poi+springmvc+springjdbc導(dǎo)入導(dǎo)出excel實例

    詳解poi+springmvc+springjdbc導(dǎo)入導(dǎo)出excel實例

    本篇文章主要介紹了poi+springmvc+springjdbc導(dǎo)入導(dǎo)出excel實例,非常具有實用價值,需要的朋友可以參考下。
    2017-01-01
  • Gradle環(huán)境下導(dǎo)出Swagger為PDF的步驟詳解

    Gradle環(huán)境下導(dǎo)出Swagger為PDF的步驟詳解

    這篇文章主要介紹了Gradle環(huán)境下導(dǎo)出Swagger為PDF的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 深入理解springboot中配置文件application.properties

    深入理解springboot中配置文件application.properties

    本文主要介紹了springboot中配置文件application.properties,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 簡單分析Java線程編程中ThreadLocal類的使用

    簡單分析Java線程編程中ThreadLocal類的使用

    這篇文章主要介紹了Java線程編程中ThreadLocal類的使用,包括使用其對共享變量的操作的分析,需要的朋友可以參考下
    2015-12-12
  • SpringBoot基礎(chǔ)教程之集成郵件服務(wù)

    SpringBoot基礎(chǔ)教程之集成郵件服務(wù)

    這篇文章主要給大家介紹了關(guān)于SpringBoot基礎(chǔ)教程之集成郵件服務(wù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用SpringBoot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • SpringBoot中的自動配置原理詳解

    SpringBoot中的自動配置原理詳解

    這篇文章主要介紹了SpringBoot中的自動配置原理詳解,springboot的自動配置類直觀的表現(xiàn)就是通過一系列的注解,使得springboot項目在啟動的時候從配置文件中加載需要自動配置的類,注入容器中,需要的朋友可以參考下
    2024-01-01

最新評論

陇川县| 确山县| 建宁县| 荔波县| 景东| 文化| 桐梓县| 南汇区| 称多县| 东乌| 马尔康县| 阿荣旗| 江北区| 台安县| 南木林县| 阳东县| 上蔡县| 双柏县| 凌云县| 汨罗市| 高碑店市| 竹溪县| 丰都县| 格尔木市| 陈巴尔虎旗| 霍山县| 大关县| 鞍山市| 阿坝| 高雄县| 星座| 赣州市| 微山县| 松滋市| 察隅县| 康保县| 元朗区| 河曲县| 湟中县| 长沙市| 玉环县|