hashset存储恶意请求指纹适合单机低频拦截,需用ip+路径+排序后参数md5生成唯一指纹,运行期动态添加应选用concurrenthashmap.newkeyset()保证线程安全,拦截逻辑嵌入filter/interceptor,内存数据重启丢失,长期黑名单建议用redis或数据库。

用 HashSet 存储恶意请求指纹是简单高效的方案,适合单机、低频拦截场景。核心在于把请求特征(如 IP+路径+参数签名)转成唯一字符串,再放入 HashSet。
选择合适的指纹生成规则
指纹必须能准确区分恶意请求,又避免误伤正常流量。推荐组合:
- IP 地址 + 请求路径 + 关键参数排序后的 MD5(例如:对 query string 中的 key 按字典序排序后拼接,再哈希)
- 若需更精细控制,可加入 User-Agent 前 8 字符或请求时间戳分钟级精度(如
yyyy-MM-dd HH:mm) - 避免直接存原始参数值(含敏感信息或长度不定),也不建议只用 IP —— 容易误杀或漏拦
初始化和线程安全处理
HashSet 本身不是线程安全的,Web 应用多线程环境下需注意:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 静态 final 初始化:适合启动时加载已知黑名单指纹,运行期只读
- 运行期动态添加(如实时拦截)建议改用
ConcurrentHashMap.newKeySet()(Java 8+),它提供线程安全的 Set 接口,性能优于Collections.synchronizedSet(new HashSet()) - 示例:private static final Set
BLOCKED_FINGERPRINTS = ConcurrentHashMap.newKeySet();
拦截逻辑嵌入 Filter 或 Interceptor
在请求进入业务前计算指纹并校验:
- 从 HttpServletRequest 提取 remoteAddr、requestURI、queryString
- 规范化 queryString(URL decode、过滤空值参数、按 key 排序后拼接)
- 生成指纹字符串(如
ip + "|" + path + "|" + md5(sortedQuery)),调用BLOCKED_FINGERPRINTS.contains(fingerprint) - 命中则返回 403 或重定向,不继续执行后续链路
注意内存与持久化边界
HashSet / ConcurrentHashMap 是纯内存结构,重启即丢失:
- 临时高频攻击(如爬虫秒刷)可用,但长期黑名单建议落地到 Redis 或数据库
- 若必须本地持久化,可配合 ScheduledExecutorService 定期序列化到文件(不推荐生产环境单独依赖)
- 单机 HashSet 适合日均拦截量
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










