一:拦截器
拦截器是SpringMvc中提供的一种于 Filter 类似的过滤器技术,但拦截器智能拦截Controller的请求,而Filter 可以过滤所有的请求
创建一个拦截器
1:创建一个普通类,实现HandlerInterceptor接口
package com.doaoao.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 MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("执行拦截器中的parHandle方法"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("执行拦截器中的postHandler方法"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("执行拦截器中的afterCompletion方法"); } }2:配置springmvc.xml中的内容,/** 表示拦截所有的Controller
<!--注册拦截器--> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.doaoao.interceptor.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors>3:创建一个测试用的 controller
package com.doaoao.interceptor; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class testController { @RequestMapping("/test.do") public ModelAndView test(){ ModelAndView mv = new ModelAndView(); System.out.println("执行 test 方法");
mv.serViewName("result") return mv; } }# 当执行后后输出:
执行拦截器中的preHandle方法 执行test方法 执行拦截器中的postHandle方法 执行拦截器中的afterCompletion方法
# 拦截器中的执行顺序
浏览器 -> preHandle -> handler -> postHandle -> acterCompletion -> 浏览器
...
二:多个拦截器
定义多个拦截器与上方方法一样,先定义一个类实现接口 HandlerInterceptor,再在配置文中注册拦截器(注册在前的拦截器会优先执行)
1:定义第二个拦截器
public class MyInterceptor2 implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("执行拦截器2中的parHandle方法"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("执行拦截器2中的postHandler方法"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("执行拦截器2中的afterCompletion方法"); } }2:在配置文件springmvc.xml中注册拦截器
<!--注册拦截器1--> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.doaoao.interceptor.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors> <!--注册拦截器2--> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.doaoao.interceptor.MyInterceptor2"/> </mvc:interceptor> </mvc:interceptors># 执行后的输出
执行拦截器中的preHandle方法 执行拦截器2中的preHandle方法 执行test方法 执行拦截器2中的postHandle方法 执行拦截器中的postHandle方法 执行拦截器2中的afterCompletion方法 执行拦截器中的afterCompletion方法
# 多个拦截器的执行顺序
浏览器 -> preHandler(拦截器1) -> preHandler(拦截器2) -> handler -> postHandle(拦截器2) -> postHandle(拦截器1) -> afterCompletion1 -> afterCompletion2->浏览器
...
本笔记参考自:小猴子老师教程 http://www.monkey1024.com