携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第39天,点击查看活动详情
如果一个url被多个拦截器进行拦截,那么他们的顺序是怎样的呢?今天我们来学习一下拦截器链的作用,明白拦截器调用顺序的问题
1.创建拦截器MyInterceptor
package com.imooc.restful.interceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println(request.getRequestURL() + "-准备执行");
// response.getWriter().print("[]");
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println(request.getRequestURL() + "-目标处理成功");
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println(request.getRequestURL() + "-响应内容已产生");
}
}
2.创建拦截器MyInterceptor1
package com.imooc.restful.interceptor;
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(request.getRequestURL()+"-准备执行-1");
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println(request.getRequestURL()+"-目标处理成功-1");
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println(request.getRequestURL()+"-响应内容已产生-1");
}
}
3.resources/applicationContext.xml配置两个拦截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/restful/**"/>
<mvc:mapping path="/webapi/**"/>
<mvc:exclude-mapping path="/**.ico"/>
<mvc:exclude-mapping path="/**.jpg"/>
<mvc:exclude-mapping path="/**.gif"/>
<mvc:exclude-mapping path="/**.js"/>
<mvc:exclude-mapping path="/**.css"/>
<mvc:exclude-mapping path="/resources/**"/>
<bean class="com.imooc.restful.interceptor.MyInterceptor1"/>
</mvc:interceptor>
</mvc:interceptors>
4.启动应用
我们可以看到,
- 拦截器先准备执行,接着拦截器1执行,这和拦截器配置文件的顺序有关
- 接下来我们看到先是目标处理成功1,然后目标处理成功
- 接着响应内容产生1,响应内容已产生
为什么会有这种情况的呢
通过图我们可以分析到,多个拦截器的使用遵循先入后出的原则