暴露在外的服务
2016-06-16 09:21
363 查看
怎样让Web项目暴露在外的服务坚不可摧?
阅读目录1. 具体业务流程
2. 访问服务安全性保障初实践
3. 访问服务即时性保障初实践
Web 项目一般给特定人群使用,有些是局域网用户量不足1K的内部系统,也有些广域网用户上万的中型项目,当然还有用户上亿的大型项目。
这些大大小小的 Web 项目都会有用户登录的存在,登录后有特定的权限,访问特定的资源。
未登录的用户无法访问系统资源,这块功能通常都是有 Filter 来进行的。
在 Filter 中进行自由服务的配置,可以使用户在不登陆的情况下也能对特定资源进行访问。
Filter 可以采用开源的第三方权限管理,比如 Shiro,Spring Security.......
小型项目中继承 javax.servlet.Filter 接口简单实现也是可行的方案。
最近项目中遇到一些服务需要用户在未登录的情况下,在其他移动设备上面进行操作。
怎样保证暴露在外的服务坚不可摧呢?
本篇借自己一次相似需求的实现,来分享在实践中遇到的问题和解决思路,仅当作抛砖引玉之用,文中如有什么不妥,还望看客老爷拍砖。
回到顶部
1. 具体业务流程
View Code回到顶部
3. 访问服务即时性保障初实践
如上述描述的,仅单纯的保证了链接的安全性,还不能满足当前项目要求。还需要将每次生成的访问链接,只能在有限的时间段内提供服务,避免其他人截获该连接,在任何时间对该用户的资源进行操作。
具体序列图:
追加系统当前时间戳参数:
public static String encrypt(String parm1, String pam2) { String resStr = null; try { EncryptionDecryption des = new EncryptionDecryption("定义的公钥"); if (StringUtil.isNotEmpty(parm1) && StringUtil.isNotEmpty(pam2)) { resStr = des.encrypt(parm1 + "," + pam2 + "," + DateFormatUtils.format(new Date(),"yyyyMMddHHmm")); } } catch (Exception e) { e.printStackTrace(); } return resStr; }
在项目中最小粒度判断到分钟既可以,当然你也可以根据具体需求将时间戳粒度调整到秒或者毫秒级别。
约定公钥解密,进行过期验证:
private Boolean hasInvalidRequest(String param) { EncryptionDecryption encryptionDecryption = new EncryptionDecryption("定义的公钥"); String requestDate = encryptionDecryption.decrypt(param).split(",")[5]; if (requestDate.length() != 12) { return Boolean.TRUE; } Date nowDate = new Date(); int nowTime_yyyyMMdd = Integer.parseInt(DateFormatUtils.format(nowDate, "yyyyMMdd")); int requestTime_yyyyMMdd = Integer.parseInt(requestDate.substring(0, 8)); if (nowTime_yyyyMMdd > requestTime_yyyyMMdd) { return Boolean.TRUE; } int nowTime_HHmm = Integer.parseInt(DateFormatUtils.format(nowDate, "HHmm")); int requestTime_HHmm = Integer.parseInt(requestDate.substring(8)); if (nowTime_HHmm - requestTime_HHmm > Configutil.getConfig("valid_request_time")) { return Boolean.TRUE; } return Boolean.FALSE; }
判断长度,判断年月日,判断分秒,这里转为 Int 没有用Float 对比的原因,其一是不好驾驭,其二是代码不简洁。
有效的时间间隔,放到配置文件当中,因为这里是需求变动的敏感点,统一配置,代码不动,方便管理。
相关文章推荐
- 取接口
- guard ,defer repeat-while (throws、throw、try、do、catch)等关键字使用
- wake lock And lightedgreenroom
- 浅析过滤敏感词过滤算法(C++)
- SonarQube
- 关于HDFS数据存储路径
- 古代猪文 [Sdoi2010][Codevs 1830]
- Android软键盘遮挡问题
- php中 -> 和 => 和 :: 的用法 以及 self 和 $this 的用法
- 【IOS类扩展之日期操作】NSDate+Helpers
- JS window.requestAnimFrameS 是什么意思
- 用二进制文件处理学生成绩
- java多线程爬虫实现
- 如何利用Java遍历所有的指定文件目录下的所有文件
- SAP调用外部web service
- 第十一周项目3-警察和厨师(1)
- 每天一个Linux命令(49)traceroute命令
- iOS 制作自己的FrameWork遇到的一些问题 以及FrameWork通过包合并支持arm64 armv7 i386 架构
- 关于oracle启用实例,以及数据库重启
- 获取到剩余内存