Spring Boot 实战:使用拦截器

在Spring Boot中,拦截器是一种用于处理请求的机制,它可以在请求到达 controller 之前进行一些预处理,或者在响应返回给客户端之前进行后处理。拦截器通常用于日志记录、权限验证、请求计时等场景。

创建拦截器

首先,我们需要创建一个拦截器类,该类需要实现 HandlerInterceptor 接口。下面是一个简单的拦截器示例:

package com.example.interceptor;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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 {

    private static final Logger logger = LoggerFactory.getLogger(MyInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        logger.info("请求地址: {}", request.getRequestURI());
        logger.info("请求方法: {}", request.getMethod());
        return true; // 返回true表示继续处理,返回false表示中断请求
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        logger.info("处理请求完成: {}", request.getRequestURI());
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        logger.info("请求结束: {}", request.getRequestURI());
    }
}

在上述代码中,我们实现了 preHandlepostHandleafterCompletion 方法,分别用于请求前处理、请求后处理和请求完成后的处理。

注册拦截器

创建完拦截器之后,我们需要在 Spring Boot 上下文中注册它。可以通过实现 WebMvcConfigurer 接口来完成此操作:

package com.example.config;

import com.example.interceptor.MyInterceptor;
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("/**") // 拦截所有请求
                .excludePathPatterns("/api/login"); // 排除登录请求
    }
}

addInterceptors 方法中,我们添加了我们的拦截器并指定要拦截的路径。这里我们拦截所有请求,但排除了 /api/login 的请求。

测试拦截器

接下来,我们可以创建一个简单的 Controller 来测试拦截器的功能:

package com.example.controller;

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

@RestController
public class TestController {

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

    @GetMapping("/api/login")
    public String login() {
        return "登录接口";
    }
}

运行应用

将上述所有代码整合到Spring Boot项目中后,启动应用。你可以使用 Postman 或者浏览器访问 /api/test/api/login,在控制台中观察拦截器的日志输出。

  • 当访问 /api/test 时,你将看到日志中会输出请求的地址和方法,以及处理完成和请求结束的日志。
  • 当访问 /api/login 时,由于我们在拦截器中排除了这个接口,所以不会看到相应的日志。

总结

通过拦截器,我们能够在请求处理的不同阶段加入自定义的逻辑,极大地提高了代码的灵活性和可管理性。拦截器在处理日志、权限校验、性能监控等方面发挥着重要作用,是Spring Boot中一个非常实用的特性。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部