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);
    }
}

2. 修改 application.yml

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

#凡是请求地址层级带有 open 都放行
open:
  url: /**/open/**

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);
    }
}

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 "我被拦截了并通过了拦截器";
    }
}

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 "登录失效,请重新登录";
    }

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 "登录失效,请重新登录";
    }
}

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);
    }
}

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
    在这里插入图片描述

在这里插入图片描述

相关文章
|
16天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
35 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
16天前
|
Java 关系型数据库 数据库
京东面试:聊聊Spring事务?Spring事务的10种失效场景?加入型传播和嵌套型传播有什么区别?
45岁老架构师尼恩分享了Spring事务的核心知识点,包括事务的两种管理方式(编程式和声明式)、@Transactional注解的五大属性(transactionManager、propagation、isolation、timeout、readOnly、rollbackFor)、事务的七种传播行为、事务隔离级别及其与数据库隔离级别的关系,以及Spring事务的10种失效场景。尼恩还强调了面试中如何给出高质量答案,推荐阅读《尼恩Java面试宝典PDF》以提升面试表现。更多技术资料可在公众号【技术自由圈】获取。
|
16天前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
59 5
|
13天前
|
Java 数据库连接 数据库
从入门到精通---深入剖析Spring DAO
在Java企业级开发中,Spring框架以其强大的功能和灵活性,成为众多开发者的首选。Spring DAO(Data Access Object)作为Spring框架中处理数据访问的重要模块,对JDBC进行了抽象封装,极大地简化了数据访问异常的处理,并能统一管理JDBC事务。本文将从概述、功能点、背景、业务点、底层原理等多个方面深入剖析Spring DAO,并通过多个Java示例展示其应用实践,同时指出对应实践的优缺点。
20 1
|
17天前
|
监控 Java 数据安全/隐私保护
如何用Spring Boot实现拦截器:从入门到实践
如何用Spring Boot实现拦截器:从入门到实践
37 5
|
20天前
|
JavaScript Java 关系型数据库
Spring事务失效的8种场景
本文总结了使用 @Transactional 注解时事务可能失效的几种情况,包括数据库引擎不支持事务、类未被 Spring 管理、方法非 public、自身调用、未配置事务管理器、设置为不支持事务、异常未抛出及异常类型不匹配等。针对这些情况,文章提供了相应的解决建议,帮助开发者排查和解决事务不生效的问题。
|
1月前
|
前端开发 Java 开发者
Spring生态学习路径与源码深度探讨
【11月更文挑战第13天】Spring框架作为Java企业级开发中的核心框架,其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身,更需要深入理解其周边组件和工具,以及源码的底层实现逻辑。本文将从Spring生态的学习路径入手,详细探讨如何系统地学习Spring,并深入解析各个重点的底层实现逻辑。
59 9
|
2月前
|
前端开发 Java 数据库
SpringBoot学习
【10月更文挑战第7天】Spring学习
38 9
|
26天前
|
Java Kotlin 索引
学习Spring框架特性及jiar包下载
Spring 5作为最新版本,更新了JDK基线至8,修订了核心框架,增强了反射和接口功能,支持响应式编程及Kotlin语言,引入了函数式Web框架,并提升了测试功能。Spring框架可在其官网下载,包括文档、jar包和XML Schema文档,适用于Java SE和Java EE项目。
28 0
|
2月前
|
XML Java 数据格式
Spring学习
【10月更文挑战第6天】Spring学习
23 1