当前位置: 首页 > news >正文

SpringBoot项目限制带参数接口配置使用数量实现

       要求系统在使用过程中对某类带参数的接口做限制,也就只能配置几个接口供用户使用。带参数接口如:http://localhost:8088/sys/list?d=a001&c=b001,类似d=a001&c=b001这样的参数只能配置限定使用数量。超出使用数量,系统报出超过最大配置限制提醒。

1、过滤器

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;/*** @Description:TODO* @Author:sclbq@sina.com* @date:2025年07月2815:35*/
@Component
public class ApiLimitFilter implements Filter {// 允许的最大唯一组合数private static final int MAX_CONFIGS = 2;// 使用线程安全的Set存储唯一组合private final Set<String> configSet = new CopyOnWriteArraySet<>();private static final Logger logger = LoggerFactory.getLogger(ApiLimitFilter.class);@Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse) res;String clinicCode = request.getParameter("clinicCode");String departCode = request.getParameter("departCode");logger.info("请求参数: clinicCode={}, departCode={}, 请求路径={}", clinicCode, departCode, request.getRequestURI());if (clinicCode == null || departCode == null) {logger.warn("缺少必要参数,clinicCode或departCode未提供");response.sendError(HttpServletResponse.SC_BAD_REQUEST, "缺少必要参数");return;}// 创建唯一标识符String configKey = clinicCode + ":" + departCode;// 添加新组合前检查数量if(!configSet.contains(configKey)) {if(configSet.size() >= MAX_CONFIGS) {logger.warn("超过最大配置限制: {}", configKey);response.sendError(403, "超过最大配置限制");return;}configSet.add(configKey);logger.info("新增配置组合: {},当前总量: {}", configKey, configSet.size());}chain.doFilter(req, res);}@Overridepublic void destroy() {configSet.clear();}/*** 供外部调用的清理方法*/public void clearConfigSet() {configSet.clear();logger.info("configSet已手动清理");}
}

2、配置文件

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @Description:TODO* @Author:sclbq@sina.com* @date:2025年07月2815:32*/
@Configuration
@Slf4j
public class ApiLimitConfig {@Autowiredprivate ApiLimitFilter apiLimitFilter;@Beanpublic FilterRegistrationBean<ApiLimitFilter> customApiLimitFilter() {FilterRegistrationBean<ApiLimitFilter> registration = new FilterRegistrationBean<>();registration.setFilter(apiLimitFilter);// 添加多个URL匹配模式
//        registration.addUrlPatterns("/jhtqs/queuing/qspatienapi/*");registration.addUrlPatterns("/queuing/qspatienapi/*");registration.setOrder(1);log.info("对指定接口进行过滤时的初始化...");return registration;}
}

http://www.lryc.cn/news/618907.html

相关文章:

  • php+apache+nginx 更换域名
  • 力扣.870优势洗牌解决方法: 下标排序​编辑力扣.942增减字符串匹配最长回文子序列牛客.背包问题(最大体积)力扣.45跳跃游戏II 另一种思考
  • 牛客疑难题(6)
  • Transformer的编码器与解码器模块深度解析及python实现完整案例
  • 树:数据结构中的层次架构
  • 前端基础知识NodeJS系列 - 06( Node 中的 Stream 的理解?应用场景?)
  • 【154页PPT】某大型再生资源集团管控企业数字化转型SAP解决方案(附下载方式)
  • 【从零开始java学习|第三篇】变量与数据类型的关联
  • 扣子空间深度解析
  • Apache 服务器基础配置与虚拟主机部署
  • CentOS 7.9 升级 GLibc 2.34
  • (C++)继承全解析及运用
  • Java 大视界 -- Java 大数据在智能教育学习效果评估指标体系构建与精准评估中的应用(394)
  • 教程 | 用Parasoft SOAtest实现高效CI回归测试
  • Day02——Docker
  • 一体化步进伺服电机在无人机舱门应用中的应用案例
  • 书籍数组中未出现的最小正整数(8)0812
  • 小白挑战一周上架元服务——ArkUI04
  • Ubuntu与Rocky系统安装Java全指南
  • C# 基于halcon的视觉工作流-章29-边缘提取-亚像素
  • 深入理解数据库架构:从原理到实践的完整指南
  • 力扣47:全排列Ⅱ
  • ffmpeg,ffplay, vlc,rtsp-simple-server,推拉流命令使用方法,及测试(二)
  • Linux内核编译ARM架构 linux-6.16
  • 深度贴:前端网络基础及进阶(3)
  • archlinux中VLC无法播放视频的解决办法
  • Linux TC流控实现机制
  • MySQL——MySQL引擎层BufferPool工作过程原理
  • leetcode3258:统计满足K约束的子字符串数量Ⅰ(变长滑动窗口详解)
  • Tricentis Tosca 2025.1 LTS 系统要求