精华内容
下载资源
问答
  • 要知道,如今很多平台的接口都是可以同时被门户网站,手机端,移动浏览器访问,因为接口是通用的,而为了安全起见,有些接口都会设置一个门槛,那就是限制访问次数,也就是在某一时间段内不能过多的访问,比如登录...

    要知道,如今很多平台的接口都是可以同时被门户网站,手机端,移动浏览器访问,因为接口是通用的,而为了安全起见,有些接口都会设置一个门槛,那就是限制访问次数,也就是在某一时间段内不能过多的访问,比如登录次数限制,在一些金融理财或者银行的接口上比较常见,另外一些与用户信息有关的接口都会有一个限制门槛

    那么这个限制门槛怎么来做呢,其实有很多种方法,主流的做法可以用拦截器或者注解,那么今天咱们用注解来实现

    首先需要定义一个注解,如下:

    /**
     * 
     * @Title: LimitIPRequest.java
     * @Package com.agood.bejavagod.component
     * @Description: 限制某个IP在某个时间段内请求某个方法的次数
     * Copyright: Copyright (c) 2016
     * Company:Nathan.Lee.Salvatore
     * 
     * @author leechenxiang
     * @date 2016年12月14日 下午8:16:49
     * @version V1.0
     */
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    @Documented
    @Order(Ordered.HIGHEST_PRECEDENCE)        // 设置顺序为最高优先级
    public @interface LimitIPRequest {
        
        /**
         * 
         * @Description: 限制某时间段内可以访问的次数,默认设置100
         * @return
         * 
         * @author leechenxiang
         * @date 2016年12月14日 下午8:22:29
         */
        int limitCounts() default 100;
    
        /**
         * 
         * @Description: 限制访问的某一个时间段,单位为秒,默认值1分钟即可
         * @return
         * 
         * @author leechenxiang
         * @date 2016年12月14日 下午8:21:59
         */
        int timeSecond() default 60;
        
    }

    然后再使用spring aop,拦截被你注解的那个controller的方法

    @Aspect
    @Component
    public class LimitIPRequestDisplay {
    
        @Autowired
        private JedisClient jedis;
        
        @Pointcut("execution(* com.agood.bejavagod.controller.*.*(..)) && @annotation(com.agood.bejavagod.component.LimitIPRequest)")
        public void before(){
        }
    
        @Before("before()")
        public void requestLimit(JoinPoint joinPoint) throws LimitIPRequestException {
            try {
                // 获取HttpRequest
                ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
                HttpServletRequest request = attributes.getRequest();
                HttpServletResponse response = attributes.getResponse();
                
                // 判断request不能为空
                if (request == null) {
                    throw new LimitIPRequestException("HttpServletRequest有误...");
                }
                
                LimitIPRequest limit = this.getAnnotation(joinPoint);
                if(limit == null) {  
                    return;  
                }  
                
                String ip = request.getRemoteAddr();
                String uri = request.getRequestURI().toString();
                String redisKey = "limit-ip-request:" + uri + ":" + ip;
                // 设置在redis中的缓存,累加1
                long count = jedis.incr(redisKey);
                
                // 如果该key不存在,则从0开始计算,并且当count为1的时候,设置过期时间
                if (count == 1) {
                    jedis.expire(redisKey, limit.timeSecond());
    //                redisTemplate.expire(redisKey, limit.time(), TimeUnit.MILLISECONDS);
                }
                
                // 如果redis中的count大于限制的次数,则报错
                if (count > limit.limitCounts()) {
                    // logger.info("用户IP[" + ip + "]访问地址[" + url + "]超过了限定的次数[" + limit.count() + "]");
                    if (ShiroFilterUtils.isAjax(request)) {
                        HttpServletResponse httpServletResponse = WebUtils.toHttp(response);  
                        httpServletResponse.sendError(ShiroFilterUtils.HTTP_STATUS_LIMIT_IP_REQUEST);
                    } else {
                        throw new LimitIPRequestException();
                    }
                }
            } catch (LimitIPRequestException e) {
                throw e;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        /**
         * 
         * @Description: 获得注解
         * @param joinPoint
         * @return
         * @throws Exception
         * 
         * @author leechenxiang
         * @date 2016年12月14日 下午9:55:32
         */
        private LimitIPRequest getAnnotation(JoinPoint joinPoint) throws Exception {  
            Signature signature = joinPoint.getSignature();  
            MethodSignature methodSignature = (MethodSignature) signature;  
            Method method = methodSignature.getMethod();  
      
            if (method != null) {  
                return method.getAnnotation(LimitIPRequest.class);  
            }  
            return null;  
        }  
    }

    这个类使用了redis缓存作为计数器,因为好用,当然你用静态的map也行,但是考虑的分布式集群的话一般还是建议使用redis比较好。

    大致的流程就是要获取redis中的调用方法次数,使用incr函数,当key不存在的时候默认为0然后累加1,当累加1大于limit设置的限制次数时,则抛出异常,这个地方需要注意,如果是ajax调用的话需要判断是否ajax,然后再返回错误信息

    查看redis中key的剩余时间:

    好,那么按照如上方法就能实现对接口访问次数的限制

    展开全文
  • 出版社: 北京科海电子出版社书号: 9787894878144发行时间: 2009年12月01日 地区: 大陆 语言: 简体中文 简介: 内容简介: 《Excel 2007文秘与行政实战应用宝典》针对文秘与行政管理所需求的各种信息录入、数据...
  • C#编程经验技巧宝典

    热门讨论 2008-06-01 08:59:33
    4 <br>0008 为程序设置版本和帮助信息 4 <br>0009 设置Windows应用程序启动窗体 5 <br>0010 设置Web应用程序起始页 5 <br>0011 如何设置程序的出错窗口 5 <br>0012 如何进行程序调试 6 ...
  • 滑动以设置日期和时间并创建-inspo链接 Max建议的创建步骤 以ps方式制作东西-限制您如何制作东西 构建界面的make and save部分 查看全部并保存的能力 剪贴簿 使用直接的图像处理(平移,缩放和旋转),设计一个基于...
  • 21.1.3 用手机短信通知工作流待办事宜 357 21.1.4 用手机短信查询系统数据 358 21.1.5 根据表单内容发送短信 363 21.1.6 短信填报 366 21.2 表单自动生成 370 21.3 利用电子邮件 372 21.3.1 设置邮件服务器配置选项 ...
  • 免费个人博客系统(兼多用户博客系统)是支持一个空间2个网站的全能型网站管理系统,本免费个人博客系统通用和拓展性强,博客、文章系统、商城、企业网站、个性化论坛等类型网站都可以使用,将来网站无论如何转型或...
  • 本免费个人博客系统通用和拓展性强,博客、文章系统、商城、企业网站、个性化论坛等类型网站都可以使用,将来网站无论如何转型或拓展,只需要修改模板就可以实现,无需重建网站。本系统不同于以往任何逻辑架构的网站...
  • Android 上百实例源码分析以及开源分析 集合打包4

    千次下载 热门讨论 2012-07-10 21:54:03
    一款Android飞行模式自动切换工具,可以根据设定的时间自动进入和退出飞行模式,在无需关机的情况下让手机更加省电,减少睡眠时间手机的辐射作用。 支持功能 1.快速进入和快速退出飞行模式 2.自定义添加,删除,启用...
  • 能够设置学生回答问题前的思考时间。 能够设置学生回答问题的时间限制。 能够将回答正确的学生从下一轮中排除。 能够将回答不正确的学生从下一轮中排除。 可选择同学间互评。 能够对整个小组或学生个人给分。 可选择...
  • 实例272 和服务器时间同步 350 实例273 取得网络中的SQL服务器名 351 8.5 数据库维护 352 实例274 数据库登录配置 352 实例275 SQL Server数据库的备份和恢复 353 实实276 数据库附加、分离 355 实例277...
  • iPhone开发秘籍(第2版)--源代码

    热门讨论 2012-12-11 13:51:22
    此外,还结合实例讲解了如何开发各种iphone特性,包括视图、视图控制器、警告、表格、媒体、控件、人物、位置和事件。  《iphone开发秘籍(第2版)》适合iphone和mac开发人员。 作译者 作者:(美国)萨丹(Erica ...
  • 能够设置学生回答问题前的思考时间。 能够设置学生回答问题的时间限制。 能够将回答正确的学生从下一轮中排除。 能够将回答不正确的学生从下一轮中排除。 可选择同学间互评。 能够对整个小组或学生个人给分。 可选择...
  • 实例066 如何确定程序的运行时间 实例067 使用ParseExact方法将字符串转化为日期格式 实例068 使用ToString方法格式化日期 实例069 使用ToDateTime方法转换日期显示格式 3.5 常用数字验证技巧 实例070 使用...
  • 实例066 如何确定程序的运行时间 实例067 使用ParseExact方法将字符串转化为日期格式 实例068 使用ToString方法格式化日期 实例069 使用ToDateTime方法转换日期显示格式 3.5 常用数字验证技巧 实例070 使用...
  • 实例066 如何确定程序的运行时间 实例067 使用ParseExact方法将字符串转化为日期格式 实例068 使用ToString方法格式化日期 实例069 使用ToDateTime方法转换日期显示格式 3.5 常用数字验证技巧 实例070 使用...
  •  实例066 如何确定程序的运行时间 82  实例067 使用ParseExact方法将字符串转化为日期格式 84  实例068 使用ToString方法格式化日期 85  实例069 使用ToDateTime方法转换日期显示格式 86 3.5 常用数字验证...
  • 实例212 验证手机号码是否正确 实例213 验证字符串是否为汉字 实例214 验证身份证号码是否有效 实例215 验证车牌号码是否有效 实例216 验证网站地址是否有效 实例217 验证数量和金额 实例218 验证字符串是否...
  • 实例047 如何为MDI类型窗体设置背景图片 48 实例048 向提示框中添加图标 49 第2章 控件应用 51 2.1 TextBox控件应用 52 实例049 只允许输入数字的TextBox控件 52 实例050 限制用户名称长度及设置密码文本...
  • 程序开发范例宝典>>

    2012-10-24 10:41:28
    实例248 设置系统时间 342 实例249 设置屏幕分辨率 343 7.6 系统监控 344 实例250 检测系统启动模式 344 实例251 内存使用状态监控 345 实例252 键盘钩子屏蔽热键 346 实例253 CPU使用率 348 ...
  • 16.1.1 如何使用传感器 405 16.1.2 加速度传感器(Accelerometer) 409 16.1.3 重力传感器(Gravity) 409 16.1.4 光线传感器(Light) 410 16.1.5 陀螺仪传感器(Gyroscope) 411 16.1.6 方向传感器(Orientation...
  • 此时arrayKeys,itemkey将不再次生效,如何渲染,渲染什么,将由你自己决定,下方是一个例子 <template v-slot:block="{data, getPositonOffset, getWidthAbout2Times, isInRenderingTimeRange, ...
  • 实例116 设置用户在线时间 184 4.5 Cookie对象:缓存对象 185 实例117 利用Cookie实现密码记忆功能 185 实例118 统计IP地址登录次数 187 实例119 利用Cookie对象防止重复投票 189 实例120 每月只能投票一次 192 4.6 ...
  • 实例116 设置用户在线时间 184 4.5 Cookie对象:缓存对象 185 实例117 利用Cookie实现密码记忆功能 185 实例118 统计IP地址登录次数 187 实例119 利用Cookie对象防止重复投票 189 实例120 每月只能投票一次 192 4.6 ...
  • 实例116 设置用户在线时间 184 4.5 Cookie对象:缓存对象 185 实例117 利用Cookie实现密码记忆功能 185 实例118 统计IP地址登录次数 187 实例119 利用Cookie对象防止重复投票 189 实例120 每月只能投票一次 192 4.6 ...
  • 全面覆盖实用和热点技术,涉及面广,实用性强源于实际项目开发,帮助读者短时间掌握更多实用技术,提高编程水平范例经过精心编排,重点、难点突出,易学易懂书后附录提供快速索引,即查、即学、即。 第1章 窗体...
  • 实例054 手动设置系统日期时间 69 实例055 根据生日自动计算员工年龄 70 实例056 根据年份判断十二生肖 71 实例057 获取当前日期是星期几 72 实例058 获取当前年的天数 73 实例059 获取当前月的天数 74 实例060 取得...
  • 实例248 设置系统时间 342 实例249 设置屏幕分辨率 343 7.6 系统监控 344 实例250 检测系统启动模式 344 实例251 内存使用状态监控 345 实例252 键盘钩子屏蔽热键 346 实例253 CPU使用率 348 7.7 ...
  • 16.1.1 如何使用传感器 405 16.1.2 加速度传感器(Accelerometer) 409 16.1.3 重力传感器(Gravity) 409 16.1.4 光线传感器(Light) 410 16.1.5 陀螺仪传感器(Gyroscope) 411 16.1.6 方向传感器(Orientation...
  • 实例248 设置系统时间 342 实例249 设置屏幕分辨率 343 7.6 系统监控 344 实例250 检测系统启动模式 344 实例251 内存使用状态监控 345 实例252 键盘钩子屏蔽热键 346 实例253 CPU使用率 348 7.7 ...

空空如也

空空如也

1 2 3 4 5
收藏数 82
精华内容 32
关键字:

如何设置手机限用时间