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

网站免费建站 图标一个网站完整的html代码

网站免费建站 图标,一个网站完整的html代码,东莞五金网站建设,wordpress内容新窗口打开在上一节中#xff0c;该接口已经接受过风控的处理#xff0c;过滤掉了机器人脚本请求#xff0c;剩下都是人为的下单请求。为了防止用户短时间内高频率点击抢课链接#xff0c;海量请求造成服务器过载#xff0c;这里使用接口限流算法。 先介绍下几种常用的接口限流策略…在上一节中该接口已经接受过风控的处理过滤掉了机器人脚本请求剩下都是人为的下单请求。为了防止用户短时间内高频率点击抢课链接海量请求造成服务器过载这里使用接口限流算法。 先介绍下几种常用的接口限流策略 1.计数器算法固定窗口 计数器算法是使用计数器在周期内累加访问次数当达到设定的限流值时触发限流策略。下一个周期开始时进行清零重新计数。 此算法存在一个问题就是在此周期快结束时大量请求泳入请求一直持续到下一周期开始一段时间后这段时间的接口访问量大大超过服务器的负载却小于每个周期的计数器最大值。 2.滑动窗口 滑动窗口算法是将时间周期分为N个小周期分别记录每个小周期内访问次数并且根据时间滑动删除过期的小周期。尽可能地平滑过渡每一个小周期。 3、漏桶算法 漏桶算法是访问请求到达时直接放入漏桶如当前容量已达到上限限流值则进行丢弃触发限流策略。漏桶以固定的速率进行释放访问请求即请求通过直到漏桶为空。 4.令牌桶算法 令牌桶算法是程序以rr时间周期/限流值的速度向令牌桶中增加令牌直到令牌桶满请求到达时向令牌桶请求令牌如获取到令牌则通过请求否则触发限流策略 本文常用简单有效的固定窗口策略进行接口限流具体流程如下 1.自定义接口限流注解 package com.example.seckilldemo.config;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; Retention(RetentionPolicy.RUNTIME) Target(ElementType.METHOD) public interface AccessLimit {int second();int maxCount();boolean needLogin() default true; } 2.将接口限流做成拦截器写入WebConfig中在回掉方法中扫描到有限流注解的接口进行接口限流 package com.example.seckilldemo.config;import com.example.seckilldemo.pojo.User; import com.example.seckilldemo.service.UserService; import com.example.seckilldemo.utils.CookieUtil; import com.example.seckilldemo.vo.RespBean; import com.example.seckilldemo.vo.RespBeanEnum; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import org.thymeleaf.util.StringUtils;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.concurrent.TimeUnit;Component public class AccessLimitInterceptor implements HandlerInterceptor {Autowiredprivate UserService itUserService;Autowiredprivate RedisTemplate redisTemplate;Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {if (handler instanceof HandlerMethod) {User tUser getUser(request, response);UserContext.setUser(tUser);HandlerMethod hm (HandlerMethod) handler;//判断有没有接口限流的注解AccessLimit accessLimit hm.getMethodAnnotation(AccessLimit.class);if (accessLimit null) {return true;}int second accessLimit.second();int maxCount accessLimit.maxCount();boolean needLogin accessLimit.needLogin();String key request.getRequestURI();if (needLogin) {if (tUser null) {render(response, RespBeanEnum.SESSION_ERROR);}key : tUser.getId();}//接口限流使用计数器算法ValueOperations valueOperations redisTemplate.opsForValue();Integer count (Integer) valueOperations.get(key);if (count null) {valueOperations.set(key, 1, second, TimeUnit.SECONDS);} else if (count maxCount) {valueOperations.increment(key);} else {render(response, RespBeanEnum.ACCESS_LIMIT_REACHED);return false;}}return true;}private void render(HttpServletResponse response, RespBeanEnum respBeanEnum) throws IOException {response.setCharacterEncoding(UTF-8);response.setContentType(application/json);PrintWriter printWriter response.getWriter();RespBean bean RespBean.error(respBeanEnum);printWriter.write(new ObjectMapper().writeValueAsString(bean));printWriter.flush();printWriter.close();}private User getUser(HttpServletRequest request, HttpServletResponse response) {String userTicket CookieUtil.getCookieValue(request, userTicket);if (StringUtils.isEmpty(userTicket)) {return null;}return itUserService.getUserByCookie(userTicket, request, response);} } 这里还有个问题是虽然自增是原子操作但是获取计数器并不是改进使用lua脚本配合计数器实现接口限流原子性操作 Component public class AccessLimitInterceptor implements HandlerInterceptor {Autowiredprivate UserService itUserService;Autowiredprivate RedisTemplate redisTemplate;Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {if (handler instanceof HandlerMethod) {User tUser getUser(request, response);UserContext.setUser(tUser);HandlerMethod hm (HandlerMethod) handler;//判断有没有接口限流的注解AccessLimit accessLimit hm.getMethodAnnotation(AccessLimit.class);if (accessLimit ! null) {int second accessLimit.second();int maxCount accessLimit.maxCount();boolean needLogin accessLimit.needLogin();String key request.getRequestURI();if (needLogin) {if (tUser null) {render(response, RespBeanEnum.SESSION_ERROR);return false;}key : tUser.getId();}// 使用Lua脚本确保操作的原子性String luaScript local currentCount redis.call(get, KEYS[1]) if currentCount and tonumber(currentCount) tonumber(ARGV[1]) then redis.call(incr, KEYS[1]) if tonumber(currentCount) 0 then redis.call(expire, KEYS[1], ARGV[2]) end return 0 end return 1;DefaultRedisScriptBoolean redisScript new DefaultRedisScript(luaScript, Boolean.class);Boolean isLimited (Boolean) redisTemplate.execute(redisScript, Collections.singletonList(key), maxCount, second);if (isLimited) {render(response, RespBeanEnum.ACCESS_LIMIT_REACHED);return false;}}}return true;}private void render(HttpServletResponse response, RespBeanEnum respBeanEnum) throws IOException {response.setCharacterEncoding(UTF-8);response.setContentType(application/json);PrintWriter printWriter response.getWriter();RespBean bean RespBean.error(respBeanEnum);printWriter.write(new ObjectMapper().writeValueAsString(bean));printWriter.flush();printWriter.close();}private User getUser(HttpServletRequest request, HttpServletResponse response){String userTicket CookieUtil.getCookieValue(request, userTicket);if (StringUtils.isEmpty(userTicket)) {return null;}return itUserService.getUserByCookie(userTicket, request, response);} }
http://www.hkea.cn/news/14420139/

相关文章:

  • 网站不备案会有什么影响丝瓜app官网下载安装io
  • 免费单页网站建设高端网站建设公司哪里济南兴田德润实惠吗
  • 辽宁建设工程信息网场内业绩什么意思网站没有收录从哪开始做优化
  • 微信小程序是什么模式长沙seo网站排名优化
  • 简述网站建设评估的指标有哪些南通学校网站建设
  • 专业营销型网站定制wordpress 笑话站
  • 免费源码网站天建设工程类公司网站
  • 建设银行黑龙江省分行官方网站网站图片被盗连怎么办
  • 尧都区建设厅官方网站免费的云服务器哪家好
  • 利用vs做网站阳江招聘网的拼音
  • 广州网站建设 推广公司佛山优化网站排名收费
  • 滨州淘宝网站建设公司网站优化怎么做
  • 北京网站开发哪家好沈阳百度seo关键词排名优化软件
  • 中山火炬开发区建设局网站网站建设网站需要什么软件有哪些
  • 商务局网站群建设方案宝塔linux wordpress
  • 微信服务号绑定网站程序开发 网站开发
  • 杭州市做外贸网站的公司国内免费素材网站
  • 网站建设调查房地产新闻报道
  • 从零精通网站建设企业网站后台管理模板
  • 济南做网站哪里好p2p网站建设价格
  • 前端开发人员怎么做网站沈阳论坛建站模板
  • 凡科建站可以多人协作编辑吗tp5网站开发模板
  • 番禺制作网站系统简约网站建设
  • php网站开发教程图片一键生成logo的网站
  • 凡科建站官网免费注册网络架构中sdn是指
  • 新手做网站免费教程济南建设网站需要
  • 女生网站开发网络工程师要学多久
  • 常州网站建设效果网站app下载平台怎么做的
  • emeinet亿玫网站建设网站建设课程设计报告
  • 深圳网站开发公司哪家好哪里卖网站域名