热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

springboot对某个接口进行次数限制,防刷。简易版。demo。

一般的项目如果没有做防刷容易被人爆接口或者就是说没有做token防刷过滤。容易被人用正常的token刷接口。有些token非一次性。用户登录之后生成token会有一个过期时间,但一

一般的项目 如果没有做防刷 容易被人爆接口 或者就是说没有做token防刷过滤。

容易被人用正常的token刷接口。有些token非一次性。

用户登录之后生成token会有一个过期时间,但一般没有做频率检查,每访问一次,会延长这个token时间,刷新用户状态

另一种就是养号,拿着真实的token,哪怕你是5分钟 1分钟。

很多的网站找回密码的接口是没有做防刷的,只是检查token是否正常。

通过验证码认证当前用户,是否为当前用户。

前几天,就用多线程刷过一个三方网站的找回密码。成功改掉密码。

一般的网站在改密码的接口都会先查一次此号码是否已经注册,相反就可以通过这个接口猜出真实的用户手机号,

然后多线程调这个接口猜验证码,一般为4位,复杂点的为6位。也会有一些项目加了图形拖拽(第三方)

前端会提交相关信息给第三方平台,分析你是不是正常的用户动作,直接封IP。

但是用户体验差一点,有些网站为了用户体验,忽略了网站安全性,看业务上的取舍了。

进入正题:简易版(demo)

  aop 实现 :

package com.zhouixi.serviceA.aspect;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.swing.text.Keymap;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.zhouixi.serviceA.annotation.LimitKey;
@Component
@Order
@Aspect
public class LimitAspect {
private Map limitMap = new HashMap();


private static final Logger log = LoggerFactory.getLogger(LimitAspect.class);
@Pointcut("@annotation(limitKey)")
public void limit(LimitKey limitKey) {
}
@Around("limit(limitKey)")
public Object aroundLog(ProceedingJoinPoint joinpoint,LimitKey limitKey) throws Throwable {
MethodSignature methodSignature = (MethodSignature) joinpoint.getSignature();
int frequency = limitKey.frequency();
String methodName = limitKey.methodName();
String paramKey = limitKey.paramKey();
String url = limitKey.url();
//入参
String[] parameterNames = methodSignature.getParameterNames();
Object[] args = joinpoint.getArgs();
Object obj = null ;

for(int i = 0 ; i if(parameterNames[i].equals(paramKey)) {
obj = args[i];
break;
}
}

System.err.println("args : "+Arrays.toString(args));
System.err.println("keys : "+Arrays.toString(parameterNames));

StringBuffer sb = new StringBuffer();
sb.append(url).append("/_").append(methodName).append("_").append(paramKey).append("_").append(obj).append("_key");
if(limitMap.get(sb.toString()) == null ) {
limitMap.put(sb.toString(),frequency-1);
} else {

int l = (int) limitMap.get(sb.toString());
if(l > 0){
limitMap.put(sb.toString(), --l);
} else {
throw new Exception ("系统繁忙,请重试");
}
}
//reids 代替map redis.set(sb.toString(),frequency,limitKey.timeout());
System.err.println("剩余次数:"+limitMap.get(sb.toString())+"----->----->----->自定义key:"+sb.toString());
return joinpoint.proceed();
}
}

 

controller:

    

     注解声明:

  

  效果图:

最后一次:

  

 

postman:

  

 

完成。真实生产场景要换成redis 其他nosql

 


推荐阅读
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
author-avatar
弓X箭_281
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有