SpringBoot项目拦截器过滤器配置

2023-11-20

1.我们在配置拦截器时需实现接口HandlerInterceptor

package com.example.springbootdemo.common.conf.interceptor;

import com.example.springbootdemo.common.conf.exceptions.CustomException;
import com.example.springbootdemo.common.response.ResultCode;
import com.example.springbootdemo.common.utils.JwtTokenUtils;
import com.example.springbootdemo.common.utils.RedisUtil;
import com.mysql.cj.util.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

/**
 * @ClassName: CustomInterceptor
 * @Description: 拦截器
 * @Author: WangBin
 * @Date: 2023/7/19 0:01
 */
public class CustomInterceptor implements HandlerInterceptor {

    private static RedisUtil redisUtil;

    @Autowired
    public void init(RedisUtil redisUtil) {
        CustomInterceptor.redisUtil = redisUtil;
    }

    // redisUtil这个如果直接按下面这种方式注入的话是没有办法注入的,只能通过上面这种写法注入
//    @Autowired
//    private RedisUtil redisUtil;

    /**
     * 拦截所有请求,验证TOKEN是否有效
     *
     * @param request
     * @param response
     * @param handler
     * @return
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // 获取请求头中的token
        String token = request.getHeader("token");
        // 判断token是否存在或为空
        if(StringUtils.isNullOrEmpty(token)) {
            throw new CustomException(ResultCode.TOKEN_IS_NULL);
        }
        // 验证token是否有效
        Map<String, Object> map = JwtTokenUtils.analysisToken(token);
        if(map == null) {
            throw new CustomException(ResultCode.TOKEN_ERROR);
        }
        // 从redis中读取用户信息(后续需要)
        Map<Object, Object> userInfo = redisUtil.hmget(token);
        System.out.println(userInfo);
        if(userInfo == null || userInfo.isEmpty()) {
        	// token失效
            throw new CustomException(ResultCode.TOKEN_INVALID);
        }
        return true;
    }
}

2. 拦截器会获取请求头中的Token(令牌),然后检查请求头中的Token是否存在,如果Token存在,将会调用JwtTokenUtils工具类中的analysisToken()方法验证Token是否有效,如果Token有效将会调用redisUtil工具类的hmget()方法验证请求头中Token在Redis中是否过期。

3.配置过滤器并实现WebMvcConfigurer接口

package com.example.springbootdemo.common.conf.interceptor;

import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName: WebAppConfig
 * @Description: 过滤器
 * @Author: WangBin
 * @Date: 2023/7/18 23:59
 */
public class WebAppConfig implements WebMvcConfigurer {

    // 配置拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 创建一个字符串数组,里面放入需要过滤掉的路径
        List<String> urls = new ArrayList<>();
        urls.add("/favicon.ico");
        urls.add("/error");
        urls.add("/swagger-resources/**");
        urls.add("/webjars/**");
        urls.add("/v2/**");
        urls.add("/doc.html");
        urls.add("**/swagger-ui.html");
        urls.add("/swagger-ui.html/**");

        registry.addInterceptor(new CustomInterceptor())
                .addPathPatterns("/**") // 该方法是配置需要拦截的路径
                .excludePathPatterns("/user/login/**")
                .excludePathPatterns(urls); // 该方法是配置不要拦截的路径
    }

    // 资源映射增加
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
        WebMvcConfigurer.super.addResourceHandlers(registry);
    }

    // 解决跨域问题
    // <-cors
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowCredentials(true)
                .allowedOriginPatterns("*")
                .allowedHeaders("*")
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                .maxAge(3600);
    }
    // cors->
}

4.我们在addInterceptors方法中去配置拦截器

  1. InterceptorRegistry中的addInterceptor()方法是用来添加拦截器的
  2. InterceptorRegistry中的addPathPatterns方法是用来添加需要拦截的路径的
  3. InterceptorRegistry中的excludePathPatterns()方法是用来添加放行(过滤)的路径的

5.我们的拦截器和过滤器就配置完成了!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot项目拦截器过滤器配置 的相关文章

随机推荐

  • C++中STL的string vector使用笔记

    文章目录 容器 STL使用的基本方式 常用容器的基本概念和使用 string容器的特性 string初始化 拼接 赋值 查找 初始化 赋值操作 取值操作 拼接操作 查找 string替换 比较 字串 插入和删除 替换 比较 截取子串 插入删
  • 对象池GenericObjectPoolConfig

    Apache commons pool本质上是 对象池 即通过一定的规则来维护对象集合的容器 commos pool在很多场景中 用来实现 连接池 任务worker池 等 大家常用的dbcp数据库连接池 也是基于commons pool实现
  • 互联网创业盈利模式指南

    看了很多创业的case 都有点下笔千言 离题万里的 情况 就是很多case都很精彩 但是公司 的价值最终是落实到 给创业者和投资人的回报的 因此 所有的case 最终都是 落实到盈利 模式上 一位投资人士说的很明确 中国的盈利模式很简单 就
  • 一、深度学习之anaconda以及Tensorflow的安装

    1 anaconda安装 在官网Free Download Anaconda下载anaconda5 2 Python3 6 按照下一步直到安装结束 注意 将两个选项都勾选上 将安装路径写入环境变量 2 安装Tensorflow 1 建立一个
  • 围棋吃子问题

    题目 Given a 2D board containing X and O capture all regions surrounded by X A region is captured by flipping all O s into
  • 浮生六记

    浮生六记 目录 浮生六记卷一 闺房记乐 002 浮生六记卷二 闲情记趣 015 浮生六记卷三 坎坷记愁 022 浮生六记卷四 浪游记快 034 浮生六记 2 浮生六记卷一 闺房记乐 余生乾隆癸未冬十一月二十有二日 正值太平盛世 且在 衣冠之
  • Android 性能优化系列:崩溃原因及捕获

    文章目录 崩溃的基本原因 抛出异常导致崩溃分析 AMS 如何承接应用的异常信息上报 对于 native crash 系统如何做处理 系统如何处理 ANR 异常数据 addErrorToDropBox DropBoxManager 在 Cra
  • 用简单易懂的话语来快速入门windows缓冲区溢出

    用简单易懂的话语来快速入门windows的缓冲区溢出教程 准备工具 immunity debugger https www immunityinc com products debugger WINDOWS的程序动态调试工具 Vulnser
  • matlab_多目标遗传算法

    前言 之前写过在python中的多目标遗传算法了 但是很可惜的是python调用商用有限元软件比较费事 需要在ironpython的编译环境下调用 然后这个ironpython它又是个老古董 不支持pandas和numpy这些python必
  • Transformer 模型详解

    本内容主要参照 此篇 然后结合个人理解新增和删减部分内容形成 文章目录 1 1 Transformer 概览 1 2 引入张量 1 3 Self Attention 自注意力 1 3 1 Self Attention 概览 1 3 2 Se
  • VirtualBox虚拟机网络连接设置的四种方式

    VirtualBox是一款SUN出品的非常优秀的虚拟机程序 版本也非常齐全 你可以在官网上找到适合各种操作系统平台的版本 这里我先给大家大致讲解下VBox的网络配置及应用 VirtualBox的提供了四种网络接入模式 它们分别是 1 NAT
  • mid360 SLAM 建图实现

    用别人分享的数据集试了下 室内建图问题不大 室外还不确定
  • Exynos4412 中断驱动开发(一)—— 中断基础及中断的注册过程

    一 中断基础概念 所谓中断 指CPU在执行程序的过程中 出现了某些突发事件即待处理 CPU必须暂停当前的程序 转去处理突发事件 处理完毕后CPU又返回原程序被中断的位置并继续执行 1 中断分类 a 内部中断和外部中断 根据中断的的来源 中断
  • (数据结构)树转换为二叉树、森林转换为二叉树、二叉树转换为树、二叉树转换为森林及树与森林的遍历

    1 树转换为二叉树 1 加线 在所有兄弟结点之间加一条线 2 去线 对树中每个结点 只保留它与第一个孩子结点的连线 删除它与其他孩子结点之间的连线 3 层次调整 以树的根结点为轴心 将整棵树顺时针旋转一定的角度 使之结构层次分明 注意第一个
  • 结束了在MSRA的实习

    从5月到11月底 总共在MSRA渡过了7个月的实习时光 这7个月似乎是我感觉过得最快的7个月 或许是一个人在北京 生活上没有太多的琐事 只有很单纯的工作 于是就有这种时光飞逝的感觉 当然 记忆里面也并非都是工作上的事情 在MSRA还认识来自
  • 通过External Tools在STM32CubeIDE下使用DAP-LINK

    目录 一 文章背景 二 准备工作 2 1 Stm32CubeIDE 2 2 DAP LINK 2 3 STM32目标板 三 配置过程 3 1 连接目标板 3 2 配置仿真器 3 3 更改调试设置为远程调试 3 4 新建OpenOcd扩展工具
  • 5种方法教你用Python玩转histogram直方图

    作者 xiaoyu 知乎 https zhuanlan zhihu com pypcfx 介绍 一个半路转行的数据挖掘工程师 直方图是一个可以快速展示数据概率分布的工具 直观易于理解 并深受数据爱好者的喜爱 大家平时可能见到最多就是 mat
  • 腾讯技术面经-后台-云计算虚拟化部门

    1 笔试 不区分 都是软开岗位 2个小时 一般1小时足够了 25道选择题 10道填空 还有2个选做题 涉及到操作系统 内存 HTTP协议 TCP UDP协议 LLR 0 LLR 1 数据结构 算法 C语言 协议 Ipv4
  • UE5学习笔记(一)——界面功能梳理&第一天知识点记录

    学习UE5的第一步 是软件安装 默认是安装好的 由于安装没有太多技术含量 所以就没有专门做记录 这里有个注意点 虚幻引擎是整合在Epic games launcher中的 也就是说开发引擎内嵌在游戏平台上 打个比方 就是如果你要下unity
  • SpringBoot项目拦截器过滤器配置

    1 我们在配置拦截器时需实现接口HandlerInterceptor package com example springbootdemo common conf interceptor import com example springb