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

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

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

什么是過濾器

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

Filter 使用時(shí)需要繼承 Filter 接口,實(shí)現(xiàn)對(duì)應(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:在容器啟動(dòng)時(shí)調(diào)用初始化方法,只會(huì)初始化一次

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

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

什么是攔截器

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

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

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

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

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

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;
        }
        //進(jìn)行用戶校驗(yàn)
        if (userName.equals("admin")&&password.equals("admin")){
            return true;
        }else {
            response.setStatus(500);
            response.setContentType("text/html; charset=UTF-8");
            response.getWriter().print("用戶名或密碼錯(cuò)誤");
            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");
    }
}

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

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ù),就會(huì)在頁面上提示 參數(shù)缺失。只有當(dāng)帶上參數(shù) /test?username=admin&password=admin 才能夠訪問。

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

相同點(diǎn):

1、 攔截器與過濾器都是體現(xiàn)了 AOP 的思想,對(duì)方法實(shí)現(xiàn)增強(qiáng),都可以攔截請(qǐng)求方法。

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

不同點(diǎn):

1、 過濾器屬于 Servlet 級(jí)別,攔截器屬于 Spring 級(jí)別。

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

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

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

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

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

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

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

相關(guān)文章

  • java配置context.xml文件的方法圖解

    java配置context.xml文件的方法圖解

    這篇文章主要介紹了java配置context.xml文件的方法圖解,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • Java中實(shí)現(xiàn)線程間通信的實(shí)例教程

    Java中實(shí)現(xiàn)線程間通信的實(shí)例教程

    線程通信的目標(biāo)是使線程間能夠互相發(fā)送信號(hào),另一方面線程通信使線程能夠等待其他線程的信號(hào),這篇文章主要給大家介紹了關(guān)于Java中實(shí)現(xiàn)線程間通信的相關(guān)資料,本文通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-09-09
  • Java基于SpringBoot和tk.mybatis實(shí)現(xiàn)事務(wù)讀寫分離代碼實(shí)例

    Java基于SpringBoot和tk.mybatis實(shí)現(xiàn)事務(wù)讀寫分離代碼實(shí)例

    這篇文章主要介紹了Java基于SpringBoot和tk.mybatis實(shí)現(xiàn)事務(wù)讀寫分離代碼實(shí)例,讀寫分離,基本的原理是讓主數(shù)據(jù)庫處理事務(wù)性增、改、刪操作,而從數(shù)據(jù)庫處理SELECT查詢操作,數(shù)據(jù)庫復(fù)制被用來把事務(wù)性操作導(dǎo)致的變更同步到集群中的從數(shù)據(jù)庫,需要的朋友可以參考下
    2023-10-10
  • elasticsearch bucket 之rare terms聚合使用詳解

    elasticsearch bucket 之rare terms聚合使用詳解

    這篇文章主要為大家介紹了elasticsearch bucket 之rare terms聚合使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Spring AOP注解失效的坑及JDK動(dòng)態(tài)代理

    Spring AOP注解失效的坑及JDK動(dòng)態(tài)代理

    這篇文章主要介紹了Spring AOP注解失效的坑及JDK動(dòng)態(tài)代理,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • Java生產(chǎn)者和消費(fèi)者例子_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java生產(chǎn)者和消費(fèi)者例子_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    生產(chǎn)者-消費(fèi)者(producer-consumer)問題,也稱作有界緩沖區(qū)(bounded-buffer)問題,兩個(gè)進(jìn)程共享一個(gè)公共的固定大小的緩沖區(qū)。下文通過實(shí)例給大家介紹java生產(chǎn)者和消費(fèi)者,感興趣的朋友一起學(xué)習(xí)吧
    2017-05-05
  • Java正則表達(dá)式API字符類

    Java正則表達(dá)式API字符類

    這篇文章主要介紹了Java正則表達(dá)式API字符類,Java正則表達(dá)式API也接受預(yù)定義的字符類,下面文章內(nèi)容展開了更多的相關(guān)內(nèi)容介紹,需要的朋友可以參考一下
    2022-06-06
  • SpringBoot使用Redisson實(shí)現(xiàn)延遲執(zhí)行的完整示例

    SpringBoot使用Redisson實(shí)現(xiàn)延遲執(zhí)行的完整示例

    這篇文章主要介紹了SpringBoot使用Redisson實(shí)現(xiàn)延遲執(zhí)行的完整示例,文中通過代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-06-06
  • Java設(shè)計(jì)模式之里氏替換原則精解

    Java設(shè)計(jì)模式之里氏替換原則精解

    設(shè)計(jì)模式(Design pattern)代表了最佳的實(shí)踐,通常被有經(jīng)驗(yàn)的面向?qū)ο蟮能浖_發(fā)人員所采用。設(shè)計(jì)模式是軟件開發(fā)人員在軟件開發(fā)過程中面臨的一般問題的解決方案。本篇介紹設(shè)計(jì)模式七大原則之一的里氏替換原則
    2022-02-02
  • Java的Socket網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)入門教程

    Java的Socket網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)入門教程

    這篇文章主要介紹了Java的Socket網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)入門教程,包括基于TCP/IP和UDP協(xié)議的簡(jiǎn)單實(shí)例程序講解,需要的朋友可以參考下
    2016-01-01

最新評(píng)論