一般的项目 如果没有做防刷 容易被人爆接口 或者就是说没有做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 < parameterNames.length;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

spring boot 对某个接口进行次数限制,防刷。简易版。demo。的更多相关文章

  1. Spring Boot 之:接口参数校验

    Spring Boot 之:接口参数校验,学习资料 网址 SpringBoot(八) JSR-303 数据验证(写的比较好) https://qq343509740.gitee.io/2018/07/ ...

  2. spring boot https --restful接口篇

    我们写的接口默认都是http形式的,不过我们的接口很容易被人抓包,而且一抓全是明文的挺尴尬的 spring boot配置https生成证书大的方向有3种: 1.利用keytool自己生成证书 2.从免 ...

  3. Spring Boot项目的接口防刷

    说明:使用了注解的方式进行对接口防刷的功能,非常高大上,本文章仅供参考 一,技术要点:springboot的基本知识,redis基本操作, 首先是写一个注解类: import java.lang.an ...

  4. 解决spring boot中rest接口404,500等错误返回统一的json格式

    在开发rest接口时,我们往往会定义统一的返回格式,列如: { "status": true, "code": 200, "message" ...

  5. Spring Boot 实现ErrorController接口处理404、500等错误页面

    在项目中我们遇到404找不到的错误.或者500服务器错误都需要配置相应的页面给用户一个友好的提示,而在Spring Boot中我们需要如何设置. 我们需要实现ErrorController接口,重写h ...

  6. Spring boot 梳理 - WebMvcConfigurer接口 使用案例

    转:https://yq.aliyun.com/articles/617307 SpringBoot 确实为我们做了很多事情, 但有时候我们想要自己定义一些Handler,Interceptor,Vi ...

  7. Spring Boot提供RESTful接口时的错误处理实践

    使用Spring Boot开发微服务的过程中,我们会使用别人提供的接口,也会设计接口给别人使用,这时候微服务应用之间的协作就需要有一定的规范. 基于rpc协议,我们一般有两种思路:(1)提供服务的应用 ...

  8. 【轮询】【ajax】【js】【spring boot】ajax超时请求:前端轮询处理超时请求解决方案 + spring boot服务设置接口超时时间的设置

    场景描述: ajax设置timeout在本机测试有效,但是在生产环境等外网环境无效的问题 1.ajax的timeout属性设置 前端请求超时事件[网络连接不稳定时候,就无效了] var data = ...

  9. spring boot开发REST接口

    1.配置pom.xml文件的<parent>和<depencencies>,指定spring boot web依赖 <parent> <groupId> ...

随机推荐

  1. 匹配script标签及内容js代码的正则表达式

    <script>[\s\S]+?</script>

  2. javascript基本类型和对象

    JS 中分为七种内置类型,七种内置类型又分为两大类型:基本类型和对象(Object). 基本类型 null undefined boolean number string symbol 其中 JS 的 ...

  3. C#操作Windows控制面板

    先介绍一下Windows控制面板的一些操作,再介绍如何用C#语言来操作控制面板. 1.如何快速打开控制面板中的项目: 运行输入(大小写不敏感) control system 打开系统信息 contro ...

  4. Go 关于 kafka 的生产者、消费者实例

    zookeeper + kafka 首先要在 apche 官网下载 kafka 的程序包(linux版本),然后放到服务器上解压,得到以下目录 bin 目录下包含了服务的启动脚本 启动 zookeep ...

  5. CSS和LESS

    1.CSS 层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言.CSS ...

  6. JSONObject和URL以及HttpURLConnection的使用

    1 将java对象类转成json格式 首先引入依赖jar文件 注意依赖文件的版本号,高版本可能没有对应的类 2 我的实体类中包含内部类注意内部类要public才能被序列化成json格式 import ...

  7. bootstrap 模态窗口 多重/多个弹窗滚动条补丁

    由于bootstrap的模态窗口默认不支持多次弹出, 在关闭的时候会有滚动条消失的问题. 经过观察和查看源码, 发现在开启和关闭的时候会在body上增加/减少一个"modal-open&qu ...

  8. python 将字符串中的unicode字符码转换成字符

    将字符串str =’\u98ce\u534e\u7684\u51b2\u950b'转换成汉字显示 可以直接print输出 print u'\u98ce\u534e\u7684\u51b2\u950b' ...

  9. (一)react-native开发系列之Mac开发环境配置

    写在前面 在开始之前,先说下选择react-native的背景原因 最近一年来,公司为了节省开发成本,以及降低维护成本,指派我开始做起前端开发app的工作,我和公司的小伙伴们就开始了漫长的app开发之 ...

  10. linux uniq命令用法

    uniq命令: 对指定的ASCII文件或标准输入进行唯一性检查,以判断文本文件中重复出现的行,常用于分析日志:查看tcp各个状态连接数,ip或域名连接数排名等等场景,一般与 sort 命令结合使用. ...