Java Spring 之过滤器(Filter)详解与实战


在 Spring 框架中,过滤器(Filter)是一种强大的工具,用于在请求到达 Spring MVC 控制器之前或之后执行特定的逻辑。过滤器可以用于实现诸如日志记录、权限校验、静态资源处理等功能。本文将详细介绍 Spring 过滤器的使用方法,并提供具体的代码示例。

一、过滤器的作用

1.1 请求处理前的过滤

在请求到达控制器方法之前,过滤器可以执行一些前置操作,例如校验用户是否登录、记录请求时间等。

1.2 请求处理后的过滤

在控制器方法执行完毕后,过滤器可以执行一些后置操作,例如修改响应内容、记录处理时间等。

1.3 静态资源处理

过滤器可以用于处理静态资源,例如图片、CSS 文件、JavaScript 文件等,以提高性能和效率。

二、创建过滤器

2.1 实现 Filter 接口

创建一个类实现 Filter 接口,并重写其方法。

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

public class MyFilter implements Filter {

    // 过滤器初始化
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("MyFilter 初始化");
    }

    // 在请求处理之前执行
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("MyFilter: 请求处理之前");
        // 执行后续的过滤器或控制器方法
        chain.doFilter(request, response);
        System.out.println("MyFilter: 请求处理之后");
    }

    // 过滤器销毁
    @Override
    public void destroy() {
        System.out.println("MyFilter 销毁");
    }
}

2.2 注册过滤器

在 Spring 配置中注册创建的过滤器。

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class WebConfig {

    @Bean
    public FilterRegistrationBean<MyFilter> myFilterRegistrationBean() {
        FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new MyFilter());
        registrationBean.addUrlPatterns("/*"); // 指定过滤的 URL 模式
        return registrationBean;
    }
}

三、过滤器的使用场景

3.1 权限校验

在用户请求到达控制器之前,校验用户是否有权限访问该资源。

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    HttpServletResponse httpResponse = (HttpServletResponse) response;

    Object user = httpRequest.getSession().getAttribute("user");
    if (user == null) {
        // 如果用户未登录,重定向到登录页面
        httpResponse.sendRedirect(httpRequest.getContextPath() + "/login");
        return;
    }
    chain.doFilter(request, response);
}

3.2 日志记录

记录请求的详细信息,包括请求时间、请求路径、响应时间等。

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    long startTime = System.currentTimeMillis();
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    System.out.println("请求路径:" + httpRequest.getRequestURI() + ",请求时间:" + startTime);

    chain.doFilter(request, response);

    long endTime = System.currentTimeMillis();
    System.out.println("请求路径:" + httpRequest.getRequestURI() + ",响应时间:" + endTime + ",处理时间:" + (endTime - startTime) + "ms");
}

3.3 静态资源处理

对静态资源的请求进行处理,例如设置缓存头、压缩响应内容等。

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    HttpServletResponse httpResponse = (HttpServletResponse) response;

    String requestUri = httpRequest.getRequestURI();
    if (requestUri.endsWith(".js") || requestUri.endsWith(".css") || requestUri.endsWith(".jpg") || requestUri.endsWith(".png")) {
        // 设置缓存头,告诉浏览器缓存该资源
        httpResponse.setHeader("Cache-Control", "max-age=3600");
    }

    chain.doFilter(request, response);
}

四、总结

通过实现 Filter 接口并重写其方法,我们可以创建自定义的过滤器。然后在 Spring 配置中注册过滤器并指定其拦截路径,就可以在请求的各个阶段执行自定义逻辑。过滤器在权限校验、日志记录、静态资源处理等场景中有着广泛的应用。希望本文的示例和讲解能够帮助你更好地理解和使用 Spring 过滤器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java皇帝

有帮助就赏点吧,博主点杯水喝喝

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值