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

SpringBoot實(shí)現(xiàn)過濾器和攔截器的方法

 更新時(shí)間:2022年11月02日 08:24:46   作者:twilight0402  
大家應(yīng)該都曉得實(shí)現(xiàn)過濾器需要實(shí)現(xiàn)?javax.servlet.Filter?接口,而攔截器會(huì)在處理指定請求之前和之后進(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í)行。

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

  • 使用 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("在請求之前做處理");

        if (servletRequest instanceof HttpServletRequest) {
            System.out.println("  URL:" + ((HttpServletRequest)servletRequest).getRequestURL());
        }

        // 調(diào)用filter鏈中的下一個(gè)filter
        filterChain.doFilter(servletRequest, servletResponse);
        
        System.out.println("在請求之后做處理");
    }

    @Override
    public void destroy() {
        System.out.println("銷毀:MyFilter1");
    }
}

注冊過濾器

基于 FilterRegistrationBean

在配置類中注冊一個(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ì)在處理指定請求之前和之后進(jìn)行相關(guān)操作,配置攔截器需要兩步

  • 編寫攔截器類(實(shí)現(xiàn) HandlerInterceptor 接口)

  • 添加已實(shí)現(xiàn)的攔截器(實(shí)現(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;

/**
 * @author wangchao
 */
@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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Spring Boot Profiles 配置和使用

    詳解Spring Boot Profiles 配置和使用

    本篇文章主要介紹了詳解Spring Boot Profiles 配置和使用,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-06-06
  • 基于java SSM springboot實(shí)現(xiàn)景區(qū)行李寄存管理系統(tǒng)

    基于java SSM springboot實(shí)現(xiàn)景區(qū)行李寄存管理系統(tǒng)

    這篇文章主要介紹了基于java SSM springboot實(shí)現(xiàn)的景區(qū)行李寄存管理系統(tǒng),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • 盤點(diǎn)MQ中的異常測試

    盤點(diǎn)MQ中的異常測試

    這篇文章主要為大家介紹了盤點(diǎn)MQ中的異常測試,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • MyBatis-Plus?分頁不生效的解決方法

    MyBatis-Plus?分頁不生效的解決方法

    本文主要介紹了MyBatis-Plus?分頁不生效的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Spring Boot發(fā)送郵件詳解

    Spring Boot發(fā)送郵件詳解

    這篇文章主要為大家詳細(xì)介紹了Spring Boot發(fā)送郵件的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • 全面解析Spring Security 過濾器鏈的機(jī)制和特性

    全面解析Spring Security 過濾器鏈的機(jī)制和特性

    這篇文章主要介紹了Spring Security 過濾器鏈的機(jī)制和特性,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Spring中的BeanFactory與FactoryBean區(qū)別詳解

    Spring中的BeanFactory與FactoryBean區(qū)別詳解

    這篇文章主要介紹了Spring中的BeanFactory與FactoryBean區(qū)別詳解,BeanFactory是一個(gè)接口,它是spring中的一個(gè)工廠,FactoryBean也是一個(gè)接口,實(shí)現(xiàn)了3個(gè)方法,通過重寫其中方法自定義生成bean,需要的朋友可以參考下
    2024-01-01
  • jackson json序列化實(shí)現(xiàn)首字母大寫,第二個(gè)字母需小寫

    jackson json序列化實(shí)現(xiàn)首字母大寫,第二個(gè)字母需小寫

    這篇文章主要介紹了jackson json序列化實(shí)現(xiàn)首字母大寫,第二個(gè)字母需小寫方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • MyBatis自定義resultMap三種映射關(guān)系示例詳解

    MyBatis自定義resultMap三種映射關(guān)系示例詳解

    這篇文章主要介紹了MyBatis自定義resultMap三種映射關(guān)系,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • SpringBoot2線程池定義使用方法解析

    SpringBoot2線程池定義使用方法解析

    這篇文章主要介紹了SpringBoot2線程池定義使用方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03

最新評論