当前位置: 首页 > news >正文

SpringMVC的拦截器

SpringMVC的拦截器

SpringMVC的拦截器

  • SpringMVC的拦截器
    • 01-SpringMVC拦截器-拦截器的作用(理解)
    • 02-SpringMVC拦截器-interceptor和filter区别(理解,记忆)
    • 03-SpringMVC拦截器-快速入门(应用)
      • (1)项目前准备
      • (2)快速入门

01-SpringMVC拦截器-拦截器的作用(理解)

  • Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理后处理
  • 将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(InterceptorChain)。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。拦截器也是AOP思想的具体实现。

02-SpringMVC拦截器-interceptor和filter区别(理解,记忆)

  • 关于interceptor和filter的区别,如图所示:
    在这里插入图片描述

03-SpringMVC拦截器-快速入门(应用)

(1)项目前准备

  • 首先参照文章👉👉👉Spring课程工程构建➕SpringMVC简介及其快速入门搭建项目👈👈👈搭建好一个项目itheima_spring_interceptor
  • 在创建好的项目里面根据上面的文章,依次①导入SpringMVC相关坐标、②配置SpringMVC核心控制器DispathcerServlet、③创建Controller类和视图页面、④使用注解配置Controller类中业务方法的映射地址、⑤配置SpringMVC核心文件spring-mvc.xml。
  • 在项目里面src\main\java创建com.itheima.controller包,然后新建一个TargetController类。
package com.itheima.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;@Controller
public class TargetController {@RequestMapping("/target")public ModelAndView show(){System.out.println("目标资源执行......");ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("name","itcast");modelAndView.setViewName("index");return modelAndView;}
}
  • src\main\resources\spring-mvc.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.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
"><!--1.mvc注解驱动--><mvc:annotation-driven/><!--2.配置视图解析器--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/"/><property name="suffix" value=".jsp"/></bean><!--3.静态资源权限开放--><mvc:default-servlet-handler/><!--4.组件扫描,扫描Controller--><context:component-scan base-package="com.itheima.controller"/>
</beans>
  • webapp里面创建index.jsp文件。
<html>
<head><title>Title</title>
</head>
<body>
<h1>Hello World!! ${name} </h1>
</body>
</html>

(2)快速入门

  • 自定义拦截器很简单,只有如下三步:
  • ①、编写拦截器:创建拦截器类实现HandlerInterceptor接口,在com.itheima.interceptor包里创建拦截器类MyInterceptor1
package com.itheima.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 MyInterceptor1 implements HandlerInterceptor {//在目标方法执行之前 执行@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle...");return true;//返回值是false,那么后面的postHandle、afterCompletion都无法执行}//在目标方法执行之后 视图对象返回之前执行@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle...");}//在整个流程都执行完毕后 执行@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion...");}
}
  • ②配置拦截器;配置:在SpringMVC的配置文件中配置
<!--配置拦截器-->
<mvc:interceptors><mvc:interceptor><!--对哪些资源执行拦截操作--><mvc:mapping path="/**"/><!--所有资源--><bean class="com.itheima.interceptor.MyInterceptor1"/></mvc:interceptor>
</mvc:interceptors>
  • ③测试拦截器的拦截效果
  • 编写测试程序测试:
  • 编写Controller,发请求到controller,跳转页面
    在这里插入图片描述
  • 当拦截器的preHandle方法返回true则会执行目标资源,如果返回false则不执行目标资源;
    在这里插入图片描述
  • 拦截器中的方法执行顺序是:preHandler-------目标资源----postHandle---- afterCompletion
    在这里插入图片描述
 //在目标方法执行之前 执行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle...");String param = request.getParameter("param");if ("yes".equals(param)){return true;}else {request.getRequestDispatcher("/error.jsp").forward(request,response);return false;}
}

在这里插入图片描述

  //在目标方法执行之后 视图对象返回之前执行
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {modelAndView.addObject("name","itheima");System.out.println("postHandle...");
}

在这里插入图片描述

  • 拦截器在预处理后什么情况下会执行目标资源,什么情况下不执行目标资源,以及在有多个拦截器的情况下拦截器的执行顺序是什么?
  • 再编写一个拦截器2,
public class MyInterceptor2 implements HandlerInterceptor {//在目标方法执行之前 执行public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {System.out.println("preHandle22222.....");return true;}//在目标方法执行之后 视图对象返回之前执行public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {System.out.println("postHandle2222...");}//在流程都执行完毕后 执行public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {System.out.println("afterCompletion2222....");}
}
  • 配置拦截器2
<!--配置拦截器-->
<mvc:interceptors><mvc:interceptor><!--对哪些资源执行拦截操作--><mvc:mapping path="/**"/><bean class="com.itheima.interceptor.MyInterceptor2"/></mvc:interceptor><mvc:interceptor><!--对哪些资源执行拦截操作--><mvc:mapping path="/**"/><bean class="com.itheima.interceptor.MyInterceptor1"/></mvc:interceptor>
</mvc:interceptors>
  • 结论:
    当拦截器的preHandle方法返回true则会执行目标资源,如果返回false则不执行目标资源
    多个拦截器情况下,配置在前的先执行,配置在后的后执行
http://www.lryc.cn/news/45204.html

相关文章:

  • dolphinscheduler-3.1.4
  • 大前端05-用vue轻量级第三方组件库快速创建个画板,可以支持画板、直线、圆形等输入,可以撤回,改变颜色
  • ChatGPT使用案例之生成PPT
  • ChatGPT基础知识系列之模型介绍
  • ChatGPT助力软件开发
  • 这些关于高压放大器的常识,你知道多少?(二)
  • 使用神经网络中的卷积核生成语谱图
  • 文章五:Python 网络爬虫实战:使用 Beautiful Soup 和 Requests 抓取网页数据
  • 【大数据之Hadoop】八、MapReduce之序列化
  • Python网络爬虫之Selenium详解
  • 中睿天下受邀出席电促会第五次会员代表大会
  • Chat GPT:软件测试人员的危机?
  • 【Redis】高可用:Redis的主从复制是怎么实现的?
  • WLAN速度突然变慢
  • GDAL python教程基础篇(12)GDAL和 Pillow 的互操作
  • 快速学习java路线建议
  • 【MySQL】深入浅出主从复制数据同步原理
  • Redis持久化和高可用
  • 【数据结构】第六站:栈和队列
  • python matplotlib 绘制训练曲线 综合示例——平滑处理、图题设置、图例设置、字体大小、线条样式、颜色设置
  • vue-element-plus-admin整合后端实战——实现系统登录、缓存用户数据、实现动态路由
  • Shader Graph2-PBR介绍之表面属性(图解)
  • Java多线程编程,Thread类的基本用法讲解
  • TIA博途Wincc_多路复用变量的使用方法示例(实现多台相同设备参数的画面精简)
  • 关于console你不知道的那些事
  • Java设计模式-责任链模式
  • 顺序表设计循环队列
  • UEFI 基础教程 (十四) - 设置默认启动项为UEFI Shell
  • python编程:判断一个数是否是超级素数
  • 雷迪RD8200管线探测仪参数/管线仪使用方法/管线仪说明书