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

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

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

過濾器

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

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

  • 使用 FilterRegistrationBean 來注入。可使用 setOrder(0) 設(shè)置過濾器的優(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());
        }

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

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

注冊過濾器

基于 FilterRegistrationBean

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

  • 如果沒有設(shè)置 UrlPatterns , 那么會自動關(guān)聯(lián)到 /* 上。
  • 如果沒有設(shè)置過濾器的名字,那么會自動推理出一個過濾器名稱(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)先級,如果優(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 {
        // 調(diào)用filter鏈中的下一個filter
        filterChain.doFilter(servletRequest, servletResponse);

    }

    @Override
    public void destroy() {}
}

攔截器

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

  • 編寫攔截器類(實現(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;

/**
 * @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() 方法會返回當(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實現(xiàn)過濾器和攔截器的方法的文章就介紹到這了,更多相關(guān)SpringBoot 過濾器和攔截器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

应用必备| 来宾市| 三河市| 庆元县| 双江| 米泉市| 斗六市| 于都县| 罗甸县| 洪洞县| 和龙市| 扎兰屯市| 高要市| 罗源县| 封开县| 青岛市| 婺源县| 青浦区| 巨野县| 兴山县| 界首市| 土默特右旗| 葫芦岛市| 汉沽区| 吕梁市| 页游| 义马市| 富民县| 赫章县| 渭源县| 盖州市| 柏乡县| 昌都县| 石城县| 石棉县| 新余市| 龙陵县| 苗栗市| 赤峰市| 井陉县| 灵丘县|