Springboot中自定义拦截器

文章目录

      • 拦截器实现白名单即API鉴权
        • 自定义拦截器
        • 注册拦截器
      • 拦截器@Service注入失效解决方式:
      • 获取用户真实IP地址 工具类

Spring Boot 中使用拦截器
参考:https://blog.csdn.net/taojin12/article/details/88342576?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170823498416800197050192%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=170823498416800197050192&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-88342576-null-null.142v99pc_search_result_base7&utm_term=springboot%E6%8B%A6%E6%88%AA%E5%99%A8%E7%9A%84%E4%BD%BF%E7%94%A8&spm=1018.2226.3001.4187

拦截器实现白名单即API鉴权

自定义拦截器
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
import java.nio.charset.StandardCharsets;
import java.util.*;@Configuration
public class MyInterceptor implements HandlerInterceptor {private static final Logger logger = LoggerFactory.getLogger(MyInterceptor.class);private static WhiteListService whiteListService;private static OperationAppService operationAppService;private WhiteListService getWhitelistService() {if (Objects.isNull(whiteListService)){whiteListService = (WhiteListService)ApplicationContextUtil.getBean("whiteListServiceImpl");}return whiteListService;}private OperationAppService getOperationAppService() {if (Objects.isNull(operationAppService)){operationAppService = (OperationAppService)ApplicationContextUtil.getBean("operationAppServiceImpl");}return operationAppService;}@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {HandlerMethod handlerMethod = (HandlerMethod) handler;Method method = handlerMethod.getMethod();String methodName = method.getName();logger.info("====拦截到了方法:{},在该方法执行之前执行====", methodName);// 1、白名单String ipAddress = CusAccessObjectUtil.getIpAddress(request);Set<String> allIp = getWhitelistService().getALl();if (!allIp.contains(ipAddress)){return false;}// 2、校验header中的时间戳,时差不超过5分钟String timestamp = "";String sign = "";String appId = "";try {timestamp = request.getHeader(InterceptorConstant.TIMESTAMP);sign = request.getHeader(InterceptorConstant.SIGN);appId = request.getHeader(InterceptorConstant.APPID);if ((Math.abs(System.currentTimeMillis() - Long.valueOf(timestamp)) / 1000 / 60) > 5) {response.setContentType("application/json;charset=UTF-8");response.getWriter().write(new String("访问失效".getBytes(StandardCharsets.UTF_8)));return false;}} catch (Exception e) {response.setContentType("application/json;charset=UTF-8");response.getWriter().write(new String("参数错误".getBytes(StandardCharsets.UTF_8)));return false;}// 3、校验参数Map<String, OperationAppDO> operationAppDOMap = getOperationAppService().getAll();if (!operationAppDOMap.containsKey(appId)){return false;}List<String> paramList = new ArrayList<>();paramList.add(appId);paramList.add(timestamp);paramList.add(operationAppDOMap.get(appId).getAppSecret());Collections.sort(paramList, String::compareTo);StringBuilder builder = new StringBuilder();paramList.forEach(param -> builder.append(param));String md5 = EncryptionUtil.getMD5(builder.toString());if (Objects.equals(md5, sign)){return true;}return false;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {//logger.info("执行完方法之后进执行(Controller方法调用之后),但是此时还没进行视图渲染");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {//logger.info("整个请求都处理完咯,DispatcherServlet也渲染了对应的视图咯,此时我可以做一些清理的工作了");}}
注册拦截器
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 MyInterceptorConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 实现 WebMvcConfigurer 不会导致静态资源被拦截registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");}}

拦截器@Service注入失效解决方式:

原因:拦截器加载的时间点在springcontext之前,所以在拦截器中注入自然为null

通过ApplicationContext来获取bean


@Configuration
public class MyInterceptor implements HandlerInterceptor {private static final Logger logger = LoggerFactory.getLogger(MyInterceptor.class);private static WhiteListService whiteListService;private WhiteListService getWhitelistService() {if (Objects.isNull(whiteListService)){whiteListService = (WhiteListService)ApplicationContextUtil.getBean("whiteListServiceImpl");}return whiteListService;}
}

ApplicationContextUtil


import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;import java.util.Map;@Component
public class ApplicationContextUtil implements ApplicationContextAware {private static ApplicationContext context;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {context = applicationContext;}public static ApplicationContext getApplicationContext(){return context;}/*** 通过name获取 Bean* @param name beanName* @return Object*/public static Object getBean(String name){return context.getBean(name);}public static  <T>Map<String, T> getBeanByType(Class <T> type){return context.getBeansOfType(type);}public static  String[] getBeanNamesForType(Class <?> type){return context.getBeanNamesForType(type);}
}

获取用户真实IP地址 工具类


import javax.servlet.http.HttpServletRequest;/*** 自定义访问对象工具类** 获取对象的IP地址等信息* @author X-rapido**/
public class CusAccessObjectUtil {/*** 获取用户真实IP地址,不使用request.getRemoteAddr();的原因是有可能用户使用了代理软件方式避免真实IP地址,* 参考文章: http://developer.51cto.com/art/201111/305181.htm** 可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值,究竟哪个才是真正的用户端的真实IP呢?* 答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。** 如:X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130,* 192.168.1.100** 用户真实IP为: 192.168.1.110** @param request* @return*/public static String getIpAddress(HttpServletRequest request) {String ip = request.getHeader("x-forwarded-for");if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("Proxy-Client-IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("WL-Proxy-Client-IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("HTTP_CLIENT_IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("HTTP_X_FORWARDED_FOR");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getRemoteAddr();}return ip;}}

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

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

相关文章

【HTML】SVG实现炫酷的描边动画

前沿 今天闲来无事&#xff0c;看到Antfu大佬的个性签名&#xff0c;觉得还是非常炫酷的&#xff0c;于是也想要搞一个自己的个性签名用来装饰自己的门面&#xff0c;不过由于手写的签名太丑了&#xff0c;遂放弃。于是尝试理解原理&#xff0c;深入研究此等密法&#xff0c;终…

VLM多模态图像识别小模型UForm

参考:https://github.com/unum-cloud/uform https://huggingface.co/unum-cloud/uform-gen2-qwen-500m https://baijiahao.baidu.com/s?id=1787054120353641459&wfr=spider&for=pc demo:https://huggingface.co/spaces/unum-cloud/uform-gen2-qwen-500m-demo UF…

市场复盘总结 20240219

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率中 22% 最常用的…

Shiro-05-5 分钟入门 shiro 安全框架实战笔记

序言 大家好&#xff0c;我是老马。 前面我们学习了 web 安全之 Spring Security 入门教程 这次我们来一起学习下另一款 java 安全框架 shiro。 什么是Apache Shiro&#xff1f; Apache Shiro是一个功能强大且易于使用的Java安全框架&#xff0c;它为开发人员提供了一种直…

springboot拦截器配置

1、首先我们需要创建interceptor并实现springMVC中的HandlerInterceptor package com.example.cybg.web.intercepter;import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServl…

Redis 数据类型及其常用命令二(bitmap、geo、hyperloglog、bitfield、stream)

上文中我们介绍了Redis常使用的5中数据类型&#xff0c;对于一些特殊的场景&#xff0c;我们需要使用特殊的数据类型&#xff0c;本文将详细介绍5种特殊的数据类型。 1、bitmap 类型 用String类型作为底层数据结构实现的一种统计二值状态的数据类型。位图本质是数组&#xff0…

动态规划相关题目总结

221.最大正方形 设dp[i][j]为以点(i, j)为右下角的正方形最大边长&#xff0c;多画画图模拟模拟可以发现递推式dp[i][j] min(dp[i][j-1], dp[i-1][j-1], dp[i-1][j])1。 class Solution { public:int maximalSquare(vector<vector<char>>& matrix) {int n …

一文搞懂设计模式—适配器模式

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 微信公众号&#xff1a;Java随想录 文章目录 使用场景实现方式类适配器实现对象适配器实现 优缺点总结 适配器模式&#xff08;Adapter Pattern&#xff09;属于结构型模式&#xff0c;用于将一个类的接口转…

《剑指 Offer》专项突破版 - 面试题 45 和 46 : 二叉树最低层最左边的值和二叉树的右侧视图(C++ 实现)

目录 面试题 45 : 二叉树最低层最左边的值 面试题 46 : 二叉树的右侧视图 面试题 45 : 二叉树最低层最左边的值 题目&#xff1a; 如何在一棵二叉树中找出它最低层最左边节点的值&#xff1f;假设二叉树中最少有一个节点。例如&#xff0c;在下图所示的二叉树中最低层最左边…

Codeforces Round 924 (Div. 2)题解(A-D)

A - Rectangle Cutting 链接&#xff1a;A - Rectangle Cutting 思路 考虑横边和纵边&#xff0c;若为偶数&#xff0c;则从中间分开&#xff0c;重新组合为一个长方形&#xff0c;检测是否与原来的长方形一致。 代码 #include <bits/stdc.h> using namespace std;i…

logback实践

1:日志区分环境 2:debug info warn error日志文件不一样 3: 文件滚动日志 4:启动可带参数 --spring.profiles.activedev --log.levelinfo 5:可从配置文件中获取上下文参数 logback-spring.xml 放在 classpath 下面 <configuration scan"false" scanPer…

探秘OpenAI的神奇之作:Sora技术揭秘

探秘OpenAI的神奇之作&#xff1a;Sora技术揭秘 1. 引言 在当今科技快速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;正日益成为各个领域的关键技术。而在人工智能领域中&#xff0c;OpenAI公司一直以来都扮演着重要的角色。他们的最新创新——Sora技术&#x…

基于python的遥感影像灰色关联矩阵纹理特征计算

遥感影像纹理特征是描述影像中像素间空间关系的统计特征&#xff0c;常用于地物分类、目标识别和变化检测等遥感应用中。常见的纹理特征计算方式包括灰度共生矩阵&#xff08;GLCM&#xff09;、灰度差异矩阵&#xff08;GLDM&#xff09;、灰度不均匀性矩阵&#xff08;GLRLM&…

常见面试题:TCP的四次挥手和TCP的滑动窗口

说一说 TCP 的四次挥手。 挥手即终止 TCP 连接&#xff0c;所谓的四次挥手就是指断开一个 TCP 连接时。需要客户端和服务端总共发出四个包&#xff0c;已确认连接的断开在 socket 编程中&#xff0c;这一过程由客户端或服务端任意一方执行 close 来触发。这里我们假设由客户端…

unity学习(29)——GameInfo角色信息

1.把GameInfo.cs PlayerModel.cs Vector3.cs Vector4.cs PlayerStateConstans.cs GameState.cs依次粘到model文件夹中&#xff0c;此时项目没有错误&#xff0c;如下图所示&#xff1b; 对应处所修改的代码如下&#xff1a; case LoginProtocol.LOGIN_SRES://1 {Debug.Log(&qu…

考研查分,别再只知道研招网了!

查分时间基本已经敲定在2月26日左右了。倒计时7天&#xff01;每年查询分数的时候经常因为查询人数太多&#xff0c;进不去研招网&#xff0c;还有哪些方法可以查询分数呢&#xff1f; 我为大家整理了四种常用的查成绩方式&#xff0c;附带部分已公布查分时间院校名单。 一、…

Java学习心得感悟

在我踏入Java学习的道路之前&#xff0c;我对编程只是一知半解&#xff0c;对于代码的世界充满了好奇和向往。然而&#xff0c;当我真正开始学习Java时&#xff0c;我才意识到&#xff0c;学习Java不仅仅是学习一门编程语言&#xff0c;更是一种思维方式和解决问题的能力的培养…

【AI视野·今日Sound 声学论文速览 第四十九期】Wed, 17 Jan 2024

AI视野今日CS.Sound 声学论文速览 Wed, 17 Jan 2024 Totally 23 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers From Coarse to Fine: Efficient Training for Audio Spectrogram Transformers Authors Jiu Feng, Mehmet Hamza Erol, Joon Son Chung,…

Pandas Series Mastery: 从基础到高级应用的完整指南【第83篇—Series Mastery】

Pandas Series Mastery: 从基础到高级应用的完整指南 Pandas是Python中一流的数据处理库&#xff0c;它为数据科学家和分析师提供了强大的工具&#xff0c;简化了数据清理、分析和可视化的流程。在Pandas中&#xff0c;Series对象是最基本的数据结构之一&#xff0c;它为我们处…

Spring Security基础学习

一、SpringSecurity框架简介 二、SpringSecurity入门案例 三、SpringSecurity Web权限方案 四、SpringSecurity微服务权限方案 五、SpringSecurity原理总结