拦截器添加以及注册

news2024/12/24 2:19:15

自定义拦截器

自定义一个类 实现  HandlerInterceptor  接口 并重写里面的方法 preHandle、postHandle、afterCompletion

preHandle:在执行具体的Controller方法之前调用
postHandle:controller执行完毕之后被调用
afterCompletion:方法需要在当前对应的 Interceptor 类的 preHandle 方法返回值为 true 时才会执行。 顾名思义,该方法将在整个请求结束之后,也就是在 DispatcherServlet 渲染了对应的视图之后执行。此方法主要用来进行资源清理。

package com.baymax.vpp.cop.pay.filter;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baymax.core.tool.utils.Func;
import com.baymax.vpp.cop.common.enums.core.EUseOrg;
import com.baymax.vpp.cop.common.enums.device.ERetStat;
import com.baymax.vpp.cop.common.utils.HMacMD5Util;
import com.baymax.vpp.cop.common.utils.RedisUtil;
import com.baymax.vpp.cop.pay.constant.XiaoJuConstant;
import com.baymax.vpp.cop.pay.utils.RequestUtil;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@Slf4j
public class MyInterceptor implements HandlerInterceptor {
    @Autowired
    private RedisUtil redisUtil;

    private static final String AUTHORIZATION_HEADER = "Authorization";
    private static final String OPERATOR_ID = "OperatorID";
    private static final String SIG = "Sig";
    private static final String TIME_STAMP = "TimeStamp";
    private static final String SEQ = "Seq";
    private static final String DATA = "Data";

    @Override
    public boolean preHandle(HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull Object handler) throws Exception {
        log.info("拦截器拦截请求,请求路径:{}", request.getServletPath());
        String accessToken = request.getHeader(AUTHORIZATION_HEADER);
        String path = request.getServletPath();

        String requestBody = RequestUtil.getRequestBody(request);
        JSONObject requestBodyJson = JSON.parseObject(requestBody);
        if (Func.isEmpty(requestBodyJson)) {
            setErrorResponse(response, ERetStat.paramError, "参数错误");
            return false;
        }

        String operatorID = Func.toStr(requestBodyJson.getString(OPERATOR_ID));
        String sig = Func.toStr(requestBodyJson.getString(SIG));
        String timeStamp = Func.toStr(requestBodyJson.getString(TIME_STAMP));
        String seq = Func.toStr(requestBodyJson.getString(SEQ));
        String data = Func.toStr(requestBodyJson.getString(DATA));
        log.info("operatorID:{}, sig:{}, timeStamp:{}, seq:{}, data:{}", operatorID, sig, timeStamp, seq, data);
        if (!verifySignature(operatorID, data, timeStamp, seq, sig)) {   // 签名需要生成
            log.info("签名错误");
            setErrorResponse(response, ERetStat.signError, "签名错误");
            return false;
        }

        boolean isAccessTokenRequest = path.contains("query_token");
        if (isAccessTokenRequest) {
            // 处理AccessToken请求
            return true;
        }

        if (Func.isEmpty(accessToken)) {
            setErrorResponse(response, ERetStat.tokenError, "Token错误");
            return false;
        } else {
            // 验证Token
            // TODO
            String tokenRel = "Bearer " + redisUtil.getString( XiaoJuConstant.TOKEN_XIAOJU_ERP + EUseOrg.XIAOJU.getValue() );
            if (!tokenRel.equals(accessToken)) {
                setErrorResponse(response, ERetStat.tokenError, "Token错误");
                return false;
            }
            return true;
        }

    }

    @Override
    public void postHandle(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public void afterCompletion(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}

开始注册拦截器

1、在启动类main方法里面实现 接口 WebMvcConfigurer  重写方法  addInterceptors

 

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
}

2、方法

自定义一个配置类  通过注解:@Configuration 和 @Bean 实现接口  WebMvcConfigurer 

package com.baymax.vpp.cop.pay.config;


import com.baymax.vpp.cop.pay.filter.MyInterceptor;
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 MvcConfig implements WebMvcConfigurer {
    //注册拦截器
    @Bean
    public MyInterceptor myInterceptor() {
        return new MyInterceptor();
    }

    //添加拦截器到springmvc 拦截器链
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor()).addPathPatterns("/client/openApi/xiaojuErp/**");
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1658215.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NOIP,CSP-J,CSP-S——函数

一、函数概念 /*函数返回类型 函数名(参数){语句 } */ int add(int x,int y){return xy; } 调用这个函数add int main(){int x,y,z;scanf("%d%d",&x,&y);zadd(x,y);printf("%d",z); } …

我从这些书籍中学来的财务以及税务知识

“你不能指望在开始工作的头两年攒下任何积蓄。” 这句话一直是我的座右铭,也是我给大学生的个人理财建议。这也就难怪我二十出头的时候,基本就是靠薪水过日子。 回想起来,我意识到其实这并不是最好的建议,甚至非常不好。 我现…

纹理映射技术在AI去衣应用中的关键作用

引言: 随着人工智能技术的飞速发展,其在图像处理领域中的应用也日益广泛。AI去衣,作为一种颇具争议的技术应用,指的是利用深度学习算法自动移除或替换图片中的衣物。在这一过程中,纹理映射技术扮演了不可或缺的角色。本…

Anaconda安装和深度学习环境的安装(TensorFlow、Pytorch)

换了新电脑,重新装一下anaconda这些编程环境。好久没装过了,自己也需要查查资料,然后记录一下,分享给别人。 目标,三个环境:1.anaconda基础环境(包含xgboost和lightgbm)&#xff0c…

地图位置的二维码怎么做?在线制作地图二维码的方法

怎么定位一个位置做成二维码呢?随着互联网的不断发展,现在通过扫描二维码来获取导航位置的方式有很多的场景都在应用。这种方式的好处在于其他人都可以通过这个二维码来获取位置,有利于分享。 导航地图二维码可以在电脑的二维码生成器上快速…

springboot3项目练习详细步骤(第一部分:用户业务模块)

目录 环境准备 用户模块 注册 注册接口文档 ​编辑 实现结构 Spring Validation 登录 登录的接口文档 实现登录逻辑 JWT令牌 完善登录认证 拦截器 获取用户详细信息 接口文档 Usercontroller类中编写方法接口 忽略属性返回 优化代码ThreadLocal 更新用户基本信…

win11 安装oracle11g详细流程及问题总结

1.安装包下载地址 本案例操作系统, Oracle 11g下载-Oracle 11g 64位/32位下载官方版(附详细的安装图解教程) - 多多软件站多多为大家免费提供Oracle 11g下载,包含64位/32位官方版本,并附详细的Oracle 11g安装图解教程,同时希望能…

全网最详细的Python自动化测试(unittest框架)

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

【AIGC】深入探索AIGC技术在文本生成与音频生成领域的应用

🚀文章标题 🚀AIGC之文本生成🚀应用型文本生成🚀创作型文本生成🚀文本辅助生成🚀重点关注场景 🚀音频及文字—音频生成🚀TTS(Text-to-speech)场景🚀乐曲/歌曲生成&#x…

鸿蒙开发-ArkTS语言-容器-非线性容器

鸿蒙开发-UI-web 鸿蒙开发-UI-web-页面 鸿蒙开发-ArkTS语言-基础类库 鸿蒙开发-ArkTS语言-并发 鸿蒙开发-ArkTS语言-并发-案例 鸿蒙开发-ArkTS语言-容器 文章目录 前言 一、非线性容器 1.HashMap 2.HashSet 3.TreeMap 4.TreeSet 5.LightWeightMap 6.LightWeightSet 7.P…

【qt】QString字符串

前言: 这节很轻松,大家可以放心食用 ♪(・ω・)ノ QString目录 一.与cString的区别二.隐式共享三.初始化四.判断是否为空串五.字符串的长度六.添加字符串1.尾加2.任意位置加 七.替换字符串八.修改字符串九.删除字符串1.清…

《吸血鬼崛起》大剑技能是什么 大剑武器连招教学

V Rising《吸血鬼崛起》是一款热门游戏,在STEAM刚刚推出了正式版,而在游戏中如何利用武器连招输出高是新手玩家常常困扰的问题。如果你还不太清楚,那么一起来看看V Rising中的武器连招推荐吧。 在V Rising中,你可以在数字栏里装备…

物联网实战--平台篇之(五)账户界面

目录 一、界面框架 二、首页(未登录) 三、验证码登录 四、密码登录 五、帐号注册 六、忘记密码 本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/cat…

压缩归档库-Snappy介绍

1.简介 Snappy 是一个 C 编写的压缩和解压缩库,由 Google 开发。它专为速度而设计,而不是最大压缩率或与其他压缩库的兼容性。 Snappy 通常用于需要快速压缩和解压缩的场景。 Snappy具有以下属性: 快速:压缩速度达到250 MB/秒及…

AMCA乙二胺,可发出蓝色荧光具有较好的反应活性和稳定性

基本信息: 中文名:AMCA乙二胺 英文名:AMCA Ethylenediamine 分子量:503.35 外观:无色至浅黄色固体/粉末 规格:10mg、25mg、50mg(同时可提供mg级以及kg级的产品开发服务) 纯度&…

数智结合,智慧合同让法务管理发挥内在价值

在当今这个信息化、数字化飞速发展的时代,数据已成为企业重要的战略资源。法务管理作为企业内部控制和风险防范的重要环节,其重要性不言而喻。然而,传统的法务管理模式往往存在效率低下、信息孤岛、反应迟缓等问题。在这样的背景下&#xff0…

在Ubuntu安装RPM文件

Ubuntu软件源包含数千个deb软件包,可以从Ubuntu软件中心或使用apt命令行安装。 Deb是所有基于Debian的Linux发行版,例如包括Ubuntu,Linux mint等发行版使用的安装包格式。 如果某些软件在Ubuntu软件源中不可用,可以通过启用适当的…

为什么智慧校园是校园信息化发展的必然趋势

怎么从数字化学校的服务形式和运维办理上进行建造,如何为高校供给快捷、高效、有用的运维服务是数字化学校完成“才智”的重要目标,也是学校提高教育的必然趋势。 首先,智能可视化办理,可视化是数字化学校发展的必然趋势。可视化即…

软件系统工程建设全套资料(交付清单)

软件全套精华资料包清单部分文件列表: 工作安排任务书,可行性分析报告,立项申请审批表,产品需求规格说明书,需求调研计划,用户需求调查单,用户需求说明书,概要设计说明书&#xff0c…

子查询之一(单行子查询, 多行子查询)

1. 子查询 子查询是指一个查询语句嵌套在另一个查询语句内部的查询.这个特性在MySQL4.1开始引入. SQL中子查询的使用大大增强了SELECT查询的能力.因为很多时候查询需要从结果集中获取数据,或者需要从同一个表中先计算得到一个数据结果,然后与这个数据结…