介绍
SpringMVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。
拦截器依赖于 Web 框架,在 SpringMVC 中就是依赖于 SpringMVC 框架。在实现上基于 Java 的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于 Web 框架的调用,因此可以使用 Spring 的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个 Controller 生命周期之内可以多次调用。但是缺点是只能对 Controller 请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。
自定义拦截器
1、定义拦截器 1:
// com.zze.springmvc.web.interceptor.MyInterceptor1
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor1 implements HandlerInterceptor {
/**
* 处理器执行前执行
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor.preHandle");
return true; // true:放行 false:拦截
}
/**
* 处理器执行后, modelAndView 返回前执行
*/
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("MyInterceptor.postHandle");
}
/**
* 处理器执行后执行
*/
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("MyInterceptor.afterCompletion");
}
}
2、定义拦截器 2:
// com.zze.springmvc.web.interceptor.MyInterceptor2
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor2 implements HandlerInterceptor {
/**
* 处理器执行前执行
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor.preHandle");
return true; // true:放行 false:拦截
}
/**
* 处理器执行后, modelAndView 返回前执行
*/
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("MyInterceptor.postHandle");
}
/**
* 处理器执行后执行
*/
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("MyInterceptor.afterCompletion");
}
}
3、注册拦截器:
<!-- config/spring/springmvc.xml -->
<!--注册拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--拦截所有请求,包括二级以上目录-->
<mvc:mapping path="/**"/>
<!--指定路径不拦截-->
<mvc:exclude-mapping path="/login"/>
<bean class="com.zze.springmvc.web.interceptor.MyInterceptor1"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.zze.springmvc.web.interceptor.MyInterceptor2"/>
</mvc:interceptor>
</mvc:interceptors>
4、编写测试 Controller:
// com.zze.springmvc.web.controller.TestController
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class TestController {
@RequestMapping("test")
public void test() {
System.out.println("from TestController.test");
}
}
5、测试,浏览器访问 localhost:8080/test
控制台输出如下:
评论区