zoukankan      html  css  js  c++  java
  • web系统访问频率限制

    无论是spring mvc还是struts,都可以为controller或者aciton执行前,增加拦截器。

    通过拦截器中的逻辑控制,可以实现访问频率的限制。

    首先构造访问频率数据类

    class FrequencyData {
        // 使用ip_methodName
        String        key;
        // 记录开始时间
        long        startTime;
        // 记录结束时间
        long        endTime;
        // 访问频率限制时间长度
        int            time;
        // 访问频率限制次数
        int            limit;
        // 记录访问时间点
        List<Long>    accessPoints    = new ArrayList<Long>();
    
        public void reset(long time) {
            startTime = endTime = time;
            accessPoints.clear();
            accessPoints.add(time);
        }
    }

    在spring mvc的拦截器中,可以获取到拦截的方法名,并通过request获取到客户端的IP地址。

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        ((HandlerMethod) handler).getMethod().getName();
        ((HandlerMethod) handler).getBean().getClass().getName();
      request.getRemoteAddr() ..... }

    在拦截器类中建立一个保存每个客户端访问记录的Map数据

    private static Map<String, FrequencyData>    FreqDatas            = new HashMap<String, FrequencyData>(MAX_SIZE);

    访问频率限制执行流程如下:

    1、计算key值,即为ip_methodName,获取对应的FrequencyData。

    2、如果FrequencyData数据不存在,新建并保存到FreqDatas中。

    3、FrequencyData数据中的time和limit可固定写死,也可通过注解获取(在被调用的方法上,增加自定义的注解,注解中指定两个参数)。

    4、在FrequencyData数据的accessPoints中增加一个记录,并更新endTime时间。

    5、计算endTime-startTime是否大于time值。如果大于,执行FrequencyData的reset()。

    6、计算accessPoints.size()是否大于limit值。若小于,继续执行调用的方法;若大于,不继续执行调用的方法

    此时,便可完成一个简单的访问频率控制功能。

  • 相关阅读:
    解决面试题的思路--5
    剑指offer例题分享--4
    剑指offer--3
    剑指offer--2
    【数据结构】5.2 二叉搜索树的创建查找以及插入操作
    【数据结构】5.1 顺序表的查找以及二分查找的实现
    【数据结构】4.1图的创建及DFS深度遍历(不完善)
    【密码学】RSA加密 kotlin实现方法(支持任意字节长度)
    【数据结构】3-2哈夫曼树的实现(数组实现)以及哈夫曼编码
    【密码学】公钥密码体制概述
  • 原文地址:https://www.cnblogs.com/mahuan2/p/6150548.html
Copyright © 2011-2022 走看看