溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Spring Boot中的自定義過濾器與攔截器

發(fā)布時(shí)間:2024-10-05 13:55:05 來源:億速云 閱讀:81 作者:小樊 欄目:編程語言

在Spring Boot中,自定義過濾器(Filter)和攔截器(Interceptor)都可以用來在請(qǐng)求處理之前或之后執(zhí)行特定的邏輯。它們之間的主要區(qū)別在于它們所依賴的機(jī)制和使用場(chǎng)景。

  1. 自定義過濾器(Filter):

過濾器是基于Java Servlet規(guī)范的,它允許你在請(qǐng)求到達(dá)控制器之前或響應(yīng)返回給客戶端之前執(zhí)行特定的操作。在Spring Boot中,你可以通過實(shí)現(xiàn)javax.servlet.Filter接口來創(chuàng)建自定義過濾器。

要使用自定義過濾器,你需要執(zhí)行以下步驟:

  • 創(chuàng)建一個(gè)類,實(shí)現(xiàn)javax.servlet.Filter接口。
  • 重寫doFilter()方法,在該方法中編寫你的過濾邏輯。
  • 在Spring Boot配置類中,使用@Bean注解將自定義過濾器注冊(cè)為一個(gè)Bean。
  • 配置過濾器的優(yōu)先級(jí),以便在請(qǐng)求處理過程中按照預(yù)期的順序執(zhí)行。

示例:

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public class MyCustomFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化過濾器邏輯
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        // 在請(qǐng)求到達(dá)控制器之前執(zhí)行的邏輯

        chain.doFilter(request, response); // 繼續(xù)執(zhí)行請(qǐng)求處理

        // 在響應(yīng)返回給客戶端之前執(zhí)行的邏輯
    }

    @Override
    public void destroy() {
        // 銷毀過濾器邏輯
    }
}

在配置類中注冊(cè)過濾器:

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<MyCustomFilter> myCustomFilterRegistration() {
        FilterRegistrationBean<MyCustomFilter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new MyCustomFilter());
        registration.addUrlPatterns("/*"); // 指定過濾器應(yīng)用的URL模式
        registration.setOrder(1); // 設(shè)置過濾器的優(yōu)先級(jí)
        return registration;
    }
}
  1. 自定義攔截器(Interceptor):

攔截器是基于Spring MVC的,它允許你在控制器方法執(zhí)行之前或之后執(zhí)行特定的操作。在Spring Boot中,你可以通過實(shí)現(xiàn)org.springframework.web.servlet.HandlerInterceptor接口來創(chuàng)建自定義攔截器。

要使用自定義攔截器,你需要執(zhí)行以下步驟:

  • 創(chuàng)建一個(gè)類,實(shí)現(xiàn)org.springframework.web.servlet.HandlerInterceptor接口。
  • 重寫preHandle()postHandle()afterCompletion()方法,分別用于在控制器方法執(zhí)行之前、之后以及在方法執(zhí)行完成后執(zhí)行邏輯。
  • 在Spring Boot配置類中,使用@Bean注解將自定義攔截器注冊(cè)為一個(gè)Bean。
  • 配置攔截器的優(yōu)先級(jí),以便在請(qǐng)求處理過程中按照預(yù)期的順序執(zhí)行。

示例:

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyCustomInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 在控制器方法執(zhí)行之前執(zhí)行的邏輯
        return true; // 返回true表示繼續(xù)執(zhí)行請(qǐng)求處理,返回false表示中斷請(qǐng)求處理
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 在控制器方法執(zhí)行之后執(zhí)行的邏輯
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 在控制器方法執(zhí)行完成后執(zhí)行的邏輯
    }
}

在配置類中注冊(cè)攔截器:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Bean
    public HandlerInterceptorRegistrationBean<MyCustomInterceptor> myCustomInterceptorRegistration() {
        HandlerInterceptorRegistrationBean<MyCustomInterceptor> registration = new HandlerInterceptorRegistrationBean<>();
        registration.setInterceptor(new MyCustomInterceptor());
        registration.addUrlPatterns("/*"); // 指定攔截器應(yīng)用的URL模式
        registration.setOrder(1); // 設(shè)置攔截器的優(yōu)先級(jí)
        return registration;
    }
}

總結(jié):

  • 自定義過濾器是基于Java Servlet規(guī)范的,適用于任何遵循Servlet規(guī)范的Web應(yīng)用。
  • 自定義攔截器是基于Spring MVC的,適用于Spring Boot等基于Spring框架的Web應(yīng)用。
  • 在實(shí)際項(xiàng)目中,你可以根據(jù)需要選擇使用過濾器或攔截器來實(shí)現(xiàn)請(qǐng)求處理前后的邏輯。
向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI