1.多个拦截器:65
web.xml和pom.xml配置不整理
index.jsp
<%--异常处理 57--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><% String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/";%><html><head> <title>Title</title> <base href="<%=basePath%>" /></head><body><p>多个拦截器</p><form action="some.do" method="post"> 姓名:<input type="text" name="name"> <br/> 年龄:<input type="text" name="age"> <br/> <input type="submit" value=“提交请求”></form></body></html>
springmvc.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--声明组件扫描仪 8--> <context:component-scan base-package="com.bjpowernode.controller" /> <!--声明 视图解析器在springmvc框架中, 帮助开发人员设置视图文件的路径 40--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--前缀:视图文件的路径--> <property name="prefix" value="/WEB-INF/view/" /> <!--后缀:视图文件扩展名称--> <property name="suffix" value=".jsp" /> </bean> <!--声明拦截器: 拦截器可以有0或多个 65 ArrayList将多个拦截器保存在框架中, 按照声明的顺序放入ArrayListt --> <mvc:interceptors> <!--声明第一个拦截器--> <mvc:interceptor> <mvc:mapping path=/**> <!--声明拦截器对象--> <bean class="com.bjpowernode.handler.MyInterceptor" /> </mvc:interceptor> <!--声明第二个拦截器--> <mvc:interceptor> <mvc:mapping path=/**> <!--声明拦截器对象--> <bean class="com.bjpowernode.handler.Myinterceptor2 /> </mvc:interceptor> </mvc:interceptors></beans>
MyControlerler
package com.bjpowernode.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.servlet.ModelAndView;/** * 多个拦截器 65 */@Controllerpublic class MyController { @RequestMapping(value = "/some.do") public ModelAndView doSome(String name,Integer age){ System.out.println(" =====执行Mycontroler中的dosome方法====); ///处理some.do请求了。 相当于service调用处理的完成。 ModelAndView mv = new ModelAndView(); mv.addObject("myname",name); mv.addObject("myage",age); mv.setViewName("show"); return mv; }}
设置多个拦截器1Myinterceptor
package com.bjpowernode.handler;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.util.Date;///执行多个拦截器 65public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println(111拦截器MyinterceptorpreHandle(); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mv) throws Exception { System.out.println(111拦截器Myinterceptorposthandle(); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println(111拦截器Myinterceptoraftercompletion()); }}
截取器2Myinterceptor
package com.bjpowernode.handler;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//多个拦截器的执行 65public class Myinterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println(222拦截器MyinterceptorpreHandle(); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mv) throws Exception { System.out.println(222拦截器Myinterceptorposthandle(); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println((222拦截器Myinterceptoraftercompletion()); }}
2.多个拦截器执行顺序652.1图
多个拦截器中方法和处理器方法的执行顺序如下
2.2第一个拦截器preHandle=true,第二个拦截器preHandle=true65查看执行顺序
当有多个拦截器时,形成拦截器链。拦截器链的执行顺序与其注册顺序一致。需要再次
第二个强调的是,当某个拦截器的preHandle()方法返回true并执行时,它将是一个特殊的
将拦截器afterCompletion()放入门的方法栈中。
2.3第一个拦截器preHandle=true,第二个拦截器preHandle=false6 2.4第一个拦截器preHandle=false,第二拦截器preHandle=true|false66 3.总结66从图中和上述例子可以看出,只要有preHandle()方法返回false,上部执行链就会断开,处理器中的方法也不会执行,后续的处理器方法和postHandle()方法也不会执行。但是,无论执行链的执行情况如何,只要方法栈中有方法,即只要执行链中有prehandle()方法返回true,就会执行方法栈中的aftercompletion()方法。最终会有回应。
另一种表达方式也可以这样理解:
4.拦截器和过滤器的区别671.过滤器是servlet中的对象,拦截器是框架中的对象
2.过滤器实现Filter接口的对象,拦截器实现Handlerinterceptor
3.过滤器用于设置request和response的参数、属性和数据过滤。
拦截器用于验证请求,并且可以切断请求。
4.拦截器前应执行过滤器。
5.过滤器是tomcat服务器创建的对象
拦截器是在springmvc容器中创建的对象
6.过滤器是执行时间点。
拦截器有三个执行时间点
7.过滤器可以处理jsp,js,html等等
拦截器是关注拦截Controller的对象。如果您的请求不能被Dispatcherservlet接收,则该请求不会执行拦截器的内容
8.实施拦截器拦截的一般方法,过滤器过滤servlet请求响应