当前位置: 首页 > 图灵资讯 > 技术篇> 多个拦截器的执行

多个拦截器的执行

来源:图灵教育
时间:2023-06-09 10:13:23

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图

多个拦截器中方法和处理器方法的执行顺序如下

多个拦截器的执行_spring

多个拦截器的执行_mvc_02

2.2第一个拦截器preHandle=true,第二个拦截器preHandle=true65

查看执行顺序

多个拦截器的执行_mvc_03

当有多个拦截器时,形成拦截器链。拦截器链的执行顺序与其注册顺序一致。需要再次

第二个强调的是,当某个拦截器的preHandle()方法返回true并执行时,它将是一个特殊的

将拦截器afterCompletion()放入门的方法栈中。

2.3第一个拦截器preHandle=true,第二个拦截器preHandle=false6

多个拦截器的执行_mvc_04

2.4第一个拦截器preHandle=false,第二拦截器preHandle=true|false66

多个拦截器的执行_mvc_05

3.总结66

从图中和上述例子可以看出,只要有preHandle()方法返回false,上部执行链就会断开,处理器中的方法也不会执行,后续的处理器方法和postHandle()方法也不会执行。但是,无论执行链的执行情况如何,只要方法栈中有方法,即只要执行链中有prehandle()方法返回true,就会执行方法栈中的aftercompletion()方法。最终会有回应。

另一种表达方式也可以这样理解:

多个拦截器的执行_拦截器_06

4.拦截器和过滤器的区别67

1.过滤器是servlet中的对象,拦截器是框架中的对象

2.过滤器实现Filter接口的对象,拦截器实现Handlerinterceptor

3.过滤器用于设置request和response的参数、属性和数据过滤。

拦截器用于验证请求,并且可以切断请求。

4.拦截器前应执行过滤器。

5.过滤器是tomcat服务器创建的对象

拦截器是在springmvc容器中创建的对象

6.过滤器是执行时间点。

拦截器有三个执行时间点

7.过滤器可以处理jsp,js,html等等

拦截器是关注拦截Controller的对象。如果您的请求不能被Dispatcherservlet接收,则该请求不会执行拦截器的内容

8.实施拦截器拦截的一般方法,过滤器过滤servlet请求响应

上一篇:

Thymeleaf模板

下一篇:

拦截器