Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。
要实现一个自定义拦截器,你需要定义一个类实现 HandlerInterceptor
接口。以下是一个简单的示例:
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CustomInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 在请求处理之前进行调用,返回值是 boolean 类型,如果返回 false,则停止流程,api 不会被调用
System.out.println("preHandle");
return true; // 如果返回false,则停止流程,api不会被调用
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 请求处理之后进行调用,但是在视图被渲染之前
System.out.println("postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 在整个请求结束之后调用,也就是在 DispatcherServlet 渲染了视图执行
System.out.println("afterCompletion");
}
}
然后在 Spring 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 WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new CustomInterceptor())
.addPathPatterns("/**") // 拦截所有请求路径
.excludePathPatterns("/login"); // 排除登录接口
}
}
在这个配置中,addPathPatterns
方法用于指定拦截哪些路径的请求,excludePathPatterns
用于指定哪些路径的请求不需要被拦截。
以上代码实现了一个简单的拦截器,并在 Spring MVC 配置中注册了这个拦截器,它会拦截所有请求,但不会拦截登录接口。