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信息了。

相关推荐
Saniffer_SH4 分钟前
【每日一题】讲讲PCIe链路训练和枚举的前后关系
运维·服务器·网络·数据库·驱动开发·fpga开发·硬件工程
倔强的石头_13 分钟前
金融行业数据库选型盘点——Kingbase PLSQL迁移指南
数据库
梓沂13 分钟前
解决项目容器启动时MySQL端口检测的问题
数据库·mysql
vx_bisheyuange15 分钟前
基于SpringBoot的老年一站式服务平台
java·spring boot·后端·毕业设计
计算机毕设VX:Fegn089527 分钟前
计算机毕业设计|基于Java + vue水果商城系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot·课程设计
川贝枇杷膏cbppg36 分钟前
DmServiceDMSERVER.log是干嘛的
java·服务器·数据库
SHANGHAILINGEN42 分钟前
植物三维基因组综合数据库——3D-GDP
数据库
木风小助理1 小时前
子查询与 JOIN 查询性能比较:执行机制与适用场景解析
数据库·sql·mysql
九章-1 小时前
智慧文旅信创落地新标杆:四川省文旅厅完成MySQL 5.7平滑替换,筑牢省级管理平台自主可控底座
数据库·mysql
蟹至之2 小时前
【MySQL】事务
数据库·mysql·事务