拦截器(Interceptor)用于对URL请求进行前置/后置过滤。
Interceptor与Filter用途相似,但实现方式不同。
Interceptor为SpringMVC的标准组件。
Filter为J2EE的标准组件。
Interceptor底层就是基于Spring AOP面向切面编程实现。
preHandle - 前置执行处理
postHandle - 目标资源已被SpringMVC框架处理
afterCompletion - 响应文本已经产生
Maven依赖servlet-api
实现HandlerInterceptor接口
applicationContext配置过滤地址
新建工程interceptor并把RESTful风格的应用部分的restfull工程源代码复制到当前工程

打开pom.xml引入servlet依赖
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>3.1.0version>
<scope>providedscope>
dependency>
在com.ql.restful.interceptor包下创建MyInterceptor类
package com.ql.restful.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {
System.out.println(request.getRequestURL()+"准备执行");
return true;
}
@Override
public void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println(request.getRequestURL()+"-目标处理成功");
}
@Override
public void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println(request.getRequestURL()+"-响应内容已产生");
}
}
修改com.ql.restful.controller包下RestfulController类的findPersons方法
@GetMapping("/persons")
public List<Person> findPersons(){
List list = new ArrayList();
Person person1 = new Person();
person1.setName("lily");
person1.setAge(23);
person1.setBirthday(new Date());
list.add(person1);
Person person2 = new Person();
person2.setName("smith");
person2.setAge(22);
person2.setBirthday(new Date());
list.add(person2);
System.out.println("RestfulController.findPersons() - return list");
return list;
在applicationContext.xml中配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/restful/**"/>
<mvc:exclude-mapping path="/**.js"/>
<mvc:exclude-mapping path="/**.css"/>
<mvc:exclude-mapping path="/**.ico"/>
<mvc:exclude-mapping path="/resources/**"/>
<bean class="com.ql.restful.interceptor.MyInterceptor"/>
mvc:interceptor>
mvc:interceptors>
运行工程,在浏览器地址栏中输入http://localhost:8080/restful/persons,控制台中会输出

有多个拦截器时按照配置的顺序依次访问执行。

在com.ql.restful.interceptor目录下再创建一个拦截器MyInterceptor1
package com.ql.restful.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class MyInterceptor1 implements HandlerInterceptor {
@Override
public boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {
System.out.println(request.getRequestURL()+"准备执行1");
return true;
}
@Override
public void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println(request.getRequestURL()+"-目标处理成功1");
}
@Override
public void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println(request.getRequestURL()+"-响应内容已产生1");
}
}
然后在applicationContext.xml中配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/restful/**"/>
<mvc:exclude-mapping path="/**.js"/>
<mvc:exclude-mapping path="/**.css"/>
<mvc:exclude-mapping path="/**.ico"/>
<mvc:exclude-mapping path="/resources/**"/>
<bean class="com.ql.restful.interceptor.MyInterceptor"/>
mvc:interceptor>
mvc:interceptors>
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/restful/**"/>
<mvc:exclude-mapping path="/**.js"/>
<mvc:exclude-mapping path="/**.css"/>
<mvc:exclude-mapping path="/**.ico"/>
<mvc:exclude-mapping path="/resources/**"/>
<bean class="com.ql.restful.interceptor.MyInterceptor1"/>
mvc:interceptor>
mvc:interceptors>
运行工程,在浏览器中访问http://localhost:8080/restful/persons控制台输出为

拦截器中preHandle方法返回boolean值,返回true则请求依次向后传递,如果返回false请求会被中断。
修改com.ql.restful.interceptor包下的MyInterceptor拦截器
package com.ql.restful.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {
System.out.println(request.getRequestURL()+"准备执行");
response.setContentType("text/html;charset=utf-8");
response.getWriter().print("请求被拦截");
return false;
}
@Override
public void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println(request.getRequestURL()+"-目标处理成功");
}
@Override
public void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println(request.getRequestURL()+"-响应内容已产生");
}
}
运行项目浏览器中访问http://localhost:8080/restful/persons响应结果为

控制台中也只输出了preHandle中的打印语句内容。
