如何实现 Java 拦截器以拦截每一次请求

在 Java 开发中,拦截器是一种常用的设计模式,用于处理 HTTP 请求并在处理请求之前和之后执行某些操作。在本篇文章中,我将指导你如何实现一个 Java 拦截器,以便在每一次请求中加入你的自定义逻辑。我们的目标是能够在请求到达控制器之前及其后处理一些逻辑,比如验证用户身份、记录日志等。

整体流程

在实现拦截器之前,理解整体流程是非常重要的。以下是实现 Java 拦截器的步骤:

步骤 描述
1 创建拦截器类
2 实现 HandlerInterceptor 接口
3 重写 preHandle 方法
4 重写 postHandle 方法
5 配置拦截器
6 测试拦截器

每一步的详细说明

第一步:创建拦截器类

首先,我们需要创建一个拦截器类。在这个类中,我们将实现实际的拦截逻辑。

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class MyInterceptor implements HandlerInterceptor {
    // 此处将实现方法
}

注释: 这段代码定义了一个名为 MyInterceptor 的拦截器类,并通过 @Component 注解将其注册为 Spring 的 Bean。

第二步:实现 HandlerInterceptor 接口

接下来,MyInterceptor 需要实现 HandlerInterceptor 接口。

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    // 处理请求之前的逻辑
    System.out.println("请求 URL: " + request.getRequestURL());
    return true; // 返回 true 继续请求,返回 false 则中止请求
}

注释: preHandle 方法将在请求到达控制器之前调用。你可以在这里实现逻辑,比如日志记录、权限检查等。返回 true 将继续请求处理,返回 false 则会中止请求。

第三步:重写 postHandle 方法

接下来,重写 postHandle 方法,用于处理请求之后的逻辑。

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    // 处理请求后逻辑,比如添加额外的数据到模型
    System.out.println("请求处理完成");
}

注释: postHandle 方法将在请求被处理后但在视图渲染之前调用。此处可以在模型中添加额外的数据或记录其他信息。

第四步:重写 afterCompletion 方法(可选)

如果需要做一些清理工作,可以重写 afterCompletion 方法。

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    // 请求完成后的清理工作
    System.out.println("请求已完成");
}

注释: afterCompletion 方法用于请求处理完成后执行一些清理操作。

第五步:配置拦截器

在 Spring 中,我们需要将拦截器添加到 WebMvcConfigurer 中进行配置。

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 WebConfig implements WebMvcConfigurer {

    @Autowired
    private MyInterceptor myInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor)
                .addPathPatterns("/**"); // 拦截所有请求
    }
}

注释: 这段代码将 MyInterceptor 注册到 Spring 的上下文中,并配置它拦截所有的请求。addPathPatterns("/**") 表示拦截所有的 URL。

第六步:测试拦截器

最后,通过编写一个简单的控制器来测试拦截器。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @GetMapping("/test")
    public String test() {
        return "拦截器测试成功!";
    }
}

注释: 这个控制器有一个简单的 GET 请求接口 /test,用于触发请求并验证拦截器是否正常工作。

饼状图示例

接下来,我将用饼状图展示拦截器各个部分的比重。

pie
    title 拦截器开发流程
    "创建拦截器类": 15
    "实现 HandlerInterceptor 接口": 25
    "重写 preHandle 方法": 20
    "重写 postHandle 方法": 20
    "添加配置": 10
    "测试拦截器": 10

结论

通过以上步骤,我们成功实现了一个简单的 Java 拦截器,用于每一次请求的拦截和处理。这是一个非常强大的工具,能够帮助我们管理请求的生命周期,添加认证、日志记录等功能。希望通过本文的讲解,你能对 Java 拦截器的实现有一个全面的理解,并能够独立应用到你的项目中去。随着你的不断实践,你会发现拦截器在提高代码可读性和可维护性方面的强大作用!