赞
踩
Spring MVC 提供了一套拦截器(Interceptor)机制,主要用于处理 Web 请求到达控制器之前或响应离开控制器之后执行一些操作。拦截器可以用于执行预处理(如验证用户身份)和后处理(如清理资源或修改响应)。拦截器可以用来执行一系列的任务,如身份验证、权限检查、请求/响应处理、日志记录等。
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
。下面是一个简单的 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 { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("Pre Handle: " + request.getMethod() + " " + request.getRequestURI()); return true; // 继续处理请求 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("Post Handle: " + request.getRequestURI()); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("After Completion: " + request.getRequestURI()); } }
要使拦截器生效,你需要将其注册到 Spring MVC 的配置中。这可以通过 XML 配置文件或 Java 配置类来实现。
<mvc:interceptors>
<bean class="com.example.MyHandlerInterceptor" />
</mvc:interceptors>
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 MyHandlerInterceptor())
.addPathPatterns("/**") // 指定拦截器的应用路径
.excludePathPatterns("/resources/**", "/static/**"); // 排除静态资源
}
}
Spring MVC 中的拦截器(Interceptor)和过滤器(Filter)都是处理 Web 请求的重要机制,但它们之间存在一些关键的区别。下面将详细比较这两种机制:
过滤器 (Filter):
拦截器 (Interceptor):
过滤器 (Filter):
init()
、doFilter()
和 destroy()
方法。doFilter()
方法在每次请求时调用,而 init()
和 destroy()
分别在容器初始化过滤器和销毁过滤器时调用。拦截器 (Interceptor):
preHandle()
、postHandle()
和 afterCompletion()
方法。preHandle()
在控制器方法之前调用,postHandle()
在控制器方法之后但视图渲染之前调用,afterCompletion()
在整个请求完成后调用。过滤器 (Filter):
web.xml
文件)或 Java 配置类(通过 FilterRegistrationBean
)来配置。拦截器 (Interceptor):
过滤器 (Filter):
拦截器 (Interceptor):
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。