当前位置: 首页 > news >正文

网站跟app的区别是什么网络搭建结构图

网站跟app的区别是什么,网络搭建结构图,谷歌搜索引擎下载安装,北京学校网站建设文章目录 前言具体实现步骤1. 定义自定义注解2. 编写拦截器类IpUrlLimitInterceptor3. 在WebConfig类中添加IpUrlLimitInterceptor4. 添加注解到接口上 测试效果参考文章 前言 在实际项目中#xff0c;有些攻击者会使用自动化工具来频繁刷新接口#xff0c;造成系统的瞬时吞… 文章目录 前言具体实现步骤1. 定义自定义注解2. 编写拦截器类IpUrlLimitInterceptor3. 在WebConfig类中添加IpUrlLimitInterceptor4. 添加注解到接口上 测试效果参考文章 前言 在实际项目中有些攻击者会使用自动化工具来频繁刷新接口造成系统的瞬时吞吐量提高给系统带来很大的压力。要保障服务的安全性需要防止重要的接口被恶意刷新接口防刷的方式可以通过设置验证码IP封禁安全参数校验等方法。本文主要采用Redis将同一时间内频繁访问同一接口的IP封禁一段时间的方式来防止接口被恶意刷新。 具体实现步骤 1. 定义自定义注解 添加了该注解的接口将开启接口防刷功能。/** * 防刷注解 */ Target(ElementType.METHOD) Documented Retention(RetentionPolicy.RUNTIME) public interface AccessLimit {/*** 表示规定的时间范围*/int seconds();/*** 表示在规定的时间范围内最多可被访问的次数*/int maxCount();/*** 表示该接口是否需要登录默认为true*/boolean needLogin() default true; }2. 编写拦截器类IpUrlLimitInterceptor 核心拦截器IpUrlLimitInterceptor的代码如下 Slf4jpublic class IpUrlLimitInterceptor implements HandlerInterceptor {AutowiredRedisUtil redisUtil; //redis工具类Autowiredprivate TokenManager tokenManager; //登录时的token检验管理器private static final String LOCK_IP_URL_KEY lock_ip_;private static final String IP_URL_REQ_TIME ip_url_times_;private static final int IP_LOCK_TIME 60; //IP被禁用的时间 此处为了方便测试设置为一分钟 实际情况应该在配置文件里设置Overridepublic boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {if (o instanceof HandlerMethod) {HandlerMethod hm (HandlerMethod) o;// 获取AccessLimit注解AccessLimit accessLimit hm.getMethodAnnotation(AccessLimit.class);if(Objects.isNull(accessLimit)){return true;}log.info(request请求地址uri{},ip{}, httpServletRequest.getRequestURI(), IpUtil.getIp(httpServletRequest));//判断IP是否被锁定若被锁定则访问异常提示信息if (ipIsLock(IpUtil.getIp(httpServletRequest))) {log.info(ip访问被禁止{}, IpUtil.getIp(httpServletRequest));Result result Result.exception().code(ResultCode.LOCK_IP).message(该IP已被锁定请等候解锁);returnJson(httpServletResponse, JSON.toJSONString(result));return false;}//接口若需要登录则校验token//获取请求头里的token信息判断是否正确若token不正确则return falseif(accessLimit.needLogin()!tokenManager.checkToken(httpServletRequest.getHeader(Authorization))){ return false;}//记录请求次数记录后若大于规定时间内的规定次数则返回异常提示信息if (!addRequestTime(IpUtil.getIp(httpServletRequest), httpServletRequest.getRequestURI(), accessLimit.seconds(),accessLimit.maxCount())) {Result result Result.exception().code(ResultCode.LOCK_IP).message(该IP已被锁定请等候解锁);returnJson(httpServletResponse, JSON.toJSONString(result));return false;}}return true;}Overridepublic void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {}Overridepublic void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {}/*** param ip* return java.lang.Boolean* Description: 判断ip是否被禁用*/private Boolean ipIsLock(String ip) {if (redisUtil.hasKey(LOCK_IP_URL_KEY ip)) {return true;}return false;}/*** param ip* param uri* return java.lang.Boolean* Description: 记录请求次数*/private Boolean addRequestTime(String ip, String uri,int seconds,int maxCount) {String key IP_URL_REQ_TIME ip uri;if (redisUtil.hasKey(key)) {//访问次数加1long time redisUtil.incrBy(key, 1);if (time maxCount) {redisUtil.getLock(LOCK_IP_URL_KEY ip, ip, IP_LOCK_TIME);return false;}} else {//seconds秒内访问maxCount次就锁柱redisUtil.getLock(key, 1, seconds);}return true;}private void returnJson(HttpServletResponse response, String json) throws Exception {PrintWriter writer null;response.setCharacterEncoding(UTF-8);response.setContentType(text/json; charsetutf-8);try {writer response.getWriter();writer.print(json);} catch (IOException e) {log.error(LoginInterceptor response error --- {}, e.getMessage(), e);} finally {if (writer ! null) {writer.close();}}}}上述代码中的RedisUtil具体方法如下完整的RedisUtil类获取方式Java - Redis操作的工具类RedisUtilComponent Slf4j public class RedisUtil {private static final Long SUCCESS 1L;Autowiredprivate RedisTemplateString, Object redisTemplate;/*** 获取锁* 代码中redis的使用的是分布式锁的形式这样可以最大程度保证线程安全和功能的实现效果。* param lockKey* param value* param expireTime单位-秒* return*/public boolean getLock(String lockKey, Object value, int expireTime) {try {log.info(添加分布式锁key{},expireTime{}, lockKey, expireTime);String script if redis.call(setnx,KEYS[1],ARGV[1]) then if redis.call(get,KEYS[1])ARGV[1] then return redis.call(expire,KEYS[1],ARGV[2]) else return 0 end end;RedisScriptLong redisScript new DefaultRedisScript(script, Long.class);Object result redisTemplate.execute(redisScript, Collections.singletonList(lockKey), value, expireTime);if (SUCCESS.equals(result)) {return true;}} catch (Exception e) {e.printStackTrace();}return false;}//其他方法.... }拦截器中的IpUtil工具类获取方式Java-IpUtil通过请求获取IP信息的工具类 3. 在WebConfig类中添加IpUrlLimitInterceptor Configurationpublic class WebConfig extends WebMvcConfigurerAdapter {BeanIpUrlLimitInterceptor getIpUrlLimitInterceptor() {return new IpUrlLimitInterceptor();}/*** 注册登录ip防刷拦截器* return*/Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(getIpUrlLimitInterceptor()).addPathPatterns(/**);super.addInterceptors(registry);} }4. 添加注解到接口上 编写一个接口将刚刚的防刷注解添加上去 RestControllerRequestMapping(/part/util)public class UtilController {/*** 防刷注解测试* return*/GetMapping(/ipLimitTest)AccessLimit(seconds 1,maxCount 5,needLogin false)//表示一秒内该接口只能访问五次防止恶意刷流量这里接口无需登录public Result ipLimitTest(){return Result.ok().data(访问成功);} }测试效果 手写一个for循环请求10次ipLimitTest()接口观察日志情况如下: 超过五次之后该ip就被锁定1分钟。一分钟内的访问被禁止。此时查询redis的key可以发现该ip锁住。 参考文章 如何解决SpringBoot 接口恶意刷新和暴力请求荣耀典藏版
http://www.pierceye.com/news/687317/

相关文章:

  • 网站后台如何修改密码wordpress调整页面布局
  • 东莞热点网站建设莱州人才网
  • 线上渠道推广网站的优化哪个好
  • 群晖可以做网站服务器微信朋友圈怎么发链接那种网页怎么制作
  • wordpress 公司网站网站和公众号的区别
  • 数据库跟网站seo流程
  • 网站首页关键词设置网站的整体风格
  • wordpress源码站整站源码制作wordpress插件
  • 海口网站建设就q479185700上墙网站空间后台怎么进入
  • 四川电子有限公司 - 手机网站如何做网站家具导购
  • 网站经营性备案修改wordpress自带小工具
  • 网站怎么建设可以发图评论网站建设制作公
  • 做销售的网站设计公司是做什么的
  • 建设专业网站的利弊海淀区seo招聘信息
  • 吴江区住房与建设局网站网站开发怎么对接客户
  • frontpage2007网站建设网站开发需要redis
  • 国内做网站多少钱ui中有哪些做的好看的网站
  • 金湖建设工程质量监督网站网页设计 网站建设 哪个好
  • 适合做外链的网站梧州论坛红豆思辨
  • 永城网站设计公司wordpress 获取父分类
  • 网站开发语言是什么东莞营销网站建设价格
  • 外贸公司访问国外网站中学生做的网站有哪些方面
  • 南城网站建设公司信息wordpress怎样显示文章全部列表
  • 做推广什么网站便宜企业网站管理系统湖南岚鸿
  • 电影下载网站 怎么做flash翻页效果网站模板
  • 社交网站开发语言河北建设工程信息网首页
  • 上海营销型网站建设公司wordpress 自己做页面
  • 网站布局选择临淄信息网手机版
  • 怎样申请网站呢注册商标怎么注册商标
  • 网站地址英文不相关的网站做单项链接可以吗