SpringBoot之HandlerInterceptor拦截器的使用详解

下面我将为你详细讲解“SpringBoot之HandlerInterceptor拦截器的使用详解”的完整攻略。

一、HandlerInterceptor简介

HandlerInterceptor 是 SpringMVC 拦截器,主要作用是拦截请求并获取请求相关的信息,对请求进行拦截和处理,对响应进行后处理和响应处理。

既然是一个拦截器,那必然就是针对请求进行操作,那么在 springmvc 中,我们的请求是什么呢?在 springmvc 中,请求的处理情况是由 HandlerMethod 对象来维护的,也就是说我们只要能获取到 HandlerMethod 对象,就能对请求进行一系列操作。

二、HandlerInterceptor 拦截器使用方法

HandlerInterceptor 接口中包含了三个方法,分别是 preHandle、postHandle、afterCompletion,这三个方法在处理请求的不同阶段进行调用。具体说明如下:

1、preHandle

该方法在请求处理前进行调用,主要作用是进行拦截操作,返回值为 boolean 类型,当返回值为 true 时,表示拦截器放行,继续执行下一个拦截器或请求处理逻辑;当返回值为 false 时,拦截器拦截请求并进行处理,不再执行下一个拦截器或请求处理逻辑。通常这个方法可以用来做登录验证、Xss 防护等。

2、postHandle

该方法在请求处理后进行调用,主要作用是对返回数据进行处理和包装,在此方法中修改 modelAndView 是无效的,因为这个请求已经执行完毕,要修改返回数据就要使用 HttpServletResponse 对象进行修改。在该方法中可以进行一些资源的回收,例如关闭流。

3、afterCompletion

该方法在请求处理完成后进行调用,主要作用是进行资源的释放操作,以及 完成日志记录等。此时不可以修改响应内容。

如上三个方法的执行顺序就是 preHandle、postHandle、afterCompletion。在执行完请求处理逻辑后,这三个方法按照相反的顺序执行。

三、示例1:拦截未登录用户的请求

下面我们使用一个示例来说明使用 HandlerInterceptor 拦截未登录用户的请求:

首先,我们需要编写一个 LoginInterceptor 来实现拦截逻辑。它继承自 HandlerInterceptorAdapter 父类,并实现 preHandle 方法。

LoginInterceptor.java

public class LoginInterceptor extends HandlerInterceptorAdapter {

    private static final String[] EXCLUDE_URLS = { "/login", "/register", "/error" };

    //重写拦截器的 preHandle 方法
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) throws Exception {
        //如果请求的 URL 没有被排除,则进行拦截
        String requestURI = request.getRequestURI();
        for (String url:EXCLUDE_URLS) {
            if (requestURI.contains(url)) {
                //放行
                return true;
            }
        }
        //如果没有登录,则进行拦截操作
        User loginUser = (User)request.getSession().getAttribute("loginUser");
        if (loginUser != null) {
            return true;
        } else {
            response.sendRedirect(request.getContextPath() + "/login");
            return false;
        }
    }

}

上述代码中,我们要拦截的 URL 被存储在 EXCLUDE_URLS 数组中,如果请求的 URL 包含在排除的列表中,则直接放行。如果请求的 URL 不包含在排除的列表中,则会判断是否有登录,如果登录了则进行放行,反之则进行拦截操作跳转到登录页面。

接着,我们在 WebMvcConfigurerAdapter 子类中重写 addInterceptors 方法来进行自定义拦截器的注册。

MyWebMvcConfig.java

@Configuration
public class MyWebMvcConfig extends WebMvcConfigurerAdapter{

    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor);
    }

}

上述代码中,我们从容器中获取了 LoginInterceptor 并进行了注册。也就是说在服务器启动的时候就注册了一个 LoginInterceptor 拦截器,这个拦截器会进行拦截功能的开启。

四、示例2:拦截指定访问地址的请求

下面我们使用一个示例来说明使用 HandlerInterceptor 拦截指定访问地址的请求:

LoginInterceptor.java

public class AccessInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("AccessInterceptor 进入 preHandle");
        //判断是否为指定访问地址
        String requestURI = request.getRequestURI();
        if ("/admin".equals(requestURI)) {
            //拦截请求并进行处理
            response.getWriter().println("拒绝访问!");
            return false;
        }
        return true;
    }
}

上述代码中,我们在 preHandle 方法中对请求进行处理,如果请求的地址为 /admin,则拒绝访问。注意,我们在这里对响应进行了相应的修改,因为这个请求还没有开始处理,所以在请求处理完毕后,无法再次修改回应内容。

接着,我们在 WebMvcConfigurerAdapter 子类中重写 addInterceptors 方法来进行自定义拦截器的注册。

MyWebMvcConfig.java

@Configuration
public class MyWebMvcConfig extends WebMvcConfigurerAdapter {

    @Autowired
    private AccessInterceptor accessInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //指定拦截器的过滤路径,按顺序进行拦截
        registry.addInterceptor(accessInterceptor).addPathPatterns("/admin/**");
    }
}

上述代码中,我们只对 /admin 开头的请求进行了拦截器过滤。在请求处理的时候,所有的拦截器会按顺序进行拦截,如果没有访问地址匹配,就不会有拦截操作。

五、总结

通过上述示例,我相信你已经很好的了解了如何使用 HandlerInterceptor 拦截器来进行请求拦截的功能开发,在实际项目的开发中,可以按照业务需求,不断调整拦截器的日志、注解、路径、配置等功能,以满足专业的系统功能需求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot之HandlerInterceptor拦截器的使用详解 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • golang构建工具Makefile使用详解

    对于golang构建工具Makefile的使用,以下是详细的攻略: 什么是Makefile Makefile是一个文本文件,其中包含一组用于构建和管理程序的规则。Makefile通过解析这些规则来生成目标文件。Makefile是Golang项目中常见的构建工具,可以简化代码编译、测试和部署的步骤,提高开发效率,这也是你需要学会如何使用Makefile的原因。…

    GitHub 2023年5月16日
    00
  • BootStrap 轮播插件(carousel)支持左右手势滑动的方法(三种)

    BootStrap 轮播插件(carousel)是一款基于 jQuery 和 CSS3 技术的滑动轮播插件,它可以帮助网站快速搭建功能强大的轮播图。同时,它也支持左右手势滑动,实现更好的用户体验。下面将详细讲解三种支持手势滑动的方法,并提供两个示例。 方法一 这种方法可以在Bootstrap原有代码的基础上,直接添加左右手势滑动功能。 // 手势滑动支持 $…

    GitHub 2023年5月16日
    00
  • Xcode9项目上传到GitHub教程

    针对Xcode9项目上传到GitHub,我可以提供以下详细的攻略步骤及示例说明: 一、前置条件 一台配置好Xcode开发环境的Mac设备 一个GitHub账号(若没有请先注册一个) 二、创建GitHub仓库 登录GitHub,点击“New repository”按钮 填写Repository name、Description等信息,设定仓库可见性和初始分支,…

    GitHub 2023年5月16日
    00
  • 如何自己搭建简单的Git服务器

    搭建简单的Git服务器的过程可以被分为两个步骤: 搭建Git服务器 搭建Git服务器需要先安装Git软件并配置SSH服务。在Linux系统中,可以通过以下几个步骤完成Git服务器的搭建: 安装Git软件。在Ubuntu系统中,可以使用以下命令安装: sudo apt-get update sudo apt-get install git 创建Git用户。为了…

    GitHub 2023年5月16日
    00
  • GIt在pyCharm的详细使用教程记录

    下面我将为您详细讲解Git在PyCharm中的详细使用教程记录。 一、Git在PyCharm中的基本配置 首先,您需要在PyCharm中打开一个项目文件夹,然后进行以下配置: 点击顶部菜单栏的“VCS”。 选择“Enable Version Control Integration”。 然后从列表中选择“Git”。 这时,您已经将该项目文件夹与Git关联起来了…

    GitHub 2023年5月16日
    00
  • go实现脚本解释器gscript

    您好,下面是“go实现脚本解释器gscript”的完整攻略。 1. 约定gscript语法规则 在实现gscript之前,我们需要约定gscript语法规则,包含基本数据类型、变量、控制语句等内容。常用的规则包括: 数据类型:gscript支持整形、浮点型、字符串等基本数据类型; 变量:定义变量时需要指定数据类型,变量名以字母或下划线开头,可以包含数字、字母…

    GitHub 2023年5月16日
    00
  • VS2019中Git源代码管理实现总结

    VS2019中Git源代码管理实现总结 Git是目前最流行的分布式版本控制系统,它可以帮助我们更好地管理项目代码。在开发过程中,使用Git作为源代码管理工具已经成为了标配。Visual Studio 2019集成了Git,可以很方便地进行源代码管理。 本文将介绍如何在VS2019中使用Git作为源代码管理工具,并提供两个示例说明。 步骤1:在VS2019中启…

    GitHub 2023年5月16日
    00
  • vue中使用gojs/jointjs的示例代码

    我来为你讲解一下“vue中使用gojs/jointjs的示例代码”的完整攻略,包含以下两条示例说明: 在Vue中使用GoJS 首先需要在Vue项目中安装GoJS库,可以通过npm安装: npm install gojs 安装后,在Vue组件中引入GoJS库,并在mounted钩子函数中初始化并渲染GoJS Diagram: import * as go fr…

    GitHub 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部