1,pom引入依赖

<dependency><groupId>com.github.kaligence</groupId><artifactId>requestLimit</artifactId><version>${requestLimit.version}</version>
</dependency>

2,定义拦截器

import com.alibaba.fastjson.JSONObject;
import com.github.kaligence.requestLimit.RequestLimit;
import com.sun.java.browser.plugin2.liveconnect.v1.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.Method;
import java.util.concurrent.TimeUnit;/*** 请求拦截*/
@Slf4j
@Component
public class RequestLimitIntercept extends HandlerInterceptorAdapter {@Autowiredprivate RedisTemplate redisTemplate;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {/*** isAssignableFrom() 判定此 Class 对象所表示的类或接口与指定的 Class 参数所表示的类或接口是否相同,或是否是其超类或超接口* isAssignableFrom()方法是判断是否为某个类的父类* instanceof关键字是判断是否某个类的子类*/if(handler.getClass().isAssignableFrom(HandlerMethod.class)){//HandlerMethod 封装方法定义相关的信息,如类,方法,参数等HandlerMethod handlerMethod = (HandlerMethod) handler;Method method = handlerMethod.getMethod();// 获取方法中是否包含注解RequestLimit methodAnnotation = method.getAnnotation(RequestLimit.class);//获取 类中是否包含注解,也就是controller 是否有注解RequestLimit classAnnotation = method.getDeclaringClass().getAnnotation(RequestLimit.class);// 如果 方法上有注解就优先选择方法上的参数,否则类上的参数RequestLimit requestLimit = methodAnnotation != null?methodAnnotation:classAnnotation;if(requestLimit != null){if(isLimit(request,requestLimit)){Result result = new Result("訪問次數超過上線",false);resonseOut(response, result);return false;}}}return super.preHandle(request, response, handler);}//判断请求是否受限public boolean isLimit(HttpServletRequest request,RequestLimit requestLimit){// 受限的redis 缓存key ,用sessionId 来做唯一key,如果是app ,可以使用 用户ID 之类的唯一标识。String limitKey = request.getServletPath()+request.getSession().getId();// 从缓存中获取,当前这个请求访问了几次Integer redisCount = (Integer) redisTemplate.opsForValue().get(limitKey);log.info(limitKey + "在"+requestLimit.requestTime()+"S内被点击次数:"+redisCount);if(redisCount == null){//初始 次数redisTemplate.opsForValue().set(limitKey,1,requestLimit.requestTime(), TimeUnit.SECONDS);}else{if(redisCount.intValue() >= requestLimit.requestCount()){return true;}// 次数自增redisTemplate.opsForValue().increment(limitKey,1);//RedisUtils.incr(limitKey);}return false;}/*** 回写给客户端* @param response* @param result* @throws IOException*/private void resonseOut(HttpServletResponse response, Result result) throws IOException {response.setCharacterEncoding("UTF-8");response.setContentType("application/json; charset=utf-8");PrintWriter out = null ;String json = JSONObject.toJSON(result).toString();out = response.getWriter();out.append(json);}

3,注册拦截器

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;@Configuration
public class InterceptorAdapterConfig extends WebMvcConfigurerAdapter {@Autowiredprivate RequestLimitIntercept authorityInterceptor;//private AuthorityInterceptor authorityInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry){//注册自己的拦截器并设置拦截的请求路径registry.addInterceptor(authorityInterceptor).addPathPatterns("/**");super.addInterceptors(registry);}
}

4,在controller中的方法上加入注解

@RequestLimit(requestCount = 2L,requestTime = 30L)

30秒内允许2个请求。

Java拦截器限制IP访问次数相关推荐

  1. JAVA通过拦截器实现IP黑名单

    SpringMVC:通过拦截器实现IP黑名单 以前没有遇到这个需要,后面在网上找了很久,参考了很多文档给出的方案. 1.配置拦截器 这里使用全局拦截: <mvc:interceptors> ...

  2. Redis + Java拦截器实现用户匿名和非匿名访问

    文章目录 需求 实现截图 核心代码 WebMvcConfigurer HandlerInterceptor 判断用户是否有权限 ThreadLocal 该篇文章以<Redis实现短信验证码登录& ...

  3. 区分Java拦截器和过滤器

    今天带大家分析java拦截器和过滤器的区别,文中有非常详细的解释说明,对正在学习java的小伙伴们有很好的帮助,需要的朋友可以参考下 一.过滤器(filter) 过滤器处于客户端与Web资源(Serv ...

  4. java 判断请求为 ajax请求_Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,java 判断请求是不是ajax请求...

    Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求 java 判断请求是不是ajax请求,Java判断是否为ajax请求 >>>>>> ...

  5. Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,java 判断请求是不是ajax请求

    Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,java 判断请求是不是ajax请求 Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求 java 判断 ...

  6. Springboot拦截器实现IP黑名单

    Springboot拦截器实现IP黑名单 一·业务场景和需要实现的功能 以redis作为IP存储地址实现.业务场景:针对秒杀活动或者常规电商业务场景等,防止恶意脚本不停的刷接口.实现功能:写一个拦截器 ...

  7. JAVA拦截器(Interceptor)实现以及原码示例

    JAVA拦截器(Interceptor)实现以及原码示例 概念 SpringMVC中拦截器[interceptor] 一.实现拦截器代码 二.单/多 个拦截器运行 1.单个拦截器 2.多个拦截器 源码 ...

  8. linux日志生成速率统计,Linux学习29-awk提取log日志信息,统计日志里面ip访问次数排序...

    前言 有一段log日志,需从日志里面分析,统计IP访问次数排序前10名,查看是否有异常攻击. 日志提取 如下日志,这段日志包含的信息内容较多,我们希望提取ip,访问时间,请求方式,访问路径(不带参数) ...

  9. java拦截器项目应用_使用拦截器分析Java EE应用程序的性能下降/提高

    java拦截器项目应用 在开发具有某些性能要求的Java EE应用程序时,必须在每个发行版之前验证是否满足这些要求. 您可能会想到,哈德森的一项工作每天晚上在某些特定的硬件平台上执行一系列测试测量. ...

  10. 用户IP访问次数统计

    技术源于生活,服务生活 线上地址:https://api.imibi.cn Redis存储 1.使用Redis的0号数据库,数据格式是hash. import redis con = redis.Re ...

最新文章

  1. dbgridview内操作粘贴,复制,等量复制,增量复制
  2. double转换为int以及浮点型相加损失精度问题
  3. ESP8266/ESP32自动下载电路分析
  4. Web(浏览器)打开运行WinForm应用程序
  5. java api 测试工具_Java 实现在线HTTP接口测试 - HTTP GET/POST模拟请求测试工具
  6. linux 7 远程桌面xrdp,[转帖]CentOS7安装xrdp(windows远程桌面连接linux)
  7. java运行环境(jre)_什么是JRE? Java运行时环境简介
  8. 如何使用视频剪辑软件将qsv格式视频转换为MP4格式
  9. x264源码分析与应用示例(二)——码率控制
  10. ZigBee研究之旅(三)---CC2530的电源管理模块
  11. 如何有效投诉中国电信、中国联通、中国移动?
  12. 操作系统重要知识清单:一起来搞懂进程呀!!
  13. R语言字符串相关操作
  14. @click.stop作用(阻止点击事件继续传播,即阻止事件冒泡)
  15. 谈谈我在PyTorch踩过的12坑
  16. 计算机solidwork实训报告,SolidWorks实训报告.doc
  17. Python numpy实现二维数组和一维数组拼接
  18. Python 位置名称通过高德API获取行政区划信息ByMySQL
  19. 计算机考研调剂是按分数的么,考研调剂是不是看初试分数的
  20. 微信转移聊天记录方法

热门文章

  1. C语言数据结构之顺序队列
  2. 【微信小程序】微信Web开发者工具下载及安装
  3. vue 插槽的版本变化1.x-2.6.0-3.x(详细)
  4. MATLAB之ODE
  5. 谭浩强C语言(第三版)习题6.11
  6. 查看Python第三方库的帮助文档
  7. 【odoo15】如何使用 python xmlrpc 连接 odoo
  8. idea安装python 插件_IntelliJ IDEA安装运行python插件方法
  9. 火山安卓简单分组列表框
  10. 金融网络直播室软件的功能介绍