1.SpringMVC的拦截器
SpringMvc处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。当收到请求时,DispatcherServlet将请求交给处理器映射(HandlerMapping),让它找出对应请求的HandlerExecutionChain对象。HandlerExecutionChain是一个执行链,它包含一个处理该请求的处理器(Handler),同时可以包含若干个对该请求实施拦截的拦截器(HandlerInterceptor)。当HandlerMapping返回HandlerExecutionChain后,DispatcherServlet将请求交给定义在HandlerExecutionChain中的拦截器和处理器一并处理。HandlerExecutionChain是负责处理请求并返回ModelAndView的处理执行链,其结构如下图所示。请求在被Handler执行的前后,链中装配的HandlerInterceptor会实施拦截操作。
拦截器代码编写,需要实现HandlerInterceptor接口
public class SpringMvcInterceptor implements HandlerInterceptor{
/**
* 在请求到达Handler之前,先执行这个前置处理方法。当该方法返回false时,请求直接返回,不会传递到链中
* 下一个拦截器,更不会调用处理器链末端的Handler中,只有返回true时请求才向链中的下一个处理节点传递。
* SpringMvc中的拦截器是链式的,可以同时存在多个interceptor,springmvc会根据声明的前后顺序一个
* 接一个的执行,且所有的interceptor中的preHandle方法都会在。
*/
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2) throws Exception {
// TODO Auto-generated method stub
return true;
}
/**
* 在业务处理器处理请求执行完成后,生成视图之前执行的动作
* 可在modelAndView中加入数据,比如当前时间
*/
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception {
// TODO Auto-generated method stub
}
/**
* 在DispatcherServlet完全处理完请求后被调用,可用于清理资源、可记录操作日志等
* 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()
*/
@Override
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
}
}
位于处理器链末端的是一个Handler,DispactherServlet通过HandlerAdapter适配器对Handler进行封装,并按统一的适配器接口对Handler处理方法进行调用。
<!-- 配置MVC拦截器 -->
<mvc:interceptors>
<!-- 使用bean定义一个interceptor,直接定义在mvc:interceptors根下面interceptor
将拦截所有的请求
-->
<bean class="com.springmvc.assess.interceptor.TimeInterceptor" />
<mvc:interceptor>
<!-- 定义在mvc:interceptor下面的表示对特定的请求才进行拦截 -->
<mvc:mapping path="/**" />
<bean class="com.springmvc.assess.interceptor.SpringMvcInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
可以在SpringMVC.xml中配置多个拦截器,每个拦截器都可以指定一个匹配的映射路径,以限制拦截器的作用范围。
- 拦截器例子
<!-- springmvc.xml配置MVC拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="com.springmvc.assess.interceptor.TimeInterceptor1" />
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="com.springmvc.assess.interceptor.TimeInterceptor2" />
</mvc:interceptor>
</mvc:interceptors>
自定义拦截器
public class TimeInterceptor1 extends HandlerInterceptorAdapter {
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("[TimeInterceptor1_preHandle]"+ "执行开始时间" + sf.format(new Date()));
return true;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("[TimeInterceptor1_postHandle]"+ "执行时间");
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("[TimeInterceptor1_afterCompletion]"+ "执行结束时间" + sf.format(new Date()));
}
}
public class TimeInterceptor2 extends HandlerInterceptorAdapter {
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("[TimeInterceptor1_preHandle]"+ "执行开始时间" + sf.format(new Date()));
return true;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("[TimeInterceptor1_postHandle]"+ "执行时间");
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("[TimeInterceptor1_afterCompletion]"+ "执行结束时间" + sf.format(new Date()));
}
}
拦截器1放行,拦截器2放行,实现的效果:
将拦截器1放行,拦截器2阻止,实现的效果:
本文详细介绍了SpringMVC中的拦截器机制,包括如何编写拦截器、拦截器的工作原理及配置方式。通过示例展示了拦截器在处理请求前后的三个阶段如何发挥作用。
8730

被折叠的 条评论
为什么被折叠?



