java 接口防刷_SpringBoot之接口防刷限制

importcom.alibaba.fastjson.JSON;importcom.emi2c.mybatis.config.annotation.AccessLimit;importcom.emi2c.mybatis.util.RedisUtil;importcom.emi2c.mybatis.util.ResultUtil;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;importorg.springframework.web.method.HandlerMethod;importorg.springframework.web.servlet.handler.HandlerInterceptorAdapter;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.OutputStream;importjava.util.Map;importjava.util.Objects;

@Componentpublic class AccessInterceptor extendsHandlerInterceptorAdapter {private Logger logger = LoggerFactory.getLogger(this.getClass());

@AutowiredprivateRedisUtil redisUtil;

@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throwsException {//判断请求是否属于方法的请求

if(handler instanceofHandlerMethod) {

HandlerMethod handlerMethod=(HandlerMethod) handler;//获取方法中的注解,看是否有该注解

AccessLimit accessLimit = handlerMethod.getMethodAnnotation(AccessLimit.class);if(accessLimit == null) {return true;

}//单位时间

int seconds =accessLimit.seconds();//访问次数

int maxCount =accessLimit.maxCount();//是否需要登陆

boolean needLogin =accessLimit.needLogin();

String key=request.getRequestURI();

logger.info("访问地址: {}", key);//是否需要登陆

if(needLogin) {

String username= request.getHeader("username");

key= key + "-" +username;

}//已访问次数

Object o =redisUtil.get(key);if(Objects.isNull(o)) {//第一次访问

redisUtil.incr(key, 1);

redisUtil.expire(key, seconds);

}else{//获取单位时间内已访问次数

Integer count =Integer.valueOf(redisUtil.get(key).toString());if(maxCount >count) {//没超出访问限制

redisUtil.incr(key, 1);

}else{//超出访问限制

logger.info("访问次数超出限制");

Map failure = ResultUtil.getFailure(200, "访问次数超出限制");

render(response, failure);return false;

}

}

}return true;

}/*** 封装消息

*@paramresponse

*@parammessage

*@throwsException*/

private void render(HttpServletResponse response, Map message)throwsException {

response.setContentType("application/json;charset=UTF-8");

OutputStream out=response.getOutputStream();

String str=JSON.toJSONString(message);

out.write(str.getBytes("UTF-8"));

out.flush();

out.close();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值