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

长沙市住房与城乡建设厅网站html访问wordpress

长沙市住房与城乡建设厅网站,html访问wordpress,wordpress目录设置,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.dnsts.com.cn/news/159175.html

相关文章:

  • 车辆保险网站佳匠网站建设
  • 宁波网站建设主页龙华网站设计公司
  • 大连网站设计九必选仟亿科技如何做淘宝客个人网站
  • 潍坊住房公积金管理中心官网百度seo排名
  • 住房和城乡建设部标准定额网站网站联系方式连接怎么做
  • 网站设置快捷方式到桌面重庆个人网络营销定制
  • 易思腾网站建设企业高端网站建设公司
  • 凯里哪里有做网站的云设计平台
  • 广东深圳广东深圳网站建设WordPress中文企业免费主题
  • 网站换域名要怎么做建筑公司查询网站
  • 做网站和做app有什么不同哪些网站做婚纱摄影
  • 淘宝客网站整站源码网页设计制作报价
  • 自己学习做网站做网站为什么图片上传不了
  • 电影网站开发api手机版网站开发教学
  • 糖果网站建设目的专业建设内容
  • python快速搭建网站wordpress域名配置
  • ps做网站页面步骤一流的赣州网站建设
  • 有趣的网站游戏人和马做的视频网站
  • 帮别人做网站市场价wap 网站开发
  • 黄冈做网站技术支持的做那个的网页
  • 网站开发运行环境有哪些北京市基础建设质量监督局网站
  • 用dw6做网站首页网页建站怎么做
  • 做网站找我图片网站建设后需要录入
  • 网站文明建设工程包括做行政关注什么类型的网站
  • 网站做友链盈利企业网站空间购买
  • 代做效果图网站哪家好wordpress添加全屏广告
  • 安阳建设网站wordpress手机视频播放器
  • c++ 网站开发mt4网站可做黄金交易
  • 以前有个自助建设网站装修互联网营销公司
  • 企业建站系统价格Wordpress调用百度云