Spring Boot框架的过滤器(Filters)和拦截器(Interceptors)使用

Spring Boot框架的过滤器(Filters)和拦截器(Interceptors)是Java开发中常用的技术,用于处理HTTP请求的前置和后置处理。它们在实际开发中有着广泛的应用场景,例如日志记录、权限验证、请求处理时间测量等。下面我将通过一些简单的例子来展示如何在Spring Boot项目中使用过滤器和拦截器(新手学习使用)。

过滤器(Filter)示例

过滤器主要用于对请求进行预处理和响应进行后处理,适用于处理所有请求。例如,我们可以创建一个简单的过滤器来记录请求的处理时间。

java 复制代码
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public class LogFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
        long startTime = System.currentTimeMillis();
        chain.doFilter(request, response);
        long endTime = System.currentTimeMillis();
        System.out.println("Request processed in " + (endTime - startTime) + " ms");
        System.out.println("Request URI: " + ((HttpServletRequest) request).getRequestURI());
    }

    @Override
    public void destroy() {
    }
}

接着,在Spring Boot的配置类中注册这个过滤器:

java 复制代码
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<LogFilter> loggingFilter(){
        FilterRegistrationBean<LogFilter> registrationBean = new FilterRegistrationBean<>();

        registrationBean.setFilter(new LogFilter());
        registrationBean.addUrlPatterns("/api/*");

        return registrationBean;
    }
}

拦截器(Interceptor)示例

拦截器用于在请求到达Controller之前、Controller处理之后、响应发送之前进行拦截处理。一个常见的应用场景是进行权限验证。

首先,创建一个拦截器:

java 复制代码
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;

@Component
public class AuthInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 模拟权限验证
        // 实际项目中,这里可能会检查token或session
        String authHeader = request.getHeader("Authorization");
        if ("VALID_TOKEN".equals(authHeader)) {
            return true;
        } else {
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            return false;
        }
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // Controller方法调用之后的处理
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 请求处理完毕后的处理
    }
}

然后,在Spring Boot的配置类中注册拦截器:

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Autowired
    private AuthInterceptor authInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authInterceptor)
                .addPathPatterns("/api/private/*");
    }
}

以上例子展示了如何在Spring Boot应用中使用过滤器记录请求处理时间以及使用拦截器进行简单的权限验证。这些只是过滤器和拦截器的基础应用,实际应用中可以根据需求扩展和调整,适合新手学习使用。

相关推荐
Asthenia0412几秒前
面试官问我:Spring AOP的代理模式与实现原理深度剖析
后端
Jay_See6 分钟前
Leetcode——239. 滑动窗口最大值
java·数据结构·算法·leetcode
小马爱打代码13 分钟前
Spring Boot - 实现邮件发送
spring boot·后端
褚翾澜15 分钟前
Ruby语言的代码重构
开发语言·后端·golang
DKPT15 分钟前
Eclipse,MyEclipse,IDEA,Vscode这些编译器和JDK的相爱相杀
java·eclipse·编辑器·intellij-idea·myeclipse
肠胃炎17 分钟前
真题246—矩阵计数
java·线性代数·算法·矩阵·深度优先
你的人类朋友1 小时前
浅谈Object.prototype.hasOwnProperty.call(a, b)
javascript·后端·node.js
前行的小黑炭1 小时前
设计模式:为什么使用模板设计模式(不相同的步骤进行抽取,使用不同的子类实现)减少重复代码,让代码更好维护。
android·java·kotlin
Java技术小馆1 小时前
如何设计一个本地缓存
java·面试·架构
仙灵灵1 小时前
前端的同学看过来,今天讲讲jwt登录
前端·后端·程序员