springboot开发网站-使用redis数据库定时特征限制指定ip的访问次数

springboot开发网站-使用redis数据库定时特征限制指定ip的访问次数。近期网站经常有人恶意访问,提交了很多垃圾信息。为了屏蔽这类灌水帖,打算屏蔽ip地址,限制24小时内只能访问1次某个接口。下面是测试的案例代码内容。


1:首先,我们需要增加redis数据库的管理插件maven标记。

复制代码
<!-- 添加Redis依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

2:其次,我们需要增加一个redis的代理管理实体类。

复制代码
package com.example.guan.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;

@Configuration
public class RedisConfig {
    @Bean
    public LettuceConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory(); // 默认连接本地
    }
    @Bean
    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory redisConnectionFactory) {
        final RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
}

声明,如果你是想让这个代理类,链接某个指定的redis库,可以进一步在初始化实体类的过程中,新增参数,包括设置你自己的访问密码。我因为是默认了第一个,所以我就不需要写了。


你还可以设置自己的访问密码信息。


3,有了以上铺垫,我们开启本地redis数据库,然后写一个测试的控制器。试试看。

如图,我的本地redis已经开启初始化完成了。服务中。

4:测试控制器代码内容。

复制代码
package com.example.guan.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.time.LocalDate;
import java.util.concurrent.TimeUnit;

@RestController
public class MyController {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @GetMapping("/hello")
    public String handleRequest(HttpServletRequest request) {
        // 1.获取访客IP
        String ip = request.getHeader("X-Forwarded-For");
        if (ip == null || ip.isEmpty()) {
            ip = request.getRemoteAddr();
            System.out.println("current user ip:" + ip);
        }

        // 2.使用IP作为key,今天的日期作为prefix
        String key = "rate:limit:" + ip + ":";
        String date = LocalDate.now().toString();
        key += date;
        System.out.println("keyinfo:" + key);

        // 3.检查用户今天的请求次数
        ValueOperations<String, Object> opsForValue = redisTemplate.opsForValue();
        //查询redis内是否已经存在当前ip日期组合的信息
        Integer count = (Integer) opsForValue.get(key);

        // 4.如果是第一次请求或者超过24小时,重置计数
        if (count == null) {
            count = 0;
            System.out.println("你 first ,ok access this url访问该地址");
            // 更新请求计数
            count++;
            opsForValue.set(key, count, 24, TimeUnit.HOURS); // 设置键的过期时间为24小时
            // 继续处理请求...

        } else if (count != null && count >= 1) {
            return "访问次数超过上限,请明天tomorrow再来访问,谢谢";
        }
        return "请求hello接口地址,反馈数据成功";
    }
}

如图,下图就是测试结果截图。我因为已经访问了一次了,所以第二次请求的时候,就会提示,超过上限,请明天再来访问。

我没有做汉字的编码,所以汉字是乱码的。这个不影响我们的redis(信息的反馈结果)。说明,我们读取到了redis数据库内部,已经有这样一个key信息了。

相关推荐
松涛和鸣1 小时前
72、IMX6ULL驱动实战:设备树(DTS/DTB)+ GPIO子系统+Platform总线
linux·服务器·arm开发·数据库·单片机
likangbinlxa1 小时前
【Oracle11g SQL详解】UPDATE 和 DELETE 操作的正确使用
数据库·sql
r i c k2 小时前
数据库系统学习笔记
数据库·笔记·学习
汤姆yu2 小时前
基于springboot的尿毒症健康管理系统
java·spring boot·后端
暮色妖娆丶2 小时前
Spring 源码分析 单例 Bean 的创建过程
spring boot·后端·spring
野犬寒鸦2 小时前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
IvorySQL3 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·3 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德3 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
biyezuopinvip3 小时前
基于Spring Boot的企业网盘的设计与实现(任务书)
java·spring boot·后端·vue·ssm·任务书·企业网盘的设计与实现