`
knight_black_bob
  • 浏览: 858167 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

redis 实现 ip 限制

阅读更多

 

参考: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捐助),没钱捧个人场,谢谢各位。



 
 
 谢谢您的赞助,我会做的更好!

 

 

 

 

 

  • 大小: 43.1 KB
1
2
分享到:
评论

相关推荐

    基于Redis实现分布式应用限流的方法

    【基于Redis实现分布式应用限流的方法】 限流是保护系统免受高并发访问或恶意攻击的重要手段,通过限制系统的处理速度或在特定时间窗口内处理的请求数量,防止系统资源耗尽导致服务崩溃。Redis,作为一款高效且广泛...

    php(TP5)+redis实现秒杀抢购(不限制用户购买次数和限制用户购买次数)

    3. **限流机制**:通过Redis的`INCR`命令实现计数器,限制同一用户或IP的请求次数,避免恶意刷单。 ### 数据一致性 1. **分布式锁**:利用Redis的`SETNX`命令设置分布式锁,确保同一时间内只有一个请求能进行库存...

    redis实现后台投票系统vote.rar

    - 虽然Redis默认不启用密码认证,但在生产环境中应配置密码,限制只允许特定IP访问,并监控Redis的日志,防止未授权访问。 10. **数据备份与恢复**: - 定期导出RDB或AOF文件进行备份,以便在需要时进行数据恢复...

    PHP实现redis限制单ip、单用户的访问次数功能示例

    总结一下,本篇文章介绍了如何使用PHP和Redis实现限制单IP和单用户访问次数的策略。主要涉及的知识点包括: 1. PHP与Redis的连接和授权。 2. 使用Redis的`exists`、`incr`和`expire`方法管理访问计数。 3. 获取...

    Springboot过滤器禁止ip频繁访问功能实现

    Springboot过滤器禁止ip频繁访问功能实现是指在Springboot项目中,通过编写一个过滤器来限制ip频繁访问的功能实现。这项功能可以防止恶意ip的访问,保护服务器的安全。 首先,需要了解什么是过滤器。在Web开发中,...

    Nginx利用Lua+Redis实现动态封禁IP的方法

    在这种场景下,"Nginx利用Lua+Redis实现动态封禁IP的方法"是一种高效且灵活的解决方案。下面我们将详细探讨这一方法的背景、架构、实现步骤以及其优点。 一、背景 当网站遭遇无明显特征的攻击,导致服务器响应缓慢...

    Go+Redis实现的并发安全限流器

    首先,我们来理解"Go+Redis实现的并发安全限流器"的核心概念。Go语言以其高效的并发模型和丰富的库支持,是构建这种限流器的理想选择。Redis则作为一个高性能的键值存储系统,可以快速地处理大量的读写操作,适合...

    IP地址段的过滤,限制ip,限制主机访问

    我们可以通过自定义Filter实现IP过滤,如在`doFilter()`方法中检查请求的IP地址。 4. **Web应用配置**:在`web.xml`配置文件中,可以定义Filter并指定其拦截哪些URL模式。对于IP过滤,我们可以配置Filter匹配所有...

    WPF操作Redis简单实例

    9. **安全性**:了解如何保护Redis服务器,如设置访问权限、限制IP访问、加密传输等,防止数据泄露。 通过这个简单的实例,开发者可以了解到如何在WPF应用中有效地使用Redis,实现高效的数据存储和检索,同时也能够...

    redis7.2.3-windows

    考虑到Redis默认使用未加密的端口,应设置防火墙规则,只允许特定IP地址访问。还可以通过配置文件启用认证,增加一层安全保护。 综上所述,Redis 7.2.3在Windows下的使用涵盖了从安装配置到实际应用的多个环节。...

    web-api-redis-request-throttling:使用ASP.NET Web API和Redis实现请求限制的示例

    本文将深入探讨如何使用ASP.NET Web API和Redis来实现这一功能。我们将重点讨论以下几个方面: 1. **ASP.NET Web API**: ASP.NET Web API是微软提供的一种构建RESTful服务的框架,允许开发者创建HTTP服务,可以被...

    mvn+redis实现商城秒杀项目

    同时,为了防止恶意攻击,还可以结合其他安全策略,如验证码、IP限制等。 总的来说,`mvn+Redis`的商城秒杀系统充分利用了`Maven`的项目管理和`Redis`的高性能特性,实现了高效、可靠的秒杀流程。通过深入理解和...

    Tomcat+Redis实现session会话共享TomcatRedisSessionManager-1.0.zip

    2. **配置Redis连接参数**:在`context.xml`或者`server.xml`中,设置Redis服务器的IP地址、端口、密码等连接参数,以及session的过期时间等配置。 3. **安装和配置Redis**:在服务器上安装Redis,并根据应用需求...

    c#操作redis驱动ServiceStack.Redis,V3.9版本,免费不限制次数免破解

    - 配置Redis客户端,一般需要提供Redis服务器的IP地址和端口号,例如:`var redis = new RedisClient("127.0.0.1:6379");` 3. **基本操作**: - **键值操作**:设置键值`redis.Set("key", "value")`,获取值`...

    Redis windows 64 版本 下载

    - `redis.windows.conf`是Redis在Windows上的默认配置文件,可以根据需求进行修改,如设置端口号、密码、内存限制等。 5. **启动与关闭Redis**: - 运行`redis-server.exe redis.windows.conf`命令启动Redis...

    redis-7.0.15-win-amd64

    2. `bind`: 定义Redis服务器允许连接的IP地址,可以设置为0.0.0.0以允许所有IP连接。 3. `requirepass`: 如果设置,客户端连接需要提供密码验证。 4. `appendonly`: 是否启用AOF(Append Only File)持久化模式。 5....

    Centos下安装redis服务v1.0

    - 使用防火墙限制 Redis 只接受特定 IP 的连接。 - 使用 Redis Sentinel 实现高可用性,监控主从节点状态,自动故障转移。 - 定期执行 `FLUSHDB` 或 `FLUSHALL` 清理无用数据,避免内存占用过多。 - 考虑使用 Redis ...

    redis32位安装包

    同时,可以通过`bind`指令限制服务器只接受特定IP的连接请求。 11. **监控与性能优化**: Redis提供了丰富的监控命令,如`INFO`,可以获取服务器状态信息。优化方面,注意内存管理,合理设置最大内存限制,并考虑...

    redis7.0.5 Windows版本

    Redis集群功能允许你将多个Redis实例组成一个逻辑整体,实现数据分片和故障转移。在Windows版本中,设置集群可能需要更多的手动配置和使用集群管理工具。 10. **性能监控** Redis提供了一系列内置的性能指标,...

    redis-windows-7.2.4.zip

    - 通过`bind`选项限制Redis服务器仅接受特定IP的连接,防止远程访问。 通过了解并掌握以上知识点,你将能够有效地在Windows环境中安装、配置和使用Redis,利用其强大的功能来优化你的应用程序性能。

Global site tag (gtag.js) - Google Analytics