本发明涉及信息技术领域,尤其是一种基于key-value型内存数据库的web跨域cookie管理系统。
背景技术:
cookie的本质是一个数据块,是在用户登录web时由web服务器创建的,并将该数据块通过http/https头信息传递到客户端,由客户端浏览器保持在本地文件中。cookie信息与用户访问域关联,并且具有时效性,超过时效将自动失效。客户端对目标域访问时需要在http/https请求头中填装对应的cookie信息。
伴随着“互联网+”业务的不断发展,一个web客户端需要同时访问多个域web信息的情况越来越多,则出现web访问跨域问题,基于安全考虑,浏览器一般禁止直接跨域访问,若需要跨域访问则需要通过一些技术手段解决。为了解决前端web终端跨域问题,现有技术提出以下方案:建立本地代理服务器,让浏览器直接访问本地代理服务器这个单域,其他域的访问全部由本地代理服务器代理完成。在这种方案中,本地代理服务器即充当了用户客户端的服务端又作为目标域访问请求的客户端,代理服务器代理客户端完成对目标域的请求,并将请求结果返回给客户端,同时代理客户端管理好目标域的cookie信息,包括目标域请求时向请求头信息中添加cookies信息以及目标域请求响应后cookies信息保持更新。
但是,上述通过代理服务器管理cookie的方法通常是将目标域cookie信息存储在代理服务器session中,采用这种管理方式在中小规模业务系统中可以有效使用,在较大规模系统中使用此方案将加重session存储和访问负担,并且不利于实施服务器集群模式下session共享。
技术实现要素:
发明目的:本发明旨在克服上述技术缺陷,提出一种不增加session存储和访问负担就能够解决web跨域访问时多个域名对应的多个cookie管理的技术方案,基于这个目的,本发明提出一种基于key-value型内存数据库的web跨域cookie管理系统。
技术方案:为实现上述目的,本发明提出的技术方案为:
基于key-value型内存数据库的web跨域cookie管理系统,包括:
客户端、本地代理服务器、key-value型内存数据库和至少一个目标域web服务器;
客户端初次访问某个目标域web服务器x时,本地代理服务器代理客户端向目标域web服务器发起调用请求,获取请求成功后目标域web服务器返回的本次登录cookie信息a和本次请求的响应信息t,根据cookie信息a和目标服务器域名联合生成一个唯一的key,用这个key将cookie信息a存储至key-value型内存数据库;然后,本地代理服务器为客户端的本次登陆创建session对象,把sessionkey作为客户端本次登录本地代理服务器的cookie信息b并反馈给客户端,以及将响应信息t写入本次本地代理服务器对客户端的响应信息t1中反馈给客户端;
当客户端再次访问目标域web服务器x时,客户端首先向本地代理服务器发送包含cookie信息b和目标域域名的目标域访问请求;本地代理服务器根据cookie信息b和目标域域名计算出key,根据key从key-value型内存数据库中加载cookie信息a填装在目标域请求信息头部,然后发起对目标域的调用请求,获取目标域web服务器返回的响应信息t2和本次登录目标域web服务器的cookie信息c,将cookie信息c更新到所述key-value型内存数据库中;最后,本地代理服务器将客户端本次登录的cookie信息d反馈给客户端,以及将响应信息t2写入本次本地代理服务器对客户端的响应信息t3中反馈给客户端。
进一步的,在本地代理服务器根据key读取key-value型内存数据库中的cookie信息前,首先判断cookie信息是否超过其时效性;若没有超过,则直接读取;若超过了,则从key-value型内存数据库中删除相应cookie信息并忽略本次读取。
进一步的,在将cookie信息c更新到所述key-value型内存数据库中时,首先取出cookie信息a,将cookie信息a与cookie信息c合并为一个cookie信息e,然后用cookie信息a的key将cookie信息e存储到key-value型内存数据库中,覆盖原本的cookie信息a的记录。
具体的,所述key-value型内存数据库为redis内存数据库。
有益效果:本发明通过sessionkey和访问域名创建key-value内存数据库存储键值key,将目标域返回的cookie信息直接作为value信息存储在内存数据库中,此方案相对于将目标域返回的cookie信息存储在session中的现有技术,存在以下优势:
1、本发明大大减少了session的内存占用空间。
2、本发明因为session内存占用量减少而大大提升了session信息反序列化速度,减少了cpu开销。
3、在一个产品出现多个跨域访问时,cookie加载可以只针对当前目标域,其他目标域的cookie信息均被忽略,此方案进一步减少了cookie信息序列化、反序列化性能及内存开销。
附图说明
图1为本发明实施例所述基于key-value型内存数据库的web跨域cookie管理系统架构示意图;
图2为实施例所述系统的工作流程图。
具体实施方式
本发明旨在提供一种通过key-value型内存数据库管理跨域cookie的方案,应用于借助于本地代理服务器作为前置机的跨域http/https请求的系统架构中。本发明提出的基于key-value型内存数据库的web跨域cookie管理系统包括客户端、本地代理服务器、目标域web服务器、key-value型内存数据库。所述管理系统的工作流程包括顺序执行的以下步骤:
a.客户端浏览器访问本地代理服务器,并将目标服务器访问的请求信息作为参数传递给本地代理服务器,客户端访问本地代理服务器的同时检查本地是否存在代理服务器的cookie信息,若存在有效cookie信息则在请求信息中携带cookie信息。
b.本地代理服务器检查请求信息是否包含cookie信息,若包含且cookie信息中包含代理服务器用户sessionkey信息,取出sessionkey值,然后执行步骤c;若不存在则直接转入到步骤e。
c.根据目标域地址信息和sessionkey信息拼接成一个字符串信息,此字符串信息作为访问对应目标域服务器cookie信息在key-value型内存数据库中的存储记录的key。
d.根据步骤c获取的内存数据库存储key从内存数据库中获取存储在内存数据库中的cookie信息,若存储信息存在且没有超过设定失效,则获取的cookie信息作为访问目标域服务的请求信息在步骤e中添加到web请求信息中,若获取失败则忽略。
e.组装目标域请求信息,并发起对目标域的http/https的调用请求。
f.若请求失败,直接跳转到步骤i处理;若请求成功,请求响应结果包含cookie信息,取出cookie信息,若在步骤d中从内存数据库取出cookie信息,则将2部分cookie信息合并,若不存在则将返回的cookie信息作为最终cookie信息。
g.如果步骤f处理结果存在一个有效的待保存更新的cookie信息,且本地代理服务器session不存在,则创建session,并取出sessionkey信息,并把sessionkey信息作为cookie信息在步骤i中输出给浏览器客户端。
h.如果步骤f处理结果存在一个有效的待保存更新的cookie,根据步骤c方案生成内存数据库存储cookie信息的存储key,并将本此对目标域请求返回的cookie信息更新覆盖到已存在的cookie信息中;完成cookie信息向内存数据库更新后需要同时针对本条存储信息更新其时效性,cookie有效作用时间点是cookie约定的有效时长+当前时间点。
i.处理请求响应结果作为浏览器客户端http/https请求的响应结果返回浏览器客户端,完成一次web调用请求。
为更清楚地阐述本发明所述技术方案,下面结合附图和具体实施方式对本发明作更进一步的说明。
实施例:本发明实施例建立如附图1所示系统结构,本地代理服务器采用nodejs开发实现,假定代理服务器域名为proxy.com;目标服务器有2台,一台为jboss服务器,假定域名为a.com,另一台为tomcat服务器,假定域名为b.com。urlhttp://a.com在本地代理服务器上的地址映射为http://proxy.com/abiz,urlhttp://b.com在本地代理服务器上的地址映射为http://proxy.com/bbiz。对目标地址http://a.com/hello的访问则转化为对http://proxy.com/abiz/hello的访问。
本实施例web访问交互流程如附图2所示。
1、假定客户浏览器首次执行web请求,请求地址为http://proxy.com/abiz/hello,处理步骤如下:
(11)nodejs代理服务器接收客户浏览器的http://proxy.com/abiz/hello请求。
(12)请求信息中没有包含当前用户在nodejs代理服务器cookie信息,代理服务器跳过对目标域cookie处理逻辑,直接执行对http://a.com/hello的web请求。
(13)web请求成功后返回信息包含当前用户a.com域的cookie信息,代理服务器创建当前用户在代理服务器上的cookie信息:
key为jsessionid
value为666adffd-7b47-4f37-aab7-1682f0d9befa。
(14)目标域cookie存储key生成规则为{目标域名}@{jsessionid},即:
{a.com}@{666adffd-7b47-4f37-aab7-1682f0d9befa}
以{a.com}@{666adffd-7b47-4f37-aab7-1682f0d9befa}为key,向redis内存数据库存储当前用户本次目标域请求返回的cookie信息。
(15)将执行http:/a.com/hello返回的信息输出到对http:饰roxy.com/abiz/hello请求的响应信息中,同时将步骤c创建的cookie信息输出到客户端浏览器,完成本次web请求。
2、用户再次执行对目标域请求,假定请求地址为http://proxy.com/abiz/hi,处理步骤如下:
(21)nodejs代理服务器接收客户浏览器的http://proxy.com/abiz/hi请求。
(22)请求信息包含了当前用户proxy.com域的cookie信息,从cookie信息中取出key为jsessionid的cookie信息666adffd-7b47-4f37-aab7-1682f0d9befa。
(23)根据目标域cookie存储key生成规则生成字符串{a.com}@{666adffd-7b47-4f37-aab7-1682f0d9befa}作为redis内存数据库访问key。
(24)根据内存数据库访问key{a.com}@{666adffd-7b47-4f37-aab7-1682f0d9befa}从内存数据库中取出当前用户对应的a.com目标域的cookie信息,并检查其时效性。
(25)将步骤(24)获取的有效目标域cookie信息添加到对目标地址http://a.com/hi的请求中,执行目标地址http://a.com/hi请求。
(26)web请求成功后返回信息包含当前用户a.com域的cookie信息。首先以{a.com}@{666adffd-7b47-4f37-aab7-1682f0d9befa}为key从内存数据库取出原有cookie信息,将本次新返回的cookie信息追加到原有cookie信息中,将合并好的cookie信息以{a.com}@{666adffd-7b47-4f37-aab7-1682f0d9befa}为key更新到redis内存数据库中,同时更新本存储记录的时效性。
(27)将执行http:/a.com/hi返回的信息输出到对http://proxy.com/abiz/hi请求的响应信息中,同时将当前用户在nodejs代理服务器上的cookie信息输出到客户端浏览器,完成本次web请求。
3、用户再次执行对另一目标域b.com请求,假定请求地址为http://proxy.com/bbiz/hi,处理步骤如下:
(31)nodejs代理服务器接收客户浏览器的http://proxy.com/bbiz/hi请求。
(32)请求信息包含了当前用户proxy.com域的cookie信息,从cookie信息中取出key为jsessionid的cookie信息666adffd-7b47-4f37-aab7-1682f0d9befa。
(33)根据目标域cookie存储key生成规则生成字符串{b.com}@{666adffd-7b47-4f37-aab7-1682f0d9befa}作为redis内存数据库访问key。
(34)根据内存数据库访问key{b.com}@{666adffd-7b47-4f37-aab7-1682f0d9befa}从内存数据库中取出当前用户对应的b.com目标域的cookie信息,内存数据库没有相关数据,直接执行对http://b.com/hi的web请求。
(35)web请求成功后返回信息包含当前用户b.com域的cookie信息。以{b.com}@{666adffd-7b47-4f37-aab7-1682f0d9befa}为key将b.com返回cookie信息以{b.com}@{666adffd-7b47-4f37-aab7-1682f0d9befa}为key更新到redis内存数据库中,同时更新本存储记录的时效性。
(36)将执行http:/b.com/hi返回的信息输出到对http://proxy.com/bbiz/hi请求的响应信息中,同时将当前用户在nodejs代理服务器上的cookie信息输出到客户端浏览器,完成本次web请求。
以上所述仅是本发明的优选实施方式,应当指出:对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。