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

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)文章

  • Java中的序列化(Serializable)和反序列化

    Java中的序列化(Serializable)和反序列化

    這篇文章主要介紹了Java中的序列化(Serializable)和反序列化,?JAVA序列化與反序列化就是JAVA對(duì)象與一串字節(jié)流之間的相互轉(zhuǎn)換,?我們?cè)诔绦蛑袆?chuàng)建的JAVA對(duì)象只存在于JVM中,需要的朋友可以參考下
    2023-09-09
  • Java利用POI讀取、寫入Excel的方法指南

    Java利用POI讀取、寫入Excel的方法指南

    這篇文章主要給大家介紹了關(guān)于Java利用POI讀取、寫入Excel的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Invalid bound statement(not found):錯(cuò)誤的解決方案

    Invalid bound statement(not found):錯(cuò)誤的解決方案

    本文介紹了在開發(fā)Java SpringBoot應(yīng)用程序時(shí)出現(xiàn)的"Invalidboundstatement(notfound)"錯(cuò)誤的原因及解決方法,該錯(cuò)誤通常與MyBatis或其他持久化框架相關(guān),可能是由于配置錯(cuò)誤、拼寫錯(cuò)誤或其他問題引起的,解決方法包括檢查SQL映射文件
    2025-01-01
  • 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ù)的增刪改查操作,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • 深入了解Java中的反射機(jī)制(reflect)

    深入了解Java中的反射機(jī)制(reflect)

    Java的反射機(jī)制允許我們對(duì)一個(gè)類的加載、實(shí)例化、調(diào)用方法、操作屬性的時(shí)期改為在運(yùn)行期進(jìn)行,這大大提高了代碼的靈活度,本文就來簡(jiǎn)單講講反射機(jī)制的具體使用方法吧
    2023-05-05
  • mybatis如何返回某列的最大值

    mybatis如何返回某列的最大值

    這篇文章主要介紹了mybatis如何返回某列的最大值操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java發(fā)起http請(qǐng)求調(diào)用post與get接口的方法實(shí)例

    java發(fā)起http請(qǐng)求調(diào)用post與get接口的方法實(shí)例

    在實(shí)際開發(fā)過程中,我們經(jīng)常需要調(diào)用對(duì)方提供的接口或測(cè)試自己寫的接口是否合適,下面這篇文章主要給大家介紹了關(guān)于java發(fā)起http請(qǐng)求調(diào)用post與get接口的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • EL表達(dá)式簡(jiǎn)介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    EL表達(dá)式簡(jiǎn)介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    EL全名為Expression Language,這篇文章主要給大家介紹EL表達(dá)式的主要作用及內(nèi)容簡(jiǎn)介,感興趣的朋友一起看看
    2017-07-07
  • 圖文詳解Java線程和線程池

    圖文詳解Java線程和線程池

    下面小編就為大家?guī)硪黄斦凧ava的線程和線程池。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2021-11-11
  • JAVA annotation入門基礎(chǔ)

    JAVA annotation入門基礎(chǔ)

    以下是JAVA annotation入門基礎(chǔ),新手朋友們可以過來參考下。希望對(duì)你有所幫助
    2013-08-08

最新評(píng)論

浦县| 洪湖市| 高碑店市| 清新县| 墨竹工卡县| 永川市| 孟津县| 延边| 江源县| 五大连池市| 永川市| 华阴市| 长沙市| 罗江县| 峡江县| 宾川县| 花垣县| 疏附县| 桐柏县| 富阳市| 大化| 甘洛县| 江永县| 雷波县| 河东区| 沈丘县| 中宁县| 保德县| 宜黄县| 双辽市| 武功县| 仙居县| 杭锦后旗| 汾阳市| 桐梓县| 荃湾区| 绥中县| 泽普县| 兴安盟| 刚察县| 临沧市|