石家庄seo网站优化报价,微营销方案,检查网站是否做网站地图,搜维斯网站建设Spring MVC 提供了一套拦截器#xff08;Interceptor#xff09;机制#xff0c;主要用于处理 Web 请求到达控制器之前或响应离开控制器之后执行一些操作。拦截器可以用于执行预处理#xff08;如验证用户身份#xff09;和后处理#xff08;如清理资源或修改响应#x…Spring MVC 提供了一套拦截器Interceptor机制主要用于处理 Web 请求到达控制器之前或响应离开控制器之后执行一些操作。拦截器可以用于执行预处理如验证用户身份和后处理如清理资源或修改响应。拦截器可以用来执行一系列的任务如身份验证、权限检查、请求/响应处理、日志记录等。
1.Handler 拦截器
Handler 拦截器是 Spring MVC 中最常见的拦截器类型。 Handler 拦截器实现 HandlerInterceptor 接口。
该接口定义了三个方法 preHandle: 方法签名: boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;用途: 在控制器方法调用之前执行。返回值: 如果返回 true则控制器方法将被调用如果返回 false则控制器方法不会被调用并且后续的拦截器也不会被调用。 postHandle: 方法签名: void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception;用途: 在控制器方法调用之后执行但在视图渲染之前。参数: request: 当前请求。response: 当前响应。handler: 被调用的控制器实例。modelAndView: 控制器方法返回的模型和视图。 afterCompletion: 方法签名: void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;用途: 在整个请求完成后执行无论是否出现异常。参数: request: 当前请求。response: 当前响应。handler: 被调用的控制器实例。ex: 如果在请求处理过程中出现了异常则此参数为异常对象否则为 null。
2.实现示例
下面是一个简单的 Handler 拦截器示例
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class MyHandlerInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println(Pre Handle: request.getMethod() request.getRequestURI());return true; // 继续处理请求}Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println(Post Handle: request.getRequestURI());}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println(After Completion: request.getRequestURI());}
}3.配置拦截器
要使拦截器生效你需要将其注册到 Spring MVC 的配置中。这可以通过 XML 配置文件或 Java 配置类来实现。
3.1.XML 配置示例
mvc:interceptorsbean classcom.example.MyHandlerInterceptor /
/mvc:interceptors3.2.Java 配置示例
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 {Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyHandlerInterceptor()).addPathPatterns(/**) // 指定拦截器的应用路径.excludePathPatterns(/resources/**, /static/**); // 排除静态资源}
}4.与过滤器Filter比较
Spring MVC 中的拦截器Interceptor和过滤器Filter都是处理 Web 请求的重要机制但它们之间存在一些关键的区别。下面将详细比较这两种机制
1. 概念区别 过滤器 (Filter): 过滤器是 Servlet 规范的一部分因此它适用于所有基于 Servlet 的容器包括 Spring MVC。过滤器可以在请求到达任何其他组件之前和响应发送给客户端之后执行。过滤器可以应用于整个 Web 应用程序也可以针对特定 URL 模式。 拦截器 (Interceptor): 拦截器是 Spring MVC 特有的概念它只能在 Spring MVC 上下文中使用。拦截器主要用于处理 HTTP 请求和响应的生命周期但仅限于那些通过 Spring MVC DispatcherServlet 处理的请求。拦截器可以针对特定的控制器方法或一组控制器方法。
2. 生命周期 过滤器 (Filter): 过滤器在整个应用生命周期内只初始化一次并且每个请求/响应都会经过过滤器链。过滤器可以实现 init()、doFilter() 和 destroy() 方法。doFilter() 方法在每次请求时调用而 init() 和 destroy() 分别在容器初始化过滤器和销毁过滤器时调用。 拦截器 (Interceptor): 拦截器也只初始化一次但它们仅在请求到达 Spring MVC DispatcherServlet 时生效。拦截器可以实现 preHandle()、postHandle() 和 afterCompletion() 方法。preHandle() 在控制器方法之前调用postHandle() 在控制器方法之后但视图渲染之前调用afterCompletion() 在整个请求完成后调用。
3. 配置方式 过滤器 (Filter): 过滤器可以通过部署描述符web.xml 文件或 Java 配置类通过 FilterRegistrationBean来配置。过滤器需要指定 URL 模式以确定哪些请求应通过该过滤器。 拦截器 (Interceptor): 拦截器可以通过 XML 配置文件或 Java 配置类来配置。拦截器可以针对特定的控制器方法或一组控制器方法通过指定路径模式来配置。
4. 适用场景 过滤器 (Filter): 通常用于执行全局性的操作如编码转换、登录验证、安全过滤等。适合在请求到达任何其他组件之前执行的操作例如登录检查、安全过滤、压缩等。 拦截器 (Interceptor): 更侧重于与 Spring MVC 相关的功能如权限检查、数据校验、日志记录等。适合在控制器方法之前或之后执行的操作例如数据预处理、视图后处理、资源清理等。