参考:http://843977358.iteye.com/blog/2317810
http://843977358.iteye.com/blog/2318143
本文 主要 是想更方便的实现ip限制,感觉楼主843977358 写的太过复杂,然后建议他用redis 或者memcached ,
因为都有expired 方法,楼主没有使用,本人就写一个吧 。。。
/* * Project: springmvchibernate * * File Created at 2016年11月4日 * * Copyright 2016 CMCC Corporation Limited. * All rights reserved. * * This software is the confidential and proprietary information of * ZYHY Company. ("Confidential Information"). You shall not * disclose such Confidential Information and shall use it only in * accordance with the terms of the license. */ package com.curiousby.baoyou.cn.filters; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; import com.curiousby.baoyou.cn.redis.RedisConnectionContext; /** * @com.curiousby.baoyou.cn.filters.IPFilter * @Type IPFilter.java * @Desc * @author cmcc-B100036 * @date 2016年11月4日 上午10:42:42 * @version */ @Component public class IPFilter implements Filter { protected static final Logger logger = LoggerFactory.getLogger(IPFilter.class); private RedisConnectionContext redisConnectionContext; public final static int IPMAXCOUNTPERMINUTES = 5; public final static int IPLIMITSENCONDS = 300; public final static int IPCOUNTSENCONDS = 60; @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; WebApplicationContext wac=WebApplicationContextUtils.getWebApplicationContext(req.getSession().getServletContext()); redisConnectionContext = (RedisConnectionContext) wac.getBean("redisConnectionContext"); String ip = getIpAddr(req); String ipLimit = redisConnectionContext.getValue(ip+"_limit"); if (ipLimit !=null && !"".equals(ipLimit)) { req.getRequestDispatcher("/web/static/forward").forward(req, response); return; }else{ String ipConut = redisConnectionContext.getValue(ip+"_count"); if (ipConut !=null && !"".equals(ipConut)){ int ipLCount = Integer.parseInt(ipConut); if(ipLCount >= IPMAXCOUNTPERMINUTES){ redisConnectionContext.setValue(ip+"_limit", ipLCount+"", IPLIMITSENCONDS); redisConnectionContext.setValue(ip+"_count", "0", IPCOUNTSENCONDS); req.getRequestDispatcher("/web/static/forward").forward(req, response); return; }else{ ipLCount += 1; redisConnectionContext.setValue(ip+"_count", ipLCount+"", IPCOUNTSENCONDS); } }else{ redisConnectionContext.setValue(ip+"_count", "1", IPCOUNTSENCONDS); } } chain.doFilter(req, response); } @Override public void destroy() { } public String getIpAddr(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.getRemoteAddr(); } return ip; } } /** * Revision history * ------------------------------------------------------------------------- * * Date Author Note * ------------------------------------------------------------------------- * 2016年11月4日 cmcc-B100036 creat */
expire 方法
public boolean setValue(final String paramKey, final String paramValue,final int seconds) { if (null == paramKey || null == paramValue) { return false; } boolean reltValue = false; ShardedJedis localShardedJedis = null; try { localShardedJedis = this.getRedisConnection(); if (null != localShardedJedis) { localShardedJedis.set(paramKey, paramValue); localShardedJedis.expire(paramKey, seconds); } else { log.error("setValue : key: " + paramKey + " null ShardedJedis error"); } } catch (Exception e) { log.error("setValue Exception"); e.printStackTrace(); } finally { this.closeRedisConnection(localShardedJedis); } return reltValue; }
捐助开发者
在兴趣的驱动下,写一个免费
的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(右上角的爱心标志,支持支付宝和PayPal捐助),没钱捧个人场,谢谢各位。
谢谢您的赞助,我会做的更好!
相关推荐
主要介绍了PHP实现redis限制单ip、单用户的访问次数功能,结合实例形式分析了php连接redis及获取、记录客户端信息,并限制客户访问次数等操作技巧,需要的朋友可以参考下
在站点遇到攻击且无明显攻击特征,造成站点访问慢,nginx不断返回502等错误时,可利用nginx+lua+redis对该IP进行封禁,这篇文章主要给大家介绍了关于Nginx利用Lua+Redis实现动态封禁IP的相关资料,需要的朋友可以...
主要介绍了Springboot过滤器禁止ip频繁访问功能实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
本课程,我们将创建一个简单的中间件实现基于 IP 限制 HTTP 访问频率。 简单的 HTTP 服务 让我们从创建一个简单的 HTTP 服务开始,它有非常简单的终端。 但是,因为它的访问频率可能非常高,因此我们要为它添加频率...
读写锁控制强制读取存储同步 线程池管理类 配置文件初始化启动读取 ...Redis实现Ip、手机号等访问次数限制时,支持按照时间段(天、时、分、秒),支持按期限(每个期限) LocaleDate 日期处理工具类
遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施...
使用scrapy,redis, mongodb,django实现的 爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测...
遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施...
遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施...
校园博客,基于微服务架构且前后端分离的博客...采用 AOP + 自定义注解 + Redis 实现限制IP接口访问次数 基于 Redis 实现的分布式全局唯一ID生成器,保障ID可用性、安全性。 页面交互使用 Vue2.x,极大的提高了开发效率
- 用redis实现`shiroCache`,`shiroSession`管理, 服务器重启不会影响用户状态信息 . - 灵活的权限配置方案,可为某一角色统一配置权限也可为某一用户单独配置权限 ,最大化满足个性化权限需求 ,并且权限动态刷新,立即...
采用 AOP + 自定义注解 + Redis 实现限制IP接口访问次数 采用 Nacos 作为服务发现和配置中心,轻松完成项目的配置的维护 采用 Sentinel 流量控制框架,通过配置再也不怕网站被爆破 支持Markdown 编辑器 采用 Elastic...
遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施...
Java开发基于微服务架构的前后端分离的博客系统...采用 AOP + 自定义注解 + Redis 实现限制IP接口访问次数 采用 Sentinel 流量控制框架,通过配置再也不怕网站被爆破 页面交互使用 Vue2.x,极大的提高了开发效率。
3、设计基于腾讯云的短信服务实现手机号码注册登录,并用Redis存储验证码,实现60s限制拦截,多端IP控制功能; 4、基于网关的统一鉴权体系,使用Gateway网关实现统一鉴权验证处理,以及通过负载均衡的方式将请求分发...
单Ip的请求次数限制,防止攻击者对服务器进行大量无效请求; 4.单用户动态短信请求间隔时长限制; 5.增加IP黑名单库、白名单库; 本仓库已实现2、3、4、5方案功能,并多年生产环境稳定运行,欢迎大家借鉴、参考和...
遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施...
遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施...
该库仅提供开箱即用的基于 IP 地址的限制,即由库用户通过实现RateLimit协议来实现其他类型的速率限制。 要实施的明显速率限制是特定于用户的限制。 存储实现用于存储速率限制计数器。 该库为进程内原子和 Redis ...
前端IP白名单管理:前端和接口白名单限制等 后台IP白名单管理:后台登录用户白名单限制 软件架构: springboot,springsecurity,mybatis,thymeleaf,activemq,redis单机、哨兵、集群,html5兼容,layuimini,jquery,...