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());
}
}
在上述代码中,我们实现了 preHandle
、postHandle
和 afterCompletion
方法,分别用于请求前处理、请求后处理和请求完成后的处理。
注册拦截器
创建完拦截器之后,我们需要在 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中一个非常实用的特性。