推荐答案
在 Spring MVC 中配置拦截器可以通过以下步骤实现:
创建拦截器类:实现
HandlerInterceptor接口或继承HandlerInterceptorAdapter类,并重写preHandle、postHandle和afterCompletion方法。注册拦截器:在 Spring MVC 配置类中,通过
WebMvcConfigurer接口的addInterceptors方法注册拦截器。配置拦截路径:在注册拦截器时,指定拦截的路径和排除的路径。
示例代码如下:
// www.javascriptcn.com code example
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 MyInterceptor())
.addPathPatterns("/**") // 拦截所有路径
.excludePathPatterns("/public/**"); // 排除特定路径
}
}// www.javascriptcn.com code example
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor 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 {
// 在整个请求完成之后执行
}
}本题详细解读
1. 拦截器的作用
拦截器(Interceptor)是 Spring MVC 提供的一种机制,用于在请求处理的不同阶段执行特定的逻辑。它可以用于权限验证、日志记录、性能监控等场景。
2. 实现 HandlerInterceptor 接口
HandlerInterceptor 接口定义了三个方法:
preHandle:在请求处理之前执行。返回true继续执行后续的拦截器和处理器,返回false中断请求。postHandle:在请求处理之后,视图渲染之前执行。afterCompletion:在整个请求完成之后执行,通常用于资源清理。
3. 注册拦截器
在 Spring MVC 配置类中,通过实现 WebMvcConfigurer 接口的 addInterceptors 方法,可以将自定义的拦截器注册到 Spring MVC 框架中。
4. 配置拦截路径
在注册拦截器时,可以通过 addPathPatterns 方法指定需要拦截的路径,通过 excludePathPatterns 方法指定需要排除的路径。路径模式支持 Ant 风格的通配符。
5. 拦截器的执行顺序
如果有多个拦截器,它们的执行顺序与注册顺序一致。preHandle 方法按照注册顺序执行,postHandle 和 afterCompletion 方法按照注册顺序的逆序执行。
6. 拦截器与过滤器的区别
- 拦截器:基于 Spring MVC 框架,只能拦截 Spring MVC 处理的请求。
- 过滤器:基于 Servlet 规范,可以拦截所有进入应用的请求。
拦截器更适合处理与业务逻辑相关的拦截需求,而过滤器更适合处理与请求和响应相关的通用需求。