我的编程空间,编程开发者的网络收藏夹
学习永远不晚

一文学会 SpringMVC 拦截器

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

一文学会 SpringMVC 拦截器

在这里插入图片描述

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:SSM 框架从入门到精通
✨特色专栏:国学周更-心性养成之路
🥭本文内容:一文学会 SpringMVC 拦截器

在这里插入图片描述

SpringMVC 的拦截器 Interceptor 的主要用来拦截指定的用户请求,并进行相应的预处理或后处理。它的主要作用是拦截用户的请求并进行相应的处理。比如通过它来进行权限验证,或者是来判断用户是否登录等操作。

其拦截的时间点是在处理器适配器执行处理器之前。创建拦截器类需要实现 HandlerInterceptor 接口,然后在配置文件中注册并指定拦截目标。

对于 SpringMVC 拦截器的定义方式有两种:

  • 实现接口: org.springframework.web.servlet.Handlerlnterceptor
  • 继承适配器: org.springframework.web.servethandler.HandlerInterceptorAdapter

项目准备

目录结构:

在这里插入图片描述

为了便于下面知识结构的讲解,先创建好未使用拦截器的项目,步骤如下:

【1】创建 spring-config.xml 文件,代码如下:

                                                    

【2】创建 User 实体类,代码如下:

package cn.hh.springmvc03.entity;import lombok.Data;@Datapublic class User {String username;String password;}

单个拦截器的执行流程

项目案例:创建第一个拦截器。

实现步骤:

【1】新建处理器 UserController,添加方法如下:

//测试拦截器@RequestMapping("/test1.do")public String doTestInterceptor(){System.out.println("执行了处理器的方法!");return "welcome";}

【2】新建包 cn.hh.springmvc03.intercepter,在包下新建一个自定义拦截器类 Intercepter1,实现 HandlerInterceptor 接口,重写以下3个方法,代码如下:

package cn.hh.springmvc03.intercepter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;public class Intercepter1 implements HandlerInterceptor{@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception arg3)throws Exception {System.out.println("执行了Intercepter1 ----------afterCompletion");}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)throws Exception {System.out.println("执行了Intercepter1 ----------postHandle");}@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("执行了Intercepter1 ----------preHandle");return true;}}

自定义拦截器,需要实现HandlerInterceptor接口,实现该接口中的以下三个方法:

  • preHandle(request, response, Object handler): 该方法在处理器方法执行之前执行。其返回值为boolean,若为true,则紧接着会执行处理器方法,且会将afterCompletion()方法放入到一个专门的方法栈中等待执行。若为false则不会执行处理器方法。 
  • postHandle(request, response, Object handler, modelAndView): 该方法在处理器方法执行之后执行。处理器方法若最终未被执行,则该方法不会执行。由于该方法是在处理器方法执行完后执行,且该方法参数中包含ModelAndView,所以该方法可以修改处理器方法的处理结果数据,且可以修改跳转方向。
  • afterCompletion(request, response, Object handler, Exception ex): 当 preHandle()方法返回 true 时,会将该方法放到专门的方法栈中,等到对请求进行响应的所有工作完成之后才执行该方法。

拦截器中方法与处理器方法的执行顺序如图所示。

在这里插入图片描述

也可以这样来看 ,如下图:
在这里插入图片描述
【3】在 spring-config.xml 配置文件中注册拦截器,代码如下:

                                                    

【4】运行测试,则控制台输出如下:

执行了Intercepter1 ----------preHandle执行了处理器的方法!执行了Intercepter1 ----------postHandle执行了Intercepter1 ----------afterCompletion

多个拦截器的执行流程

项目案例: 创建多个拦截器。(在上面案例的基础上编写以下代码)

【1】创建Intercepter2,代码如下所示:

package cn.hh.springmvc03.intercepter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;public class Intercepter2 implements HandlerInterceptor{@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception arg3)throws Exception {System.out.println("执行了Intercepter2----------afterCompletion");}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)throws Exception {System.out.println("执行了Intercepter2----------postHandle");}@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("执行了Intercepter2----------preHandle");return true;}}

【2】在 spring-config.xml 文件中注册多个拦截器,代码如下:

          

【3】运行测试,则控制台输出如下:

执行了Intercepter1 ----------preHandle执行了Intercepter2 ----------preHandle执行了处理器的方法!执行了Intercepter2 ----------postHandle执行了Intercepter1 ----------postHandle执行了Intercepter2 ----------afterCompletion执行了Intercepter1 ----------afterCompletion

当有多个拦截器时,形成拦截器链。拦截器的执行顺序与其注册顺序一致。需要再次强调一点的是当某一个拦截器的 preHandle() 方法返回 true 并被执行到时,会向一个专门的方法栈中放入该拦截器的 afterCompletion() 方法。

多个拦截器方法与处理器方法的执行顺序如下图所示:

在这里插入图片描述
只要有一个 preHandler() 方法返回 false,则上部的执行链将被断开,其后续的处理器方法与 postHandle() 方法将无法执行。但无论执行链执行情况怎样,只要方法栈中有方法,即执行链中只要有 preHandle() 方法返回 true,就会执行方法栈中的 afterCompletion() 方法,最终都会给出响应。

权限拦截器(案例分享)

项目案例: 只有经过登录的用户方可访问处理器,否则,将返回“无权访问”提示。 本例的登录,由一个 JSP 页面完成。即在该页面里将用户信息放入 session 中。也就是说,只要访问过该页面,就说明登录了。没访问过,则为未登录用户。

实现步骤:

【1】web.xml 代码如下:

                dispatcherServlet        org.springframework.web.servlet.DispatcherServlet                    contextConfigLocation            classpath:spring-config.xml                        1                dispatcherServlet        /    

【2】spring-config.xml 配置文件代码如下:

                                                                                                                                                        

【3】UserController 类中添加登陆方法,代码如下:

    //登陆    @RequestMapping("login")    @ResponseBody    public Map login(User user, HttpSession session,@SessionAttribute("code") String attribute){        HashMap map = new HashMap<>();        System.out.println("--------login方法-------"+attribute);        if(user.getCode().equals(attribute)){//验证码填写正确            if("tom".equals(user.getUsername())&&"123456".equals(user.getPassword())){//账号密码正确                session.setAttribute("user",user);                map.put("code",200);                map.put("msg","登陆成功");            }else{//账号密码不正确                map.put("code",500);                map.put("msg","登陆失败");            }        }else{//验证码填写不正确            map.put("code",500);            map.put("msg","验证码输入不正确");        }        return map;    }

【4】添加拦截器 LoginInterceptor 代码如下:

package cn.kgc.springmvc03.interceptor;import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public class LoginInterceptor implements HandlerInterceptor {    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        System.out.println("-------------preHandle方法--------------");        HttpSession session = request.getSession();        Object user = session.getAttribute("user");        if(user==null){            response.sendRedirect("/login.jsp");            return false;        }        return true;    }}

【5】添加前端页面 login.jsp 代码如下:

<%--  Created by IntelliJ IDEA.  User: hhzb100  Date: 2023/3/2  Time: 9:35  To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %>    Title        

【6】运行测试


  码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

在这里插入图片描述

来源地址:https://blog.csdn.net/hh867308122/article/details/129388889

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

一文学会 SpringMVC 拦截器

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

一文学会 SpringMVC 拦截器

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:
2023-08-17

SpringMVC拦截器

7.SpringMVC拦截器 7.1-SpringMVC拦截器-拦截器的作用(理解) Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。 将拦截器按一定的顺序联结成一条链,这
2023-08-19

SpringMVC一步到位精通拦截器

拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行。本文将详细讲讲SpringMVC中拦截器的概念及入门案例,感兴趣的可以尝试一下
2022-12-23

springmvc拦截器如何实现

Spring MVC拦截器可以通过实现HandlerInterceptor接口来实现。具体步骤如下:1. 创建一个类实现HandlerInterceptor接口,并重写其三个方法preHandle、postHandle和afterCompl
2023-09-14

SpringMVC拦截器怎么使用

今天小编给大家分享一下SpringMVC拦截器怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。SpringMVC 的拦
2023-07-05

springmvc实现简单的拦截器

SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的。在SpringMVC 中定义一个Interceptor 非常简单,主要有两种方式,第一种方式是要定义的Interceptor类要实
2023-05-31

Java的SpringMVC拦截器怎么用

今天小编给大家分享一下Java的SpringMVC拦截器怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。拦截器(inte
2023-06-29

SpringMVC拦截器零基础掌握

拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行。本文将详细讲讲SpringMVC中拦截器的概念及入门案例,感兴趣的可以尝试一下
2023-03-12

java SpringMvc中拦截器怎么用

小编给大家分享一下java SpringMvc中拦截器怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是拦截器拦截器(Interceptor)是Sprin
2023-06-29

防止SpringMVC拦截器拦截js等静态资源文件的解决方法

SpringMVC提供来设置静态资源,但是增加该设置如果采用通配符的方式增加拦截器的话仍然会被拦截器拦截,可采用如下方案进行解决:方案一、拦截器中增加针对静态资源不进行过滤(涉及spring-mvc.xml)<
2023-05-31

Java中SpringMVC拦截器怎么用

这篇文章主要为大家展示了“Java中SpringMVC拦截器怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java中SpringMVC拦截器怎么用”这篇文章吧。拦截器(intercepto
2023-06-25

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录