保护url时效性和安全性的一种解决方案
几乎都是同事小哥哥帮我铺路,给我参考链接,实现的理论方法以及知识,我只剩下看资料,敲代码,出错了也是他帮我看着一步步解释搞定过来的。嗯,大好人一枚。
ok,思路:
是生成一个随机数放在url里面,当做参数传递,在业务请求controller那里检验这个nonce是否与缓存里的一致,并且添加一个时间戳的属性,这样可以设置一段时间内url有效,过段时间点击就出现链接失效的情况。
开始咯:
1:使用了SecureRandom生成随机数nonce
import java.security.SecureRandom;
        String nonce = null;
        SecureRandom random = null;
        try {
            random = SecureRandom.getInstance("SHA1PRNG");
            System.out.println("SecureRandom random init:" + random);
        } catch (NoSuchAlgorithmException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        byte[] values = new byte[20];
        random.nextBytes(values);
        nonce = String.valueOf(random.nextLong());
2 : 自定义一个class ,来构建一个对象,对象里面存放时间戳,nonce,openid.生成之后,把它放到一个cache里面,这个Guava Cache 存放。
假如只是简单的把Guava Cache当作HashMap或ConcurrentHashMap的替代品,不需要用到load方法,而是手动地插入,可以这样:
Java代码
public static final Cache<String, Object> cache = CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.MINUTES).build();
注意不能用LoadingCache了。 
查找: 
cache.getIfPresent("xx"); 
插入: 
cache.put("xx", "xxx");
3 : 获取缓存里面的数据去对比检验就好了
private Boolean checkTimeOut(String openid,String nonce){
        Boolean flag = false;
        if(!nonce.isEmpty()){
            StructureOfNonce v = (StructureOfNonce) MenuClickEventHandler.cache.getIfPresent(nonce);
            String cnonce = v.getNonce();
            String copenid = v.getOpenid();
            long createTimestamp = v.getTimestamp();
            if(openid.equalsIgnoreCase(copenid) && nonce.equalsIgnoreCase(cnonce)){
                Long currentTime = System.currentTimeMillis();
                int time =(int) (currentTime - createTimestamp)/1000/60 ;
                if(0 <= time && time <= 1){
                    flag = true;
                }
            }
        }
        return flag;
    }
Cheers !
好的,全是别人的经验,下面放巨人的果实吧!
详细解析cacheGuava Cache :
http://bylijinnan.iteye.com/blog/2225074
保护url时效性和安全性的一种解决方案的更多相关文章
- WebService安全性的几种实现方法【身份识别】
		转:http://blog.csdn.net/yongping8204/article/details/8619577 WebService安全性的几种实现方法[身份识别] 标签: webservi ... 
- [转]ArcGIS移动客户端离线地图的几种解决方案
		原文地址:http://blog.chinaunix.net/uid-10914615-id-3023158.html 移动GIS中,通常将数据分为两大类:basemap layer和operatio ... 
- JS控制div跳转到指定的位置的几种解决方案总结
		原文:http://www.jb51.net/article/96574.htm 这篇文章主要介绍了JS控制div跳转到指定的位置的几种解决方案总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考 ... 
- C#实现多级子目录Zip压缩解压实例  NET4.6下的UTC时间转换  [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了  asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程  asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案  .NET Core开发日志
		C#实现多级子目录Zip压缩解压实例 参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩, ... 
- PHP中实现MySQL嵌套事务的两种解决方案
		PHP中实现MySQL嵌套事务的两种解决方案 一.问题起源 在MySQL的官方文档中有明确的说明不支持嵌套事务: Transactions cannot be nested. This is a co ... 
- zepto的tap事件的点透问题的几种解决方案
		你可能碰到过在页面上创建一个弹出层,弹出层有个关闭的按钮,你点了这个按钮关闭弹出层后,这个按钮正下方的内容也会执行点击事件(或打开链接).这个被定义为这是一个“点透”现象. 以前,我也听到过tap的点 ... 
- Mybatis多参传递的四种解决方案
		Mybatis多参传递的四种解决方案 代码异常:org.apache.ibatis.binding.BindingException: Parameter 'param' not found. 长时间 ... 
- javascript文件夹选择框的两种解决方案
		javascript文件夹选择框的两种解决方案 解决方案1:调用windows 的shell,但会有安全问题. * browseFolder.js * 该文件定义了BrowseFolder()函数,它 ... 
- bugfree如何修改Bug7种解决方案的标注方法
		Bug有7种解决方案的标注方法 By Design- 就是这么设计的,无效的Bug Duplicate - 这个问题别人已经发现了,重复的Bug External - 是个外部因素(比如浏览器.操作系 ... 
随机推荐
- noj算法  素数环 回溯法
			描述: 把1到20这重新排列,使得排列后的序列A满足:a. 任意相邻两个数之和是素数b. 不存在满足条件a的序列B使得:A和B的前k(0 <= k <= 19)项相同且B的第k+1项比A的 ... 
- chromerdriver下载地址:xpath_help
			chrome下载地址 http://npm.taobao.org/mirrors/chromedriver xpath_help https://blog.csdn.net/Cayny/article ... 
- PDF怎样添加注释,PDF文件添加注释的方法
			Word文件跟纸质文件想要添加注释相信大家都知道该怎么添加,那么现在也使用频率挺高的PDF格式的文件要怎么添加注释呢?添加注释的方法有什么呢?有许多的小伙伴们都想知道吧,今天小编就来跟大家分享一下,想 ... 
- jquery 第一章
			1.本章目标 了解jquery 了解jquery和js的区别 掌握jquery的入门 掌握jquery对象和dom对象的区别2.jquery简介 jquery是一个轻量级 ... 
- 论文阅读笔记四十:Deformable ConvNets v2: More Deformable, Better Results(CVPR2018)
			论文源址:https://arxiv.org/abs/1811.11168 摘要 可变形卷积的一个亮点是对于不同几何变化的物体具有适应性.但也存在一些问题,虽然相比传统的卷积网络,其神经网络的空间形状 ... 
- HTML目录:
			HTML常用标签 CSS样式 
- spring boot slf4j日记记录配置详解
			https://blog.csdn.net/liuweixiao520/article/details/78900779 
- 到底什么时候该使用MQ?
			一.缘起 一切脱离业务的架构设计与新技术引入都是耍流氓. 引入一个技术之前,首先应该解答的问题是,这个技术解决什么问题. 就像微服务分层架构之前,应该首先回答,为什么要引入微服务,微服务究竟解决什么问 ... 
- C3_note
- 在'for'循环中获取索引
			ints = [8, 23, 45, 12, 78] 当使用循环遍历它时,在这种情况下如何访问循环索引,从1到5? 最普遍的办法是设置索引变量(通常在C或PHP等语言中使用),但这被认为是非pytho ... 
