在Spring Boot 2中,您可以使用HandlerInterceptor
接口来创建拦截器,并通过WebMvcConfigurer
将其添加到Spring MVC中。以下是一个简单的示例代码,演示如何创建一个拦截器,并将其添加到Spring Boot 2的MVC配置中:
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 WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 将自定义拦截器添加到拦截器链
registry.addInterceptor(new CustomInterceptor())
.addPathPatterns("/secure/**") // 设置拦截的路径
.excludePathPatterns("/public/**"); // 设置排除拦截的路径
}
}
上述代码中,创建了一个名为CustomInterceptor
的自定义拦截器,并通过addInterceptors
方法将其添加到拦截器链。.addPathPatterns
用于指定需要拦截的路径,而.excludePathPatterns
用于指定排除拦截的路径。
接下来,让我们创建自定义拦截器CustomInterceptor
:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class CustomInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 在请求处理之前执行,返回true表示继续执行,返回false中断执行
System.out.println("Pre-handle method is called");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// 请求处理之后调用,但在视图被渲染之前,可以对ModelAndView进行操作
System.out.println("Post-handle method is called");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) throws Exception {
// 整个请求处理完毕回调方法,即在视图渲染完毕时调用
System.out.println("After-completion method is called");
}
}
上述代码中,CustomInterceptor
实现了HandlerInterceptor
接口,并重写了三个方法:preHandle
、postHandle
和afterCompletion
,分别表示在请求处理之前、处理之后和整个请求完成之后的回调方法。
通过这样的配置,您可以在Spring Boot 2中使用拦截器进行请求的预处理、后处理以及完成后的操作。
三个方法分别可以做什么,举个应用场景例子 并给出代码
当使用HandlerInterceptor
接口时,三个方法的具体作用如下:
1. preHandle
方法:
preHandle
方法在实际处理器方法被调用之前被调用。它可以用于诸如身份验证、日志记录或请求修改等任务。
应用场景示例:身份验证
假设您想在允许访问某些资源之前检查用户是否已经通过身份验证。您可以使用 preHandle
来实现这个目的。
public class AuthenticationInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 检查用户是否已经通过身份验证
if (!isUserAuthenticated(request)) {
// 如果没有通过身份验证,发送 401 未授权响应
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
return false; // 中断进一步处理
}
return true; // 继续请求处理
}
private boolean isUserAuthenticated(HttpServletRequest request) {
// 您的身份验证逻辑在这里
// 例如,检查用户是否已登录
// 您可以使用 Spring Security 或自定义逻辑
return /* 检查用户是否已通过身份验证 */;
}
}
2. postHandle
方法:
postHandle
方法在处理器方法被调用后,视图被渲染之前被调用。它可以用于修改 ModelAndView
等任务。
应用场景示例:向模型添加属性
您可能想在渲染视图之前向模型添加一些属性。
public class AddAttributeInterceptor implements HandlerInterceptor {
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// 向模型添加自定义属性
if (modelAndView != null) {
modelAndView.addObject("customAttribute", "这是一个自定义属性");
}
}
}
3. afterCompletion
方法:
afterCompletion
方法在视图被渲染后调用。它可以用于清理任务或记录日志。
应用场景示例:记录日志
您可能想在处理请求后记录有关请求的信息。
public class LoggingInterceptor implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) throws Exception {
// 记录有关已完成请求的信息
System.out.println("请求完成,URI:" + request.getRequestURI());
}
}
这些示例提供了如何在请求处理前、期间和后使用 HandlerInterceptor
方法的基本理解。根据应用程序的要求,您可以实现这些方法以执行特定的任务。