在springMvc.xml中配置拦截器(拦截器的先后执行就是在此处配置的)
<!-- 配置拦截器--> <!-- 将mvc的命名空间导入后配置拦截器--> <mvc:annotation-driven /> <mvc:interceptors> <mvc:interceptor> <!-- 对那些资源进行操作--> <mvc:mapping path="/**"/> <bean class="com.springMvc.Interceptor.MyInterceptor"/><!--指定你的拦截器的具体位置--> </mvc:interceptor> </mvc:interceptors> <!-- 配置拦截器2--> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.springMvc.Interceptor.MyInterceptorTwo"/> </mvc:interceptor> </mvc:interceptors>
目标方法
@RequestMapping("/test") @Controller public class TargetControlle { @RequestMapping("/target") public ModelAndView target(ModelAndView modelAndView){ System.out.println("目标资源执行....."); modelAndView.addObject("name","目标资源"); modelAndView.setViewName("target"); return modelAndView; } }
执行的结果为;
我是拦截器1的目标执行方法前的preHandle 我是拦截器2的preHandle方法,我应该在目标方法执行前和拦截器1的preHandle方法后执行 目标资源执行..... 我是拦截器2的postHandle方法,我应该在目标资源执行后和方法1的postHandle方法执行前 我是拦截器1的postHandle 我是拦截器2的afterCompletion方法我在目标方法执行后,拦截器1的postHandle方法后执行 拦截器1的最后方法
我们可以利用拦截器的方法来进行方法的判断和资源信息展示的更改:
拦截器1:来进行携带参数和跳转界面的判断
/** * 手动实现拦截器必须实现HandlerInterceptor接口和它的方法 */ public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("我是拦截器1的目标执行方法前的preHandle"); String param = request.getParameter("username"); if("laowang".equals(param)){ // 判断是否携带参数username,它的值是laowang return true; // 返回true代表放行 }else { request.getRequestDispatcher("/WEB-INF/views/error.jsp").forward(request,response); return false; } } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("我是拦截器1的postHandle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("拦截器1的最后方法"); } }
拦截器2:利用postHandle来更改界面返回的参数
public class MyInterceptorTwo implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("我是拦截器2的preHandle方法,我应该在目标方法执行前和拦截器1的preHandle方法后执行"); return true; //返回true代表放行,返回false代表不放行 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { modelAndView.addObject("name","我是拦截器2修改后的参数"); System.out.println("我是拦截器2的postHandle方法,我应该在目标资源执行后和方法1的postHandle方法执行前"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("我是拦截器2的afterCompletion方法我在目标方法执行后,拦截器1的postHandle方法后执行"); } }
拦截器的配置
<!-- 配置拦截器--> <!-- 将mvc的命名空间导入后配置拦截器--> <mvc:annotation-driven /> <mvc:interceptors> <mvc:interceptor> <!-- 对那些资源进行操作--> <mvc:mapping path="/**"/> <bean class="com.springMvc.Interceptor.MyInterceptor"/><!--指定你的拦截器的具体位置--> </mvc:interceptor> </mvc:interceptors> <!-- 配置拦截器2--> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.springMvc.Interceptor.MyInterceptorTwo"/> </mvc:interceptor> </mvc:interceptors>
结论:
当拦截器的preHandle方法返回true则会执行目标资源,如果返回false则不执行目标资源 多个拦截器情况下,配置在前的先执行,配置在后的后执行 拦截器中的方法执行顺序是:preHandler-------目标资源----postHandle---- afterCompletion