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

SpringMVC拦截器零基础掌握

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

SpringMVC拦截器零基础掌握

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

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

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

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

项目准备

目录结构:

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

【1】创建 spring-config.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 http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!-- 配置视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--逻辑视图前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <!--逻辑视图后缀,匹配模式:前缀+逻辑视图+后缀,形成完整路径名-->
        <property name="suffix" value=".jsp"></property>
    </bean>
    <!-- 配置组件扫描器 -->
    <context:component-scan base-package="cn.hh.springmvc03"/>
</beans>

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

package cn.hh.springmvc03.entity;
import lombok.Data;
@Data
public 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{
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception arg3)
			throws Exception {
		System.out.println("执行了Intercepter1 ----------afterCompletion");
	}
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
			throws Exception {
		System.out.println("执行了Intercepter1 ----------postHandle");
	}
	@Override
	public 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 配置文件中注册拦截器,代码如下:

    <!-- 注册拦截器 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="cn.hh.springmvc03.intercepter.Intercepter1"/>
        </mvc:interceptor>
    </mvc:interceptors>

【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{
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception arg3)
			throws Exception {
		System.out.println("执行了Intercepter2----------afterCompletion");		
	}
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
			throws Exception {
		System.out.println("执行了Intercepter2----------postHandle");		
	}
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		System.out.println("执行了Intercepter2----------preHandle");
		return true;
	}
}

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

	<!-- 注册多个拦截器 -->
	<mvc:interceptors>
		 <mvc:interceptor>
		 	<mvc:mapping path="/**"/>
		 	<bean class="com.lifeng.intercepter.Intercepter1"/>
		 </mvc:interceptor>
		 <mvc:interceptor>
		 	<mvc:mapping path="/**"/>
		 	<bean class="com.lifeng.intercepter.Intercepter2"/>
		 </mvc:interceptor>
 	</mvc:interceptors>

【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 代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
		  http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
           version="3.0">
    <!--配置前端控制器-->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-config.xml</param-value>
        </init-param>
        <!--tomcat启动就创建该实例对象-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

【2】spring-config.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 http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!--实现更加强大的功能,支持json数据格式的解析-->
    <mvc:annotation-driven></mvc:annotation-driven>
    <!--第5步:配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--前缀配置-->
        <property name="prefix" value="/"></property>
        <!--后缀配置-->
        <property name="suffix" value=".jsp"></property>
    </bean>
    <!--第6步:开启包扫描  base-package  设置需要扫描的包 -->
    <context:component-scan base-package="cn.kgc.springmvc03"></context:component-scan>
    <!--静态资源的处理 不需要经过前端控制器  tomcat-->
    <mvc:default-servlet-handler></mvc:default-servlet-handler>
    <!--配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/user/login"/>
            <mvc:exclude-mapping path="/user/getcode"/>
            <bean  class="cn.kgc.springmvc03.interceptor.LoginInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>
    <!--配置文件上传组件-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
</beans>

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

    //登陆
    @RequestMapping("login")
    @ResponseBody
    public Map<String,Object> login(User user, HttpSession session,@SessionAttribute("code") String attribute){
        HashMap<String, Object> 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.
  Time: 9:35
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript" class="lazy" data-src="jquery-1.11.1.js"></script>
    <script class="lazy" data-src="https://s3.pstatp.com/cdn/expire-1-M/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
<form>
    <p><input type="text" name="username" placeholder="请输入用户名" id="username"></p>
    <p><input type="password" name="password" placeholder="请输入密码" id="password"></p>
    <p><input type="text" name="code" placeholder="请输入验证码" id="code"></p>
    <p><input type="button" value="登录" id="login"></p>
</form>
<span id="msg" style="color: red"></span>
</body>
<script>
    $("#login").click(function () {
        let username=$("#username").val()
        let password =   $("#password").val()
        let code =   $("#code").val()

        $.get("/user/login",{username,password,code},function (res) {
            if(res.code=200){
                window.location.href="/main.jsp" rel="external nofollow" 
            }else{
                let info = res.msg
                $("#msg").text(info)
            }
        })
    });
</script>
</html>

到此这篇关于SpringMVC拦截器零基础掌握的文章就介绍到这了,更多相关SpringMVC拦截器内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

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

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

SpringMVC拦截器零基础掌握

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

下载Word文档

猜你喜欢

SpringMVC拦截器零基础掌握

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

Node.js WebSocket 入门:从零基础到掌握

Node.js WebSocket 入门:掌握现代实时通信技术的全面指南
Node.js WebSocket 入门:从零基础到掌握
2024-03-01

零基础学Java要掌握哪些技能

本篇内容介绍了“零基础学Java要掌握哪些技能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  初学者先弄清这些Java的基本概念也是必不可
2023-06-02
Python 基础的探险之旅:从零基础到熟练掌握
2024-03-13

C语言零基础彻底掌握预处理上篇

在C语言的程序中包括各种以符号#开头的编译指令,这些指令称为预处理命令。预处理命令属于C语言编译器,而不是C语言的组成部分,通过预处理命令可扩展C语言程序设计的环境
2022-11-13

C语言零基础彻底掌握预处理下篇

在C语言的程序中包括各种以符号#开头的编译指令,这些指令称为预处理命令。预处理命令属于C语言编译器,而不是C语言的组成部分,通过预处理命令可扩展C语言程序设计的环境
2022-11-13

JavaScript Jasmine:零基础入门,轻松掌握前端测试

JavaScript Jasmine是一个开源的、行为驱动的测试框架,用于编写前端测试。它使用简洁的语法和清晰的输出,让您轻松测试您的JavaScript代码。
JavaScript Jasmine:零基础入门,轻松掌握前端测试
2024-02-11

JavaScript基础知识全攻略:从零开始轻松掌握

JavaScript是一种功能强大且广泛使用的编程语言,通常用于创建和增强网页的交互性和动态性。本指南将从头开始介绍JavaScript的基础知识,带领您逐步深入学习,帮助您轻松掌握这门语言。
JavaScript基础知识全攻略:从零开始轻松掌握
2024-02-08

Java Map 入门指南:零基础轻松掌握集合框架的基础知识

Java Map 是 Java 集合框架中最重要的数据结构之一,它允许您将键映射到值。这使得查找和检索数据变得非常容易和高效。本文将向您介绍 Java Map 的基本概念、不同类型的 Map 实现以及如何使用它们。
Java Map 入门指南:零基础轻松掌握集合框架的基础知识
2024-02-09

一文详解Java过滤器拦截器实例逐步掌握

这篇文章主要为大家介绍了Java过滤器拦截器实例详解逐步掌握,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-15

Shadow DOM入门教程:零基础掌握,通往卓越的阶梯

Shadow DOM 入门教程:揭秘网页开发的独特领域,掌握现代前端技术的关键。
Shadow DOM入门教程:零基础掌握,通往卓越的阶梯
2024-02-22

从零开始学习canvas:掌握基础知识的方法指南

零基础入门canvas:从头开始学习canvas方法的基本知识,需要具体代码示例当我们谈到在网页上绘制图形和动画时,HTML5中的canvas元素无疑是一个非常有用的工具。虽然对于初学者来说,canvas可能会有些令人生畏,但只要有一个良
从零开始学习canvas:掌握基础知识的方法指南
2024-01-17

零基础学习如何快速掌握CSS框架:快速入门指南

CSS框架快速入门指南:从零开始学习如何快速做好CSS框架,需要具体代码示例引言:在当今的Web开发中,CSS框架被广泛应用于构建漂亮、响应式的网页设计。CSS框架可以帮助开发者快速搭建美观、一致的网页布局,减少开发时间。本文将介绍如何从
零基础学习如何快速掌握CSS框架:快速入门指南
2024-01-16

逐步掌握常用的CSS基础选择器

了解CSS代码基本选择器:一步步掌握常用选择器在HTML和CSS中,选择器是用来选择元素并应用样式的重要工具。了解和熟练使用CSS代码中的基本选择器是成为优秀前端开发人员的基本要求之一。本文将逐步介绍CSS代码中的常用选择器,帮助读者掌握选
逐步掌握常用的CSS基础选择器
2023-12-26

轻松掌握PyQt5安装步骤:简单易懂,零基础也能轻松上手!

轻松掌握PyQt5安装步骤:简单易懂,零基础也能轻松上手!PyQt5是一个用于创建桌面GUI应用程序的Python库,它结合了Python的灵活性和Qt框架的强大功能。无论是初学者还是有经验的开发者,都可以通过几个简单的步骤来安装PyQt
轻松掌握PyQt5安装步骤:简单易懂,零基础也能轻松上手!
2024-02-23

编程热搜

  • 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动态编译

目录