首先,为了添加拦截器,我们需要创建一个实现了 HandlerInterceptor
接口的拦截器类,并在 Spring Boot 中添加拦截器配置。以下是具体的步骤:
创建拦截器类
创建一个拦截器类,例如 CustomInterceptor
,实现HandlerInterceptor
接口。我们可以在拦截器的生命周期中重写不同的方法以执行相关操作,比如在请求处理前后执行某些操作。以下是一个简单的示例:
@Component
public class CustomInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 在请求处理前执行相关逻辑
return true; // 返回 true 表示继续执行后续操作,返回 false 表示取消当前请求
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// 在请求处理后执行相关逻辑
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) throws Exception {
// 在请求完成后执行相关逻辑
}
}
添加拦截器配置
创建 WebMvcConfigurer
配置类,使用 addInterceptors()
方法将拦截器添加到 Spring Boot 上下文中。以下是一个简单的示例:
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Autowired
private CustomInterceptor customInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(customInterceptor).addPathPatterns("/**");
}
}
在上面的示例中,我们在 addInterceptors()
方法中添加了 CustomInterceptor
拦截器,并通过 addPathPatterns()
方法指定所有路径都需要进行拦截。你也可以针对某些特定的路径进行拦截,例如只拦截所有以 /api
开头的请求:
registry.addInterceptor(customInterceptor).addPathPatterns("/api/**");
这个配置类可以放在任意的包中。在 Spring Boot 应用程序启动时,它将被自动加载。
示例1
现在,我们来看一个具体的示例。假设我们需要在每个请求前后记录相关日志,可以创建一个 LogInterceptor
拦截器来实现。以下是示例代码:
@Component
public class LogInterceptor implements HandlerInterceptor {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
logger.info("[Request] URL: {}, Method: {}, Headers: {}", request.getRequestURL(), request.getMethod(),
request.getHeaderNames());
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) throws Exception {
logger.info("[Response] URL: {}, Status: {}", request.getRequestURL(), response.getStatus());
}
}
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Autowired
private LogInterceptor logInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(logInterceptor).addPathPatterns("/**");
}
}
在上面的示例中,我们创建了一个 LogInterceptor
拦截器,使用 Logger
记录了每个请求前后的信息。然后,我们将其通过 InterceptorRegistry
添加到拦截器上下文中,并指定所有路径都要进行拦截。
示例2
接下来,我们来看一个更实际的示例。假设我们有一个需要身份验证的 API,我们可以使用拦截器来进行身份验证,其工作方式如下:
- 首先,我们需要提供一种验证机制,例如基于 Token 的身份验证。客户端将在请求头中传递 Token。
- 然后,我们创建一个
AuthInterceptor
拦截器来验证 Token。如果 Token 是有效的,则请求将被继续处理;否则,请求将被取消。
以下是示例代码:
@Component
public class AuthInterceptor implements HandlerInterceptor {
private static final String AUTH_HEADER = "Authorization";
@Autowired
private UserService userService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String token = request.getHeader(AUTH_HEADER);
if (token != null) {
User user = userService.getUserByToken(token);
if (user != null) {
request.setAttribute("user", user);
return true;
}
}
response.setStatus(HttpStatus.UNAUTHORIZED.value());
return false;
}
}
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Autowired
private AuthInterceptor authInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authInterceptor).addPathPatterns("/api/**");
}
}
在上面的示例中,我们创建了一个 AuthInterceptor
拦截器,使用 UserService
验证请求头中的 Token,并将验证结果存储在请求属性中。如果 Token 无效,则请求将被取消,并返回 Http.UNAUTHORIZED
状态码。
然后,我们将 AuthInterceptor
拦截器添加到 /api/**
路径中的 InterceptorRegistry
中,以在所有 API 请求中进行身份验证。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring boot如何添加拦截器 - Python技术站