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

SpringBoot過濾器與攔截器深入分析實(shí)現(xiàn)方法

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

過濾器

實(shí)現(xiàn)過濾器需要實(shí)現(xiàn) javax.servlet.Filter 接口。重寫三個(gè)方法。其中 init() 方法在服務(wù)啟動(dòng)時(shí)執(zhí)行,destroy() 在服務(wù)停止之前執(zhí)行。

可用兩種方式注冊(cè)過濾器:

  • 使用 FilterRegistrationBean 來注入??墒褂?setOrder(0) 設(shè)置過濾器的優(yōu)先級(jí),越小優(yōu)先級(jí)越高。
  • 使用 @WebFilter(filterName = "myFilter2" ,urlPatterns = "/*") 配合 @ServletComponentScan() 實(shí)現(xiàn)注入。(@Order 注解無效)

編寫過濾器

package com.example.recorddemo.filters;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class MyFilter1 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化過濾器:" + filterConfig.getFilterName());
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("在請(qǐng)求之前做處理");
        if (servletRequest instanceof HttpServletRequest) {
            System.out.println("  URL:" + ((HttpServletRequest)servletRequest).getRequestURL());
        }
        // 調(diào)用filter鏈中的下一個(gè)filter
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("在請(qǐng)求之后做處理");
    }
    @Override
    public void destroy() {
        System.out.println("銷毀:MyFilter1");
    }
}

注冊(cè)過濾器

基于 FilterRegistrationBean

在配置類中注冊(cè)一個(gè) FilterRegistrationBean 類型的Bean。

  • 如果沒有設(shè)置 UrlPatterns , 那么會(huì)自動(dòng)關(guān)聯(lián)到 /* 上。
  • 如果沒有設(shè)置過濾器的名字,那么會(huì)自動(dòng)推理出一個(gè)過濾器名稱(bean的名字)

When no URL pattern or servlets are specified the filter will be associated to ‘/*’. The filter name will be deduced if not specified.

  • fileter默認(rèn)是enable的,將其設(shè)置為false表示關(guān)閉當(dāng)前過濾器。
  • 可通過 setOrder(0) 方法設(shè)置過濾器的優(yōu)先級(jí),如果優(yōu)先級(jí)相同,則先定義的優(yōu)先級(jí)更高。
@Configuration
public class FilterConfiguration {
    @Bean
    public FilterRegistrationBean myFilter1(){
        MyFilter1 filter = new MyFilter1();
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(filter);
//        filterRegistrationBean.addUrlPatterns("/*");
//        filterRegistrationBean.setEnabled(true);
        return filterRegistrationBean;
    }
}

基于 @WebFilter

  • 使用 @WebFilter 修飾filter。
  • 在任意configuration類中添加 @ServletComponentScan("com.example.recorddemo.filters"),包名可以不填。
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@WebFilter(filterName = "myFilter2" ,urlPatterns = "/*")
public class MyFilter2 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 調(diào)用filter鏈中的下一個(gè)filter
        filterChain.doFilter(servletRequest, servletResponse);
    }
    @Override
    public void destroy() {}
}

攔截器

攔截器會(huì)在處理指定請(qǐng)求之前和之后進(jìn)行相關(guān)操作,配置攔截器需要兩步

  • 編寫攔截器類(實(shí)現(xiàn) HandlerInterceptor 接口)
  • 添加已實(shí)現(xiàn)的攔截器(實(shí)現(xiàn) WebMvcConfigurer 接口,并重寫 addInterceptors() 方法)
  • 添加addPathPatterns()規(guī)定攔截哪些請(qǐng)求。(/*表示只攔截/下的所有目錄,但是不包括子目錄, /**表示攔截/下的所有目錄,及其子目錄)

攔截器類:

package com.example.recorddemo.interceptor;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * @author wangchao
 */
@Component
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // handle可拿到執(zhí)行方法的反射對(duì)象。
        System.out.println("preHandle: MyInterceptor");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 對(duì)于RESTful 接口用處不大
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 可捕捉異常,但是springboot已經(jīng)有了全局異常捕捉
    }
}

配置攔截器:

package com.example.recorddemo.configuration;
import com.example.recorddemo.interceptor.MyInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.annotation.Resource;
@Configuration
public class InterceptorConfiguration implements WebMvcConfigurer {
    @Resource
    MyInterceptor myInterceptor;
    /**
     * 添加攔截器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor).addPathPatterns("/**");
    }
}

registry.addInterceptor() 方法會(huì)返回當(dāng)前的 interceptor, 因此可直接執(zhí)行 addPathPatterns() 方法

    public InterceptorRegistration addInterceptor(HandlerInterceptor interceptor) {
        InterceptorRegistration registration = new InterceptorRegistration(interceptor);
        this.registrations.add(registration);
        return registration;
    }

攔截器的執(zhí)行順序類似于棧,按照如下順序執(zhí)行:

preHandle-1, preHandle-2, postHandle-2, postHandle-1, afterCompletion-2, afterCompletion-1

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

相關(guān)文章

  • spring cloud gateway 全局過濾器的實(shí)現(xiàn)

    spring cloud gateway 全局過濾器的實(shí)現(xiàn)

    全局過濾器作用于所有的路由,不需要單獨(dú)配置,我們可以用它來實(shí)現(xiàn)很多統(tǒng)一化處理的業(yè)務(wù)需求,這篇文章主要介紹了spring cloud gateway 全局過濾器的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-03-03
  • Spring MVC接受表單自動(dòng)封裝特性實(shí)例解析

    Spring MVC接受表單自動(dòng)封裝特性實(shí)例解析

    這篇文章主要介紹了Spring MVC接受表單自動(dòng)封裝特性實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Spring中的DeferredImportSelector實(shí)現(xiàn)詳解

    Spring中的DeferredImportSelector實(shí)現(xiàn)詳解

    這篇文章主要介紹了Spring中的DeferredImportSelector實(shí)現(xiàn)詳解,兩個(gè)官方的實(shí)現(xiàn)類AutoConfigurationImportSelector和ImportAutoConfigurationImportSelector都是Spring Boot后新增的實(shí)現(xiàn),需要的朋友可以參考下
    2024-01-01
  • SpringBoot實(shí)現(xiàn)登錄攔截的示例代碼

    SpringBoot實(shí)現(xiàn)登錄攔截的示例代碼

    如果我們不進(jìn)行登錄攔截的話,即使我們跳過登錄頁面直接去訪問任意一個(gè)頁面也能訪問成功,那么登錄功能就沒有意義,同時(shí)也會(huì)存在安全問題,本文就來介紹一下SpringBoot登錄攔截,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • mybatis中批量更新多個(gè)字段的2種實(shí)現(xiàn)方法

    mybatis中批量更新多個(gè)字段的2種實(shí)現(xiàn)方法

    當(dāng)我們使用mybatis的時(shí)候,可能經(jīng)常會(huì)碰到一批數(shù)據(jù)的批量更新問題,因?yàn)槿绻粭l數(shù)據(jù)一更新,那每一條數(shù)據(jù)就需要涉及到一次數(shù)據(jù)庫的操作,本文主要介紹了mybatis中批量更新多個(gè)字段的2種實(shí)現(xiàn)方法,感興趣的可以了解一下
    2023-09-09
  • Java8?Stream流的常用方法匯總

    Java8?Stream流的常用方法匯總

    Java8?API添加了一個(gè)新的抽象稱為流Stream,可以讓你以一種聲明的方式處理數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Java8?Stream流的常用方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • SpringBoot實(shí)現(xiàn)文件下載功能的方式分享

    SpringBoot實(shí)現(xiàn)文件下載功能的方式分享

    這篇文章主要為大家詳細(xì)介紹了SpringBoot這哪個(gè)實(shí)現(xiàn)文件下載功能的幾種方式,文中的實(shí)現(xiàn)方法簡介易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-03-03
  • MyBatis類型轉(zhuǎn)換模塊的實(shí)現(xiàn)

    MyBatis類型轉(zhuǎn)換模塊的實(shí)現(xiàn)

    MyBatis是一個(gè)持久層框架ORM框架,實(shí)現(xiàn)數(shù)據(jù)庫中數(shù)據(jù)和Java對(duì)象中的屬性的雙向映射,那么不可避免的就會(huì)碰到類型轉(zhuǎn)換的問題,本文主要介紹了MyBatis類型轉(zhuǎn)換模塊的實(shí)現(xiàn),感興趣的可以了解一下
    2023-09-09
  • Java字符編碼解碼的實(shí)現(xiàn)詳解

    Java字符編碼解碼的實(shí)現(xiàn)詳解

    本篇文章介紹了,Java字符編碼解碼的實(shí)現(xiàn)詳解。需要的朋友參考下
    2013-05-05
  • SpringBoot+mail 輕松實(shí)現(xiàn)各類郵件自動(dòng)推送

    SpringBoot+mail 輕松實(shí)現(xiàn)各類郵件自動(dòng)推送

    在實(shí)際的項(xiàng)目開發(fā)過程中,經(jīng)常需要用到郵件通知功能,例如,通過郵箱注冊(cè),郵箱找回密碼,郵箱推送報(bào)表等等,實(shí)際的應(yīng)用場(chǎng)景非常的多,今天通過這篇文章,我們一起來學(xué)習(xí)如何在 Spring Boot 中快速實(shí)現(xiàn)一個(gè)自動(dòng)發(fā)送郵件的功能
    2024-07-07

最新評(píng)論