通过JVM安全上下文实现缓存的方法和系统技术方案

技术编号:13063759 阅读:48 留言:0更新日期:2016-03-24 02:03
本发明专利技术公开了一种通过JVM安全上下文实现缓存的方法和系统,所述方法包括:当接收到用户的调用请求时,使用当前登录用户对预设对象进行实例化,得到实例;将实例注入当前调用堆栈的JVM安全上下文中;在获取访问权限函数中获取JVM安全上下文中的所述实例,并查询所述实例中是否缓存当前登录用户业务需要的数据;当查询结果为是时,从所述实例中获取当前登录用户业务需要的数据;当查询结果为否时,从第三方系统获取当前登录用户业务需要的数据,并将当前登录用户业务需要的数据缓存在所述实例中;当根据当前登录用户业务需要的数据完成用户的调用请求对应的业务时,结束当前调用堆栈。本发明专利技术保证功能的同时而不损失设计的高内聚、低耦合。

【技术实现步骤摘要】

本专利技术涉及计算机
,特别是涉及一种通过JVM安全上下文实现缓存的方 法和系统。
技术介绍
在现在某些业务逻辑复杂的项目中,例如在游戏数据分析产品中,Game对象用于 描述游戏的相关属性,如游戏类型,开发商,终端平台等,通过执行getAccessPermission 函数,能够获得当前登录用户是否具有该游戏的权限,但是用户的权限信息统一被一个称 之为"个人中心"的系统集中管理,因此要获取用户的权限信息,需要通过远程调用"个人中 心"的方式获取。假设现在存在界面的展示需求,需要用列表显示所有的游戏,但是需要按 照当前用户有无权限进行排序,毕竟将无权限的游戏放在列表的最上方但是又无法操作, 会是非常糟糕的产品用户体验设计。为了实现此需求,一般采用Java自带的排序功能,设 置排序算法为根据用户的权限属性accessPermission来排序,但是如此使用,会带来大量 的针对"个人中心"的网络请求,如采用冒泡排序,时间复杂度为n2,贝如果有100个游戏, 则需要请求个人中心10000次,显然这是一个非常大的性能瓶颈。要解决性能问题的关键 在于需要一次从个人中心获取到用户拥有权限的所有游戏列表(使用T表示),并将该列表 传递到用于计算用户对特定游戏有无权限的地方。 针对上述应用场景,现有技术一的技术方案:修改函数getAccessPermission的 定义,将列表T作为函数参数传入。在调用函数之前,先调用个人中心得到该列表T,调用 函数getAccessPermission时传入T。如此方案,最大的问题在于向外暴露了获取游戏权 限的实现,破坏了"高内聚"。现有技术二的技术方案:列表T采用ThreadLocal的方式传 递,而不采用函数getAccessPermission的参数传递,如此不会破坏函数的接口,但是何时 往ThreadLocal里面设置值会是个问题,只有两种方案:a):在调用栈的上层代码中将列 表T设置到ThreadLocal中,以及负责从ThreadLocal中清除列表T,如此依然对外暴露 了具体实现逻辑,破坏了 "高内聚"。b):在函数getAccessPermission中将列表T设置到 ThreadLocal中,如此逻辑倒是被封装在了getAccessPermission函数中,没有对外暴露, 但是何时从ThreadLocal中清空列表T,无法做到缓存的列表T只在本次请求有效,需求对 应的功能无法实现。
技术实现思路
基于上述情况,本专利技术提出了一种通过JVM安全上下文实现缓存的方法和系统, 保证功能的同时而不损失设计的高内聚、低耦合。 为了实现上述目的,本专利技术技术方案的实施例为: -种通过JVM安全上下文实现缓存的方法,包括以下步骤: 当接收到用户的调用请求时,使用当前登录用户对预设对象进行实例化,得到所 述预设对象的实例,所述预设对象用于缓存用户业务需要的数据,所述预设对象继承于 Principal对象; 将所述实例注入当前调用堆栈的JVM安全上下文中; 在获取访问权限函数中获取所述JVM安全上下文中的所述实例,并查询所述实例 中是否缓存当前登录用户业务需要的数据; 当查询结果为是时,从所述实例中获取所述当前登录用户业务需要的数据;当查 询结果为否时,从第三方系统获取所述当前登录用户业务需要的数据,并将所述当前登录 用户业务需要的数据缓存在所述实例中; 当根据所述当前登录用户业务需要的数据完成所述用户的调用请求对应的业务 时,结束所述当前调用堆栈。 -种通过JVM安全上下文实现缓存的系统,包括: 实例化模块,用于当接收到用户的调用请求时,使用当前登录用户对预设对象进 行实例化,得到所述预设对象的实例,所述预设对象用于缓存用户业务需要的数据,所述预 设对象继承于Principal对象; 注入模块,用于将所述实例注入当前调用堆栈的JVM安全上下文中; 查询模块,用于在获取访问权限函数中获取所述JVM安全上下文中的所述实例, 并查询所述实例中是否缓存当前登录用户业务需要的数据; 处理模块,用于当查询结果为是时,从所述实例中获取所述当前登录用户业务需 要的数据;当查询结果为否时,从第三方系统获取所述当前登录用户业务需要的数据,并将 所述当前登录用户业务需要的数据缓存在所述实例中; 结束模块,用于当根据所述当前登录用户业务需要的数据完成所述用户的调用请 求对应的业务时,结束所述当前调用堆栈。 与现有技术相比,本专利技术的有益效果为:本专利技术通过JVM安全上下文实现缓存的 方法和系统,能够不破坏函数接口的前提下进行信息传递;放在安全上下文中的信息的生 命期自动是用户调用生命期的;当本次用户请求结束之后,和当前调用堆栈对应的安全上 下文被自动销毁,所以存储在安全上下文中的实例,以及实例中缓存的数据,也随之被销 毁,保证功能的同时而不损失设计的高内聚、低耦合,适合实际应用。【附图说明】 图1为一个实施例中通过JVM安全上下文实现缓存的方法流程图; 图2为基于图1所示方法一个具体示例中通过JVM安全上下文实现缓存的方法流 程图;图3为一个实施例中通过JVM安全上下文实现缓存的系统结构示意图。【具体实施方式】 为使本专利技术的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本 专利技术进行进一步的详细说明。应当理解,此处所描述的【具体实施方式】仅仅用以解释本专利技术, 并不限定本专利技术的保护范围。 -个实施例中通过JVM安全上下文实现缓存的方法,如图1所示,包括以下步骤: 步骤S101 :当接收到用户的调用请求时,使用当前登录用户对预设对象进行实例 化,得到所述预设对象的实例,所述预设对象用于缓存用户业务需要的数据,所述预设对象 继承于Principal对象; 步骤S102 :将所述实例注入当前调用堆栈的JVM安全上下文中; 步骤S103 :在获取访问权限函数中获取所述JVM安全上下文中的所述实例,并查 询所述实例中是否缓存当前登录用户业务需要的数据;所述获取访问权限函数可以反复使 用从第三方系统获取的数据; 步骤S104 :当查询结果为是时,从所述实例中获取所述当前登录用户业务需要的 数据;当查询结果为否时,从第三方系统获取所述当前登录用户业务需要的数据,并将所述 当前登录用户业务需要的数据缓存在所述实例中; 步骤S105:当根据所述当前登录用户业务需要的数据完成所述用户的调用请求 对应的业务时,结束所述当前调用堆栈。当完成对应的业务时,JVM自动结束当前调用堆栈, 安全上下文,实例以及被缓存在实例中的用户业务需要的数据均被自动销毁。 从以上描述可知,本专利技术能够不破坏函数接口的前提下进行信息传递;放在安全 上下文中的信息的生命期自动是用户调用生命期的;当本次用户请求结束之后,和当前调 用堆栈对应的安全上下文被自动销毁,所以存储在安全上下文中的实例,以及实例中缓存 的数据,也随之被销毁,保证功能的同时而不损失设计的高内聚、低耦合。 此外,在一个具体示例中,所述预设对象以值对的方式缓存所述用户业务需要的 数据。方便后续进行相应的扩展,满足更多的应用需求。 此外,在一个具体示例中,所述用户业务需要的数据包括用户拥有权限的列表和/ 或用户身份标识。根据实际需要获取业务需要的数据,再根据业本文档来自技高网
...

【技术保护点】
一种通过JVM安全上下文实现缓存的方法,其特征在于,包括以下步骤:当接收到用户的调用请求时,使用当前登录用户对预设对象进行实例化,得到所述预设对象的实例,所述预设对象用于缓存用户业务需要的数据,所述预设对象继承于Principal对象;将所述实例注入当前调用堆栈的JVM安全上下文中;在获取访问权限函数中获取所述JVM安全上下文中的所述实例,并查询所述实例中是否缓存当前登录用户业务需要的数据;当查询结果为是时,从所述实例中获取所述当前登录用户业务需要的数据;当查询结果为否时,从第三方系统获取所述当前登录用户业务需要的数据,并将所述当前登录用户业务需要的数据缓存在所述实例中;当根据所述当前登录用户业务需要的数据完成所述用户的调用请求对应的业务时,结束所述当前调用堆栈。

【技术特征摘要】

【专利技术属性】
技术研发人员:陈仕明
申请(专利权)人:广州华多网络科技有限公司
类型:发明
国别省市:广东;44

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1