精华内容
下载资源
问答
  • 【实例简介】shiro+redis 实现登录控制及密码重试次数超过5次后账号锁定一分钟不能登录【实例截图】【核心代码】SSM-Shiro└── SSM-Shiro├── logs│ └── loginfo.log├── pom.xml├── src│ └── main...

    【实例简介】

    shiro+redis 实现登录控制及密码重试次数超过5次后账号锁定一分钟不能登录

    【实例截图】

    【核心代码】

    SSM-Shiro

    └── SSM-Shiro

    ├── logs

    │   └── loginfo.log

    ├── pom.xml

    ├── src

    │   └── main

    │   ├── java

    │   │   └── cn

    │   │   └── com

    │   │   ├── Controller

    │   │   │   └── ShiroAction.java

    │   │   ├── Dao

    │   │   │   └── UserDao.java

    │   │   ├── Model

    │   │   │   └── User.java

    │   │   ├── Service

    │   │   │   ├── RedisSaveManagerServiceImpl.java

    │   │   │   ├── RedisSaveManageService.java

    │   │   │   ├── UserServiceImpl.java

    │   │   │   └── UserService.java

    │   │   └── shiro

    │   │   ├── AbstractBaseRedisDao.java

    │   │   ├── CustomRealm.java

    │   │   ├── RetryLimitCredentialsMatcher.java

    │   │   └── SystemLogoutFilter.java

    │   ├── resources

    │   │   ├── jdbc.properties

    │   │   ├── log4j.xml

    │   │   ├── mapper

    │   │   │   └── userMapper.xml

    │   │   ├── redis.properties

    │   │   └── spring

    │   │   ├── applicationContext.xml

    │   │   ├── springMVC.xml

    │   │   └── spring-shiro.xml

    │   └── webapp

    │   ├── assets

    │   │   ├── jquery-3.2.1.js

    │   │   └── jquery-3.2.1.min.js

    │   ├── index.jsp

    │   └── WEB-INF

    │   ├── views

    │   │   ├── error404.jsp

    │   │   ├── error500.jsp

    │   │   ├── error.jsp

    │   │   ├── login.jsp

    │   │   └── welcome.jsp

    │   └── web.xml

    ├── SSM-Shiro.iml

    └── target

    ├── classes

    │   ├── cn

    │   │   └── com

    │   │   ├── Controller

    │   │   │   └── ShiroAction.class

    │   │   ├── Dao

    │   │   │   └── UserDao.class

    │   │   ├── Model

    │   │   │   └── User.class

    │   │   ├── Service

    │   │   │   ├── RedisSaveManagerServiceImpl.class

    │   │   │   ├── RedisSaveManageService.class

    │   │   │   ├── UserService.class

    │   │   │   └── UserServiceImpl.class

    │   │   └── shiro

    │   │   ├── AbstractBaseRedisDao.class

    │   │   ├── CustomRealm.class

    │   │   ├── RetryLimitCredentialsMatcher.class

    │   │   └── SystemLogoutFilter.class

    │   ├── jdbc.properties

    │   ├── log4j.xml

    │   ├── mapper

    │   │   └── userMapper.xml

    │   ├── redis.properties

    │   └── spring

    │   ├── applicationContext.xml

    │   ├── springMVC.xml

    │   └── spring-shiro.xml

    └── Shiro

    ├── assets

    │   ├── jquery-3.2.1.js

    │   └── jquery-3.2.1.min.js

    ├── index.jsp

    ├── META-INF

    │   └── MANIFEST.MF

    └── WEB-INF

    ├── classes

    │   ├── cn

    │   │   └── com

    │   │   ├── Controller

    │   │   │   └── ShiroAction.class

    │   │   ├── Dao

    │   │   │   └── UserDao.class

    │   │   ├── Model

    │   │   │   └── User.class

    │   │   ├── Service

    │   │   │   ├── RedisSaveManagerServiceImpl.class

    │   │   │   ├── RedisSaveManageService.class

    │   │   │   ├── UserService.class

    │   │   │   └── UserServiceImpl.class

    │   │   └── shiro

    │   │   ├── AbstractBaseRedisDao.class

    │   │   ├── CustomRealm.class

    │   │   ├── RetryLimitCredentialsMatcher.class

    │   │   └── SystemLogoutFilter.class

    │   ├── jdbc.properties

    │   ├── log4j.xml

    │   ├── mapper

    │   │   └── userMapper.xml

    │   ├── redis.properties

    │   └── spring

    │   ├── applicationContext.xml

    │   ├── springMVC.xml

    │   └── spring-shiro.xml

    ├── lib

    │   ├── aopalliance-1.0.jar

    │   ├── aspectjweaver-1.7.4.jar

    │   ├── commons-beanutils-1.8.3.jar

    │   ├── commons-dbcp-1.4.jar

    │   ├── commons-io-2.2.jar

    │   ├── commons-lang-2.4.jar

    │   ├── commons-logging-1.1.1.jar

    │   ├── commons-pool-1.5.4.jar

    │   ├── commons-pool2-2.4.2.jar

    │   ├── dom4j-1.6.1.jar

    │   ├── ehcache-core-2.0.0.jar

    │   ├── fastjson-1.2.12.jar

    │   ├── jcl-over-slf4j-1.7.19.jar

    │   ├── jedis-2.8.0.jar

    │   ├── jstl-1.2.jar

    │   ├── log4j-1.2.17.jar

    │   ├── mybatis-3.2.1.jar

    │   ├── mybatis-ehcache-1.0.0.jar

    │   ├── mybatis-spring-1.2.0.jar

    │   ├── mysql-connector-java-5.1.34.jar

    │   ├── shiro-core-1.2.1.jar

    │   ├── shiro-spring-1.2.1.jar

    │   ├── shiro-web-1.2.1.jar

    │   ├── slf4j-api-1.7.21.jar

    │   ├── slf4j-log4j12-1.7.12.jar

    │   ├── spring-aop-4.0.3.RELEASE.jar

    │   ├── spring-aspects-4.0.3.RELEASE.jar

    │   ├── spring-beans-4.0.3.RELEASE.jar

    │   ├── spring-context-4.0.3.RELEASE.jar

    │   ├── spring-context-support-4.0.3.RELEASE.jar

    │   ├── spring-core-4.0.3.RELEASE.jar

    │   ├── spring-data-commons-1.12.1.RELEASE.jar

    │   ├── spring-data-keyvalue-1.1.1.RELEASE.jar

    │   ├── spring-data-redis-1.7.1.RELEASE.jar

    │   ├── spring-expression-4.0.3.RELEASE.jar

    │   ├── spring-jdbc-4.0.3.RELEASE.jar

    │   ├── spring-jms-4.0.3.RELEASE.jar

    │   ├── spring-orm-4.0.3.RELEASE.jar

    │   ├── spring-oxm-4.2.5.RELEASE.jar

    │   ├── spring-tx-4.0.3.RELEASE.jar

    │   ├── spring-web-4.0.3.RELEASE.jar

    │   ├── spring-webmvc-4.0.3.RELEASE.jar

    │   ├── standard-1.1.2.jar

    │   └── xml-apis-1.0.b2.jar

    ├── views

    │   ├── error404.jsp

    │   ├── error500.jsp

    │   ├── error.jsp

    │   ├── login.jsp

    │   └── welcome.jsp

    └── web.xml

    46 directories, 120 files

    展开全文
  • Java 实现间隔重试(一)

    千次阅读 2018-05-31 14:37:07
    实现类似于支付宝或微信在回调第三方接口时,出错间隔重试的功能。例如:25小时以内完成8次通知(通知的间隔频率一般是:4m,10m,10m,1h,2h,6h,15h);思前想后提出了一下几个方案:1.推送信息记录到表中,定时器触发...

    实现类似于支付宝或微信在回调第三方接口时,出错间隔重试的功能。

    例如:25小时以内完成8次通知(通知的间隔频率一般是:4m,10m,10m,1h,2h,6h,15h);

    思前想后提出了一下几个方案:

    1.推送信息记录到表中,定时器触发重推推送失败的数据

        优点:实现简单

        缺点:实现不了单条数据间隔重推,批量推送服务器IO在短时间内压力大

    2.使用多线程,将推送失败的数据放入queue中,线程轮询判断触发重推

        难以实现。

    3.使用redis和mq,将推送失败的数据放入redis中,设置超时时间,监听redis key超时事件触发重推

        优点:能够实现单条数据间隔重推,分担服务器推送压力

        缺点:需要搭建redis,并开发事件监听

    4.采用rocketmq,消息推送

    展开全文
  • 限制网站访客访问频率,超过限制24小时后重试 redis中键的生存时间(expire) package cn.redis.demo; import static org.junit.Assert.*; import java.util.List; import org.apache.commons.pool2.impl....

    限制网站访客访问频率,超过限制24小时后重试

    redis中键的生存时间(expire)

    package cn.redis.demo;
    import static org.junit.Assert.*;
    import java.util.List;
    import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
    import org.junit.Test;
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisPool;
    import redis.clients.jedis.JedisPoolConfig;
    import redis.clients.jedis.Transaction;
    
    public class RedisDemo {
        String ip = "127.0.0.1";
        int port = 6379;
        Jedis jedis = new Jedis(ip, port);
        /**
         * 仅供测试使用,单机无连接池方式
         * @throws Exception
         */
        @Test
        public void test1() throws Exception {
            //获取到redis服务器的链接
            jedis.set("guoxiaocha", "guoxiaocha");
            String value = jedis.get("guoxiaocha");
            System.out.println(value);// guoxiaocha
        }
        
        /**
         * 单机连接池方式
         * @throws Exception
         */
        @Test
        public void test2() throws Exception {
            
            JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
            //指定连接池中最大空闲连接数
            jedisPoolConfig.setMaxIdle(10);
            //链接池中创建的最大连接数
            jedisPoolConfig.setMaxTotal(100);
            //设置创建链接的超时时间
            jedisPoolConfig.setMaxWaitMillis(2000);
            //表示连接池在创建链接的时候会先测试一下链接是否可用,这样可以保证连接池中的链接都可用的。
            jedisPoolConfig.setTestOnBorrow(true);
            
            //创建一个jedis连接池
            JedisPool jedisPool = new JedisPool(jedisPoolConfig, ip, port);
            //从连接池中获取一个链接
            Jedis jedis = jedisPool.getResource();
            String value = jedis.get("guoxiaocha");
            System.out.println(value);
            
            //把连接返回给连接池
            jedisPool.returnResource(jedis);
        }
        
        /**
         * 限制网站访客的访问频率
         * 一分钟之内最多访问10次
         */
        @Test
        public void test3() throws Exception {
            String ip = "192.168.0.1";
            for(int i=1;i<20;i++){
                boolean flag = testLogin(ip);
                if(flag){
                    System.out.println("正常访问"+i);
                }else{
                    System.out.println("访问频繁,24小时后重试");
                }
            }
        }
        
        //根据用户的ip校验用户是否可以继续访问
        private boolean testLogin(String ip) {
        	if(null!=jedis.get("date")){
                logger.info("所需锁定还剩: "+jedis.ttl("date")+"秒");
                return false;
            }else{
    	        String value = jedis.get(ip);
    	        if(value==null){
    	            jedis.incr(ip);
    	            //设置ip的生存时间
    	            jedis.expire(ip, 60);
    	        }else{
    	            int parseInt = Integer.parseInt(value);
    	            if(parseInt>=10){
    	            	jedis.incr("date");
                        jedis.expire("date", 60*60*24);
    	                return false;
    	            }
    	            jedis.incr(ip);
    	        }
    	        return true;
    	    }
    	}
    }
    
    展开全文
  • guava-retrying:是一个线程安全的 Java 重试类库,提供了一种通用方法去处理任意需要重试的代码,可以方便灵活地控制重试次数、重试时机、重试频率、停止时机等,并具有异常处理功能。 在本场 Chat 中,将会涉及...
  • 重试就是一种非常普通的容错机制,在出现问题的时候,以一定的频率、一定的次数重试几次,可提高系统的容错能力。 本文就用JDK8的函数式接口来实现一个非常简单的重试框架。 代码实现 MyRetry.java: ...

    用JDK8的函数式接口实现简单的重试机制

     

    重试机制的使用场景

    在任何系统中,任何组件都有一定的概率出错,在代码中就不得不考虑应对这些出错场景,提高代码的健壮性和业务的稳定性。而重试就是一种非常普通的容错机制,在出现问题的时候,以一定的频率、一定的次数重试几次,可提高系统的容错能力。

    本文就用JDK8的函数式接口来实现一个非常简单的重试框架。

    代码实现

    • MyRetry.java:
    package com.function.functionalinterface;
    
    import java.util.concurrent.TimeUnit;
    
    /**
     * 重试函数式接口
     *
     */
    @FunctionalInterface
    public interface MyRetry {
        /**
         * 执行某种操作的函数结构定义,没有入参,返回值为布尔类型
         * @return
         */
        boolean action();
    
        /**
         * 最大重试次数5次
         */
        public static final int MAX_RETRY_COUNT_5 = 5;
    
        /**
         * 重试间隔时间3秒
         */
        public static final int INTERVAL_SECONDS_3 = 3;
    
        /**
         * 实现重试
         * 
         * @param maxRetryCount
         *            最大重试次数
         * @param workFunction
         *            每次重试所执行的工作函数
         * @param intervalFunctin
         *            重试间隔期间执行的函数,比如sleep一段时间
         */
        public static void retry(int maxRetryCount, MyRetry workFunction,
                MyRetry intervalFunctin) {
            // 如果最大重试次数小于1,或重试工作函数为空,直接返回
            if (maxRetryCount < 1 || null == workFunction) {
                return;
            }
    
            // 执行最大重试次数次重试操作
            for (int i = 0; i < maxRetryCount; i++) {
                // 如果本次的执行结果为成功,则不再继续重试
                if (workFunction.action()) {
                    return;
                }
    
                // 如果本次的执行结果为失败,则执行重试间隔函数之后继续重试执行工作函数
                intervalFunctin.action();
            }
    
            System.out.println("have tried maxRetryCount!");
        }
    
        /**
         * 让当前线程睡眠指定秒数
         * 
         * @param seconds
         * @return
         */
        public static boolean doSleep(int seconds) {
            try {
                TimeUnit.SECONDS.sleep(seconds);
                return true;
            } catch (InterruptedException e) {
                System.out.println("exception occurs when doSleep, e = " + e);
                return false;
            }
        }
    }
    
    
    • MyRetryTest.java:
    package com.function.functionalinterface;
    
    /**
     * 测试重试函数式接口
     *
     */
    public class MyRetryTest {
    
        public static void main(String[] args) {
            // 工作函数入参
            boolean param = true;
            MyRetry.retry(MyRetry.MAX_RETRY_COUNT_5, () -> doWork(param),
                    () -> MyRetry.doSleep(MyRetry.INTERVAL_SECONDS_3));
        }
    
        /**
         * 工作函数
         * 
         * @param param
         *            一个布尔类型的入参
         * @return
         */
        public static boolean doWork(boolean param) {
            System.out.println("start to do some work...");
    
            // 为简单期间,将入参param的值取反,模拟工作函数的执行结果
            boolean result = !param;
            if (result) {
                System.out.println("doWork success!");
            } else {
                System.out.println("doWork failed!");
            }
    
            return result;
        }
    
    }
    
    
    • 运行MyRetryTest.java,输出结果如下:
    start to do some work...
    doWork failed!
    start to do some work...
    doWork failed!
    start to do some work...
    doWork failed!
    start to do some work...
    doWork failed!
    start to do some work...
    doWork failed!
    have tried maxRetryCount!
    

    可见上述代码每隔3秒重试一次,一共重试了5次。

    展开全文
  • java源码包---java 源码 大量 实例

    千次下载 热门讨论 2013-04-18 23:15:26
     用JAVA编写了一个小工具,用于检测当前显示器也就是显卡的显示模式,比如分辨率,色彩以及刷新频率等。 Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字  Java波浪文字,一个利用...
  • java源码包2

    千次下载 热门讨论 2013-04-20 11:28:17
     用JAVA编写了一个小工具,用于检测当前显示器也就是显卡的显示模式,比如分辨率,色彩以及刷新频率等。 Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字  Java波浪文字,一个利用...
  • 另外,重试的次数一般设为 3 次,再多次的重试没有好处,反而会加重服务器压力(部分场景使用失败重试机制会不太适合)。 大型网站架构 8 张图读懂大型网站技术架构 关于大型网站系统架构你不得不懂的 10 个问题 ...
  • 另外,重试的次数一般设为 3 次,再多次的重试没有好处,反而会加重服务器压力(部分场景使用失败重试机制会不太适合)。 大型网站架构 8 张图读懂大型网站技术架构 关于大型网站系统架构你不得不懂的 10 个问题 ...
  • java源码包3

    千次下载 热门讨论 2013-04-20 11:30:13
     用JAVA编写了一个小工具,用于检测当前显示器也就是显卡的显示模式,比如分辨率,色彩以及刷新频率等。 Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字  Java波浪文字,一个利用...
  • effective-java-3rd-chinese:Effective Java 中文版(第 3 版),Java 四大名著之一,本书一共包含 90 个条目,每个条目讨论 Java 程序设计中的一条规则。这些规则反映了最有经验的优秀程序员在实践中常用的一些...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     用JAVA编写了一个小工具,用于检测当前显示器也就是显卡的显示模式,比如分辨率,色彩以及刷新频率等。 Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字  Java波浪文字,一个利用...
  • Java编写的显示器显示模式检测程序 2个目标文件 内容索引:JAVA源码,系统相关,系统信息检测 用JAVA编写了一个小工具,用于检测当前显示器也就是显卡的显示模式,比如分辨率,色彩以及刷新频率等。 Java波浪文字制作...
  • Java编写的显示器显示模式检测程序 2个目标文件 内容索引:JAVA源码,系统相关,系统信息检测 用JAVA编写了一个小工具,用于检测当前显示器也就是显卡的显示模式,比如分辨率,色彩以及刷新频率等。 Java波浪文字制作...
  • Java编写的显示器显示模式检测程序 2个目标文件 内容索引:JAVA源码,系统相关,系统信息检测 用JAVA编写了一个小工具,用于检测当前显示器也就是显卡的显示模式,比如分辨率,色彩以及刷新频率等。 Java波浪文字制作...
  • 前端多次调用(伪幂等性问题) 1.一般情况 前端控制消息调用频率,禁用请求 2.网络不好,第一次调用响应...rpc的默认重试机制会导致调用方在规定超时时间和次数内反复调用被调用方 1.禁用重试(不合理) 2.加大
  • 重试还是直接往上层抛异常等,以及代码在高并发下会如何表现等等。 我的建议是多多阅读优秀的代码,多思考他们是如何处理各种case的,包括日志、异常的处理等等,多学习、多踩坑才能更快...
  • 另外,重试的次数一般设为 3 次,再多次的重试没有好处,反而会加重服务器压力(部分场景使用失败重试机制会不太适合)。 大型网站架构 8 张图读懂大型网站技术架构 关于大型网站系统架构你不得不懂的 10 个问题 ...
  • HTML?身为师计信人逢年过节总免不了被亲戚们“盘问”一番必问清单第一名就是“专业”他们往往从字面去理解而我们计信人被误解的频率相当高“学计算机的肯定会修电脑对吧”请接着看下去吧!我们学的到底是什么?...
  • HTML?身为师计信人逢年过节总免不了被亲戚们“盘问”一番必问清单第一名就是“专业”他们往往从字面去理解而我们计信人被误解的频率相当高“学计算机的肯定会修电脑对吧”请接着看下去吧!我们学的到底是什么?...
  • 如果希望流程引擎有节点失败重试,定时等功能,那么要使用核心模块 + 持久化模块 + 调度模块 如果希望任务审批,多人审批的能力,那么要使用核心模块 + 持久化模块 + 任务模块 ,至于要不要调度模块都可以 其中,...
  • TCP丢包时会全部传从丢的那个包开始以后的数据,KCP是选择性传,只传真正丢失的数据包。 快速传: 发送端发送了1,2,3,4,5几个包,然后收到远端的ACK: 1, 3, 4, 5,当收到ACK3时,KCP知道2被跳过1次,收到...
  • 5.6 载波频率和多路复用 23 5.7 基带和宽带技术 24 5.8 波分多路复用 24 5.9 分布频谱 25 5.10 时分多路复用 25 5.11 小结 25 练习 26 第6章 包、帧与差错检测 27 6.1 概述 27 6.2 包的概念 27 6.3 包和时分多路复用...
  • 与开发人员在测试组环境多次重复以上步骤,发现11群的计次表话单有时正常,有时其出中继群号就为一个随机值,发生异常的频率比较高。为什么其它群的话单正常,唯独11群不正常呢?11群是四个群中最小的群,其中继计...
  • 4. 对于断线连 不多说。 def multi_session(session, *arg): retryTimes = 20 while retryTimes>0: try: return session.post(*arg) except: print '.', retryTimes -= 1 或者 def multi_open(opener, ...
  • {"name": "Java", data: [1, 2, 1, 1, 12, '-', 0]}, {"name": "C", data: [2, 1, 2, 2, 1, 1, 1]}, {"name": "C++", data: [3, 4, 3, 3, 2, 2, 3]}, ... ].map(item => { return $.extend(true, {}, seri_...
  • 4.4.9 JVM内存模型的相关知识了解多少,比如排序,内存屏障,happen-before,主内存,工作内存等。 4.5.0 简单说说你了解的类加载器,可以打破双亲委派么,怎么打破。 4.5.1 讲讲JAVA的反射机制。 4.5.2 你们...

空空如也

空空如也

1 2
收藏数 32
精华内容 12
关键字:

频率重试java

java 订阅