【SpringMVC】拦截器

news2024/11/24 10:25:57

目录
一、概念
二、自定义拦截器的三个实现方法
三、自定义拦截器执行流程
四、使用
五、拦截器和过滤器


相关文章(可以关注我的SpringMVC专栏)

SpingMVC专栏SpingMVC专栏

一、概念

 在学习拦截器之前,我们得先了解一下它是个什么❓
SpringMVC可以通过拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能。
 如何实现自定义的拦截器❓
自定义的拦截器必须实现HandlerInterceptor

二、自定义拦截器的三个实现方法

  1. preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求request 进行处理。
  2. postHandle():这个方法在目标方法处理完请求后执行。
  3. afterCompletion():这个方法在完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。

到这里不知道大家有没有发现,这个SpringMVC中的拦截器和我们学Servlet时的Filter过滤器有点像。至于这个问题我们后边说到。

三、自定义拦截器执行流程图

在这里插入图片描述
自定义拦截器执行流程说明:

  1. 如果 preHandle方法 返回 false, 则不再执行目标方法, 可以在此指定返回页面。
  2. postHandle在目标方法被执行后执行。可以在方法中访问到目标方法返回的ModelAndView 对象。
  3. preHandle返回 true, 则afterCompletion方法 在渲染视图之后被执行。
  4. preHandle返回 false, 则afterCompletion方法不会被调用。
  5. 在配置拦截器时,可以指定该拦截器对哪些请求生效,哪些请求不生效。

四、使用

前端

<%--
  Created by IntelliJ IDEA.
  User: huawei
  Date: 2022/11/30
  Time: 21:42
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>测试自定义拦截器</title>
</head>
<body>
<h1>测试自定义拦截器</h1>
<a href="<%=request.getContextPath()%>/hi">测试拦截器</a>
<a href="<%=request.getContextPath()%>/hello">测试拦截器</a>
</body>
</html>

后端

拦截器1

package com.jl.web.interceptor;

import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * ClassName: MyInterceptor
 * Package: com.jl.web.interceptor
 * Description: 演示自定义拦截器
 *
 * @Author: Long
 * @Create: 2022/11/30 - 21:32
 * @Version: v1.0
 */
@Component
public class MyInterceptor01 implements HandlerInterceptor {
    /**
     * 该方法在目标方法执行前执行,如果该方法返回false,就不再执行目标方法
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterception01----preHandle");
        return true;
    }

    /**
     * 在目标方法执行后会执行该方法
     * 该方法可以获取到 目标方法返回的 ModelAndView
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterception----postHandle");
    }

    /**
     * 在视图渲染后执行
     * 在这里可以做一些资源清理工作
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterception----afterCompletion");

    }
}

拦截器2

package com.jl.web.interceptor;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * ClassName: MyInterception
 * Package: com.jl.web.interceptor
 * Description:
 *
 * @Author: Long
 * @Create: 2022/11/30 - 22:13
 * @Version: v1.0
 */
@Component
public class MyInterceptor02 implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("-----MyInterception02----preHandle");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("-----MyInterception02----postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("-----MyInterception02----afterCompletion");
    }
}

请求的目标Handler

package com.jl.web.interceptor;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * ClassName: FurnHandler
 * Package: com.jl.web.interceptor
 * Description:
 *
 * @Author: Long
 * @Create: 2022/11/30 - 21:40
 * @Version: v1.0
 */
@Controller
public class FurnHandler {

    @RequestMapping(value = "/hi")
    public String hi(){
        System.out.println("----FurnHandler---hi");
        return "success";
    }

    @RequestMapping(value = "/hello")
    public String hello(){
        System.out.println("----FurnHandler---hello");
        return "success";
    }
}

 我们的Handler中提供了两个处理方法。

配置自定义拦截器

<!--配置自定义拦截器-->
  <mvc:interceptors>
      <!--第一种配置方式
          直接使用 ref 引用到对应的 myInterceptor01
          这种方式会拦截所有的目标方法
      -->
      <!--<ref bean="myInterceptor01"/>-->

      <!--第二种配置方式
          mvc:mapping path="/hi/" 指定要拦截的路径
          ref bean="myInterceptor01" 指定对哪个拦截器进行配置
      -->
      <!--<mvc:interceptor>-->
      <!--    <mvc:mapping path="/hi"/>-->
      <!--    <ref bean="myInterceptor01"/>-->
      <!--</mvc:interceptor>-->

      <!--第三种配置方式
          支持通配符
          <mvc:mapping path="/h*"/> h开头的目标方法全部拦截
          <mvc:exclude-mapping path="/hello"/> 不拦截 /hello 路径
      -->
      <mvc:interceptor>
          <mvc:mapping path="/h*"/>
          <mvc:exclude-mapping path="/hello"/>
          <ref bean="myInterceptor01"/>
      </mvc:interceptor>

      <!--配置第二个拦截器
            当有多个拦截器,是按照配置顺序来执行的
      -->
      <mvc:interceptor>
          <mvc:mapping path="/h*"/>
          <ref bean="myInterceptor02"/>
      </mvc:interceptor>
  </mvc:interceptors>

我们这种配置是:拦截器1只拦截hi,而拦截器2hihello都拦截。

下边我们看一下结果:

在这里插入图片描述
请求hi两个拦截器都生效。
在这里插入图片描述请求hello只有拦截器2生效。

五、拦截器和过滤器

在这里插入图片描述
它们的区别大家可以参考此篇文章:

👉拦截器与过滤器的区别

如果文章中有描述不准确或者错误的地方,还望指正。您可以留言📫或者私信我。🙏
最后希望大家多多 关注+点赞+收藏^_^,你们的鼓励是我不断前进的动力!!!
感谢感谢~~~🙏🙏🙏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/157554.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SAP ABAP调用标准事务码

这里介绍常见的几种在开发中常用到的事务代码跳转功能。 1、最常用到的是“SET PARAMETER”语句赋值&#xff0c;然后再使用“CALL TRANSACTION”语句跳转屏幕。 比如采购订单、销售订单、交货单、采购发票、销售发票等事务代码&#xff0c;均可以利用给参数赋值来直接跳转&am…

零售及仓储数字化整理解决方案

价格管控 皮克价格管控方案可实现门店与企业信息管理平台的数据同步&#xff0c;强化零售企业对终端的控制。同时为企业销售决策提供支持&#xff0c;优化门店经营活动的效率和频率。陈列管理 皮克陈列管理方案通过电子价签产品使商品陈列得到固化。 同时实现了陈列可视化&am…

ArcGIS水文分析提取河网及流域

在进行某些研究或者一些论文插图显示的时候&#xff0c;有时我们会碰到在部分资料中找不到一些小的河流或者流域的数据的情况&#xff0c;这里讲述通过DEM数据生成河网及流域。 一、数据来源 四川省高程数据来源于中国科学院资源环境科学与数据中心&#xff08;中国科学院资源环…

Vue3学习之深度剖析CSS Modules和Scope

Css Modules 是通过对标签类名进行加装成一个独一无二的类名&#xff0c;比如.class 转换成.class_abc_123,类似于symbol&#xff0c;独一无二的键名 Css Scope 是通过为元素增加一个自定义属性&#xff0c;这个属性加上独一无二的编号&#xff0c;而实现作用域隔离。 原理 …

爬虫必备抓包工具——Fiddler【认识使用】

目录&#xff1a;1.fiddler &#xff08;抓包工具&#xff09;1.1 引入&#xff1a;HTTP/https代理&#xff08;正向代理&#xff09;1.2 拓展&#xff1a;反向代理&#xff1a;1.2 初识Fiddler①什么是抓包&#xff1f;抓包有什么用&#xff1f;②浅谈fiddler&#xff1a;③fi…

Unity_Skybox自定义插件可实现日夜更替Polyverse Skies | Low Poly

又又一个天空盒,不过这个做的还是比较完善的。。。不会出现买家秀和买家秀差别大问题 此Skybox插件特色提供: 可扩展,自定义很多的Skybox Shader预制体几个,虽然都是夜晚样式(缺白天)若干预设值</

对NIO和BIO的进一步理解

疑问 在之前的学习中&#xff0c;只提到BIO是阻塞IO&#xff0c;在建立连接和读写事件时会阻塞线程。NIO是非阻塞IO&#xff0c;基于事件注册&#xff0c;通过Selector进行切换Channel&#xff0c;不会阻塞线程。对于这种解释&#xff0c;还是带有一些疑问的。Selector进行Cha…

#define 实现快捷模板类实例在eigen::Maxtrix中的应用

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 背景 在eigen库中&#xff0c;矩阵类原来的用法是 Matrix<Type, row, col>。 为了方便用户&#xff0c;库中还提供了用户常用的快捷类型&#xff0c;比如Matrix…

Java-String的API

一、length()package 做题; import java.lang.reflect.Array; import java.security.PublicKey; import java.util.Arrays; import java.util.Scanner;import javax.naming.StringRefAddr;public class Main {public static void main(String[] args) {Scanner sc new Scanne…

ZeroTierr的moon云服务器搭建和使用

搭建moon 问题是ZeroTier One本身的服务器都在国外访问速度很慢。可以通过搭建国内Moon服务加速解决连接慢的问题。 1、 进入云服务器在线安装zerotier curl -s https://install.zerotier.com/ | sudo bash查看安装zerotier版本 sudo zerotier-cli status安装完成后生成moon…

从0到1完成一个Vue后台管理项目(二十二、列表拖拽排序SortableJS)

往期 从0到1完成一个Vue后台管理项目&#xff08;一、创建项目&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;二、使用element-ui&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;三、使用SCSS/LESS&#xff0c;安装图标库&#xff09; 从0到1完成一个Vu…

Python WebGL 3D应用开发快速入门

在本文中&#xff0c;我们将学习如何在Python中使用three.js库&#xff0c;而无需编写任何一行 JavaScript。我们将使用PyWeb3D&#xff0c;这是一个额外的层&#xff0c;旨在与Brython的three.js轻松交互。 1、什么是PyWeb3D&#xff1f; 简单地说&#xff0c;PyWeb3D是一个…

现代JavaScript,你应该使用的10件事

javascripttip&#xff08;3 部分系列&#xff09;1现代 JavaScript&#xff0c;你应该使用的 10 件事&#xff0c;从今天开始2了解如何在 JavaScript 中使用循环3如何在 JavaScript 中学习足够多的 RegEx 才能变得危险您可能对 JavaScript 完全陌生&#xff0c;也可能多年来只…

文件学习笔记

删除线格式 ## 文件描述符 1.文件文件内容文件属性。 2.文件操作文件内容的操作文件属性的操作。 3.所谓的“打开”文件&#xff0c;是指将文件的属性或内容加载到内存中—这是由冯诺依曼决定。 4.所以文件不全打开&#xff0c;不打开的文件放在磁盘存储。 5.内存文件&#xff…

在线教育-谷粒学院学习笔记(三)

文章目录1 搭建前端项目环境2 前端页面框架介绍3 讲师管理前端开发4 后台系统登录功能改造到本地5 前端框架开发过程6 讲师列表前端实现7 讲师分页前端实现8 讲师条件查询前端实现9 讲师删除功能前端实现10 讲师添加前端实现11 讲师修改前端实现12 前端路由切换问题解决1 搭建前…

Linux工具学习之【gdb】

✨个人主页&#xff1a; Yohifo &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f38a;每篇一句&#xff1a; 图片来源 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 Whatever is worth doing is worth doing well. 任何值得去做的事情&#xff0…

【HTML】一款可交互的响应式登陆注册表单,你确定不来看看嘛(附源码)

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

2022年五一杯数学建模C题火灾报警系统问题求解全过程论文及程序

2022年五一杯数学建模 C题 火灾报警系统问题 原题再现&#xff1a; 二十世纪90年代以来&#xff0c;我国火灾探测报警产业化发展非常迅猛&#xff0c;从事火灾探测报警产品生产的企业已超过100家&#xff0c;年产值达几十亿元&#xff0c;已经成为我国高新技术产业的一个组成…

Docker之Nginx部署前端项目

目录 创建nginx容器 nginx.conf讲解 ①所有配置必须以“;”结尾 ②nginx发布java项目 nginx发布静态vue项目 nginxtomcat实现反向代理及均衡 nginxhtml静态服务器 创建nginx容器 docker run –name mynginx -d -p 80:80 -v /data/nginx/conf/nginx.conf:/etc/nginx/ngin…

6款强烈推荐的 SD卡/内存卡数据恢复软件

SD卡/内存卡在 21 世纪的作用比以往任何时候都更加重要。众所周知&#xff0c;SD卡/内存卡具有高数据传输率并且是便携式设备&#xff0c;大多数摄影师甚至智能手机用户主要依靠它们来保存所有个人或项目照片和视频。此外&#xff0c;SD 卡还因其与各种设备的兼容性而广受欢迎。…