拦截器-Interceptor
-
拦截器用于对URL请求进行前置/后置过滤
-
Interceptor与Filter用途相似,但实现方式不同
-
Interceptor是SpringMVC的标准组件,再被创建以后是天然的运行在Spring Ioc容器中的,Filter是J2EE的标准组件,是标准,由第三方厂商实现。
-
Interceptor底层就是基于Spring AOP面向切面编程实现。
##HandlerInterceptor接口中要实现的三个方法:
-
preHandle():请求前置执行处理
-
postHandle():目标资源已被Spring MVC框架处理,大概相当于url请求被Controller方法处理以后return但是并没有产生响应文本之前。
-
afterCompletion():响应文本已经产生
拦截器开发流程
Maven依赖servlet-api
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
实现HandlerInterceptor接口
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println(request.getRequestURL()+"准备执行");
return false;//false 终止拦截器
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println(request.getRequestURL()+"目标处理成功");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println(request.getRequestURL()+"相应内容已产生");
}
}
applicationContext配置过滤地址
<mvc:interceptors>
<mvc:interceptor>
<!--拦截需要拦截的URL-->
<mvc:mapping path="/**"/>
<!--静态资源不做拦截-->
<mvc:exclude-mapping path="/assets/**"/>
<!--指明那个类对拦截的URL处理-->
<bean class="top.xiongmingcai.restful.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
拦截器使用流程 · MingCaiXiong/spring-learn@8ed911c
拦截器使用技巧
- 如果项目中静态资源直接存放在webapp的根目录里,需要对拦截器进行设置,把静态资源排除在外:

- 如果不想写那么多exclude-mapping
<mvc:exclude-mapping path="/assets/**"/>
多拦截器执行顺序

拦截器1在前,连接器2在后(是因为,在applicaitonContext.xml配置文件中配置拦截器时,拦截器1在前,拦截器2在后)

拦截器优先级 请求按配置顺序执行 响应逆序 · MingCaiXiong/spring-learn@9eca10a
拦截URL的区别
通常有两种配置路径的当时。/ 和/*
-
/会匹配到/login这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url 。对于需要拦截的是后台的地址,不需要拦截页面的是使用/ -
/*会匹配所有url:是全部匹配的意思,路径型的和后缀型的url(包括/login,.jsp,.js和.html等)。
/* 和 /** 一般用来配置mvc的拦截器
-
/*: 匹配一级,即 /add , /query 等 -
/**: 匹配多级,即 /add , /add/user, /add/user/user…