springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现

简介: 这篇文章是关于Spring Boot 2.x中拦截器的入门教程和实战项目场景实现的详细指南。

导言

SpringBoot 拦截器和过滤器区别及应用

一、拦截器

  1. 拦截器是什么?
    简单的来说,就是一道阀门,在某个方法被访问之前,进行拦截,然后在之前或之后加入某些操作,拦截器是AOP 的一种实现策略。
  2. 拦截器主要做什么?
    • 对正在运行的流程进行干预。
  3. 拦截器的代码实现。拦截器也主要有三个方法:
    • 其中preHandle是在请求之前就进行调用,如果该请求需要被拦截,则返回false,否则true;
    • postHandle是在请求之后进行调用,无返回值;
    • afterCompletion是在请求结束的时候进行调用,无返回值。

二、创建项目 springboot-interceptor

  1. 根据 springboot 学习二:springboot 第一次创建 web 项目,打包项目并测试成功 博文,快速创建本项目:springboot-interceptor
  2. 项目依赖仅勾选web即可。
  3. 项目结构如下:(记得修改application配置文件的后缀为 yml)
    在这里插入图片描述

三、Interceptor 快速入门

那么在 springBoot 中如何使用拦截器呢?
步骤:

  1. 创建一个类实现 HandlerInterceptor 接口
  2. 再创建一个配置类实现 WebMvcConfigurer接口 ,重写 addInterceptors 方法

1. 创建拦截器类

创建我们自己的拦截器类并实现 HandlerInterceptor 接口。

package com.feng.springboot_interceptor.interceptor;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

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

public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor....在请求处理之前进行调用(Controller方法调用之前)");
        String requestUrl = request.getRequestURI();
        System.out.println("过滤器MyFilter拦截了请求为" + requestUrl);
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor...请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)");
        //HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor....在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对 应的视图之后执行(主要是用于进行资源清理工作)");
        //HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}
AI 代码解读

2. 修改 application.yml

修改 application.properties 加入开发接口通配地址

#凡是请求地址层级带有 open 都放行
open:
  url: /**/open/**
AI 代码解读

3. 实现 WebMvcConfigurer

创建一个 Java 实现 WebMvcConfigurer , 并重写 addInterceptors 方法。

package com.feng.springboot_interceptor.config;

import com.feng.springboot_interceptor.interceptor.MyInterceptor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebAppConfig implements WebMvcConfigurer {
    @Value("${open.url}")
    private String openUrl;

    @Bean
    public MyInterceptor getMyInterceptor() {
        return new MyInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截以 /api 开头的请求,但是排除  openUrl:/**/open/**。 即 :匹配这个(/**/open/**)URL的所有请求不拦截
        registry.addInterceptor(getMyInterceptor()).addPathPatterns("/api/**").excludePathPatterns(openUrl);
        // WebMvcConfigurer.super.addInterceptors(registry);
    }
}
AI 代码解读

4. 创建接口Interceptorcontroller

package com.feng.springboot_interceptor.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class InterceptorController {

    @GetMapping("/home/open/info")
    public String home() {
        return "欢迎来到首页";
    }

    @GetMapping("/user/interceptor")
    public String interceptor() {
        return "我被拦截了并通过了拦截器";
    }
}
AI 代码解读

5. 项目结构

在这里插入图片描述

6. 测试

  1. 带有open http://localhost:8080/api/open/home/info 不拦截
    在这里插入图片描述
  2. 不带open http://localhost:8080/api/user/interceptor 拦截
    在这里插入图片描述
    在这里插入图片描述

四、拦截校验用户是否登录实战

1. 加入需要权鉴接口、未登录接口

a、加入接口

    @GetMapping("/open/unLogin")    // 带 open 放行
    public String getUnauthorized() {
        return "登录失效,请重新登录";
    }
AI 代码解读

b、全部接口

package com.feng.springboot_interceptor.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class InterceptorController {

    @GetMapping("/home/open/info") // 带 open 放行
    public String home() {
        return "欢迎来到首页";
    }

    @GetMapping("/user/interceptor")
    public String interceptor() {
        return "我被拦截了并通过了拦截器";
    }

    @GetMapping("/open/unLogin")    // 带 open 放行
    public String getUnauthorized() {
        return "登录失效,请重新登录";
    }
}
AI 代码解读

2. 修改拦截器校验逻辑

package com.feng.springboot_interceptor.interceptor;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

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

public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor....在请求处理之前进行调用(Controller方法调用之前)");
        String requestUrl = request.getRequestURI();
        System.out.println(requestUrl + "被 MyInterceptor 拦截了"); //判断是否携带凭证就可以了

        String token = request.getHeader("token");
        if (StringUtils.isEmpty(token)) {
            request.getRequestDispatcher("/api/open/unLogin").forward(request, response);
            return false;
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor...请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)");
        //HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor....在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对 应的视图之后执行(主要是用于进行资源清理工作)");
        //HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}
AI 代码解读

3. 测试

a. 首先访问 开放接口

http://localhost:8080/api/home/open/info
在这里插入图片描述
在这里插入图片描述

b. 访问 需权鉴接口

  1. 带 token
    http://localhost:8080/api/user/interceptor
    在这里插入图片描述

在这里插入图片描述

  1. 不带 token:http://localhost:8080/api/user/interceptor
    在这里插入图片描述

在这里插入图片描述

目录
打赏
0
0
0
0
51
分享
相关文章
|
9天前
|
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
40 0
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
42 0
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ安装
本教程介绍ActiveMQ的安装与基本使用。首先从官网下载apache-activemq-5.15.3版本,解压后即可完成安装,非常便捷。启动时进入解压目录下的bin文件夹,根据系统选择win32或win64,运行activemq.bat启动服务。通过浏览器访问`http://127.0.0.1:8161/admin/`可进入管理界面,默认用户名密码为admin/admin。ActiveMQ支持两种消息模式:点对点(Queue)和发布/订阅(Topic)。前者确保每条消息仅被一个消费者消费,后者允许多个消费者同时接收相同消息。
38 0
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ安装
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——发布/订阅消息的生产和消费
本文详细讲解了Spring Boot中ActiveMQ的发布/订阅消息机制,包括消息生产和消费的具体实现方式。生产端通过`sendMessage`方法发送订阅消息,消费端则需配置`application.yml`或自定义工厂以支持topic消息监听。为解决点对点与发布/订阅消息兼容问题,可通过设置`containerFactory`实现两者共存。最后,文章还提供了测试方法及总结,帮助读者掌握ActiveMQ在异步消息处理中的应用。
57 0
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ集成
本文介绍了在 Spring Boot 中集成 ActiveMQ 的详细步骤。首先通过引入 `spring-boot-starter-activemq` 依赖并配置 `application.yml` 文件实现基本设置。接着,创建 Queue 和 Topic 消息类型,分别使用 `ActiveMQQueue` 和 `ActiveMQTopic` 类完成配置。随后,利用 `JmsMessagingTemplate` 实现消息发送功能,并通过 Controller 和监听器实现点对点消息的生产和消费。最后,通过浏览器访问测试接口验证消息传递的成功性。
19 0
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ—— JMS 和 ActiveMQ 介绍
本文介绍如何在Spring Boot中集成ActiveMQ,首先阐述了JMS(Java消息服务)的概念及其作为与具体平台无关的API在异步通信中的作用。接着说明了JMS的主要对象模型,如连接工厂、会话、生产者和消费者等,并指出JMS支持点对点和发布/订阅两种消息类型。随后重点讲解了ActiveMQ,作为Apache开源的消息总线,它完全支持JMS规范,适用于异步消息处理。最后,文章探讨了在Spring Boot中使用队列(Queue)和主题(Topic)这两种消息通信形式的方法。
24 0
|
9天前
|
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Spring Boot 集成 Redis
本文介绍了在Spring Boot中集成Redis的方法,包括依赖导入、Redis配置及常用API的使用。通过导入`spring-boot-starter-data-redis`依赖和配置`application.yml`文件,可轻松实现Redis集成。文中详细讲解了StringRedisTemplate的使用,适用于字符串操作,并结合FastJSON将实体类转换为JSON存储。还展示了Redis的string、hash和list类型的操作示例。最后总结了Redis在缓存和高并发场景中的应用价值,并提供课程源代码下载链接。
31 0
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
1181 1
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
springboot webflux r2dbc入门案例
springboot webflux r2dbc入门案例
380 0
SpringBoot基础知识入门详细介绍&基于SpringBoot的SSMP整合案例(2)
(一)快速上手SpringBoot SpringBoot入门程序开发 SpringBoot是由pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等