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

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

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

過濾器

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

可用兩種方式注冊過濾器:

  • 使用 FilterRegistrationBean 來注入??墒褂?setOrder(0) 設置過濾器的優(yōu)先級,越小優(yōu)先級越高。
  • 使用 @WebFilter(filterName = "myFilter2" ,urlPatterns = "/*") 配合 @ServletComponentScan() 實現(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("在請求之前做處理");
        if (servletRequest instanceof HttpServletRequest) {
            System.out.println("  URL:" + ((HttpServletRequest)servletRequest).getRequestURL());
        }
        // 調用filter鏈中的下一個filter
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("在請求之后做處理");
    }
    @Override
    public void destroy() {
        System.out.println("銷毀:MyFilter1");
    }
}

注冊過濾器

基于 FilterRegistrationBean

在配置類中注冊一個 FilterRegistrationBean 類型的Bean。

  • 如果沒有設置 UrlPatterns , 那么會自動關聯(lián)到 /* 上。
  • 如果沒有設置過濾器的名字,那么會自動推理出一個過濾器名稱(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默認是enable的,將其設置為false表示關閉當前過濾器。
  • 可通過 setOrder(0) 方法設置過濾器的優(yōu)先級,如果優(yōu)先級相同,則先定義的優(yōu)先級更高。
@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 {
        // 調用filter鏈中的下一個filter
        filterChain.doFilter(servletRequest, servletResponse);
    }
    @Override
    public void destroy() {}
}

攔截器

攔截器會在處理指定請求之前和之后進行相關操作,配置攔截器需要兩步

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

攔截器類:

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í)行方法的反射對象。
        System.out.println("preHandle: MyInterceptor");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 對于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() 方法會返回當前的 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

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

相關文章

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

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

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

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

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

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

    本文介紹了在開發(fā)Java SpringBoot應用程序時出現(xiàn)的"Invalidboundstatement(notfound)"錯誤的原因及解決方法,該錯誤通常與MyBatis或其他持久化框架相關,可能是由于配置錯誤、拼寫錯誤或其他問題引起的,解決方法包括檢查SQL映射文件
    2025-01-01
  • Spring Boot整合MyBatis-Plus實現(xiàn)CRUD操作的示例代碼

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

    本文主要介紹了Spring Boot整合MyBatis-Plus實現(xiàn)CRUD操作,可以快速實現(xiàn)數(shù)據(jù)庫的增刪改查操作,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2025-04-04
  • 深入了解Java中的反射機制(reflect)

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

    Java的反射機制允許我們對一個類的加載、實例化、調用方法、操作屬性的時期改為在運行期進行,這大大提高了代碼的靈活度,本文就來簡單講講反射機制的具體使用方法吧
    2023-05-05
  • mybatis如何返回某列的最大值

    mybatis如何返回某列的最大值

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

    java發(fā)起http請求調用post與get接口的方法實例

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

    EL表達式簡介_動力節(jié)點Java學院整理

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

    圖文詳解Java線程和線程池

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

    JAVA annotation入門基礎

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

最新評論

芦山县| 巴南区| 庆元县| 磴口县| 桐庐县| 卢氏县| 化德县| 老河口市| 大余县| 沅陵县| 颍上县| 长岭县| 昌宁县| 毕节市| 灌云县| 鄂伦春自治旗| 普格县| 湘阴县| 任丘市| 建阳市| 资中县| 咸丰县| 赤水市| 临泉县| 嘉善县| 鄱阳县| 永德县| 博罗县| 林甸县| 康乐县| 固阳县| 永新县| 新余市| 绥阳县| 卢湾区| 绥德县| 龙南县| 澜沧| 和林格尔县| 美姑县| 诸暨市|