背景技术
随着WEB(万维网)技术的发展,基于WEB环境的软件系统已经成为主流,这些系统大多采用B/S(浏览器/服务器)方式,用户直接通过浏览器访问软件系统提供的服务。
随着软件系统复杂度的日益提高,WEB环境下单服务器或侧重于性能和可靠性的群集系统已经很难满足客户需要,在很多应用中,系统需要多台服务器提供不同类型的服务,这些服务器之间不必或者不能实现群集。这种系统简化的部署模型如图1所示,服务器2对客户端请求的执行是依赖于服务器1的执行结果。由于安全性原因,不能将服务器1的执行结果直接通过客户端转发给服务器2,而是将服务器1中的执行结果中与服务器2的执行有关的部分作为用户状态保存在服务器端。现有的实现方式如下,如图2所示:
1、客户端向服务器1发出针对服务器2的服务请求,表示需要访问服务器2提供的服务;
2、在服务器1执行与服务器2相关的请求后生成服务标识,将用户状态和该服务标识作一一对应,保存在服务器1的内存或后台数据库中;
3、将步骤1生成的服务标识和对服务器2的访问请求通过客户端转发到服务器2;
4、服务器2接收到请求和服务标识后,根据服务标识向服务器1(用户状态保存在内存中时)或后台数据库查询用户状态;
5、服务器2根据从服务器1(用户状态保存在内存中时)或后台数据库查询到的用户状态向客户端提供相应的服务;
6、服务器2发送服务响应到客户端,处理结束。
在实现上述多服务器互操作的过程中,发明人发现现有技术中至少存在如下问题:
1、每次用户请求服务器2的服务时,服务器2都需要向服务器1(或后台数据库)查询用户状态,因而性能比较低;为提高性能,也可以在服务器2缓存部分用户状态,避免短期内重复访问服务器2的同一服务时还需要向服务器1(或数据库)查询用户状态,但这样需要考虑缓存更新的问题,增加了系统的复杂性;
2、为保证后台服务器间的用户状态交换,必须通过客户端将服务标识从服务器1传递到服务器2,由于Cookie的跨DNS域限制,在服务器1和服务器2不在同一个DNS域时而且必须通过Cookie传递服务标识的情况时(必须通过Cookie传递服务标识的情况如:内容管理系统中向服务器1发出针对服务器2的文件访问请求时,所访问的文件是类似HTML的复合文档,这类文档会在主文档中嵌入图片、视频等对象的引用,客户端接收到该文件后,会自动向服务器2发出访问引用对象的请求,这些请求没有经过服务器1,无法通过URL参数的方式显式传递服务标识,只能在通过Cookie传递服务标识),只能通过多次URL重定向交换服务标识,导致系统结构复杂,性能较低;
3、对于以数据库方式存储用户状态的方案,需要在服务器1和服务器2能够访问同一数据库,在复杂的网络环境下(服务器1和服务器2在地理位置上不在同一位置)可能会由于网络环境限制或性能原因,很难达到这个要求。而且还需要在服务器2上部署数据库访问组件,因而系统结构复杂;
4、对于在服务器1内存上缓存状态的方案,需要在服务器1上缓存大量用户状态数据,这会消耗巨大的系统存储,另外为避免用户状态数据无限制膨胀,还需要考虑定期清除用户状态数据,因而系统结构复杂。
总而言之,现有技术中的方案,由于服务器间的后台状态信息交换频繁,从而导致的互操作性能低,系统结构复杂。
具体实施方式
本发明提供的一种面向同一客户端的多服务器互操作方法,解决了由于服务器间的后台状态信息交换频繁,从而导致的互操作性能低,系统结构复杂这一问题。本发明提供的方法利用数字签名的传递和验证,因每次另一服务器接收到一服务器通过客户端转发的服务请求时,另一服务器都确知请求的来源,也就不再需要向一服务器或后台数据库查询用户状态,从而避免了每次互操作都需要在后台进行用户状态的频繁交换,提高了互操作性能;
对于需要后台交换用户状态的方案来说,本发明提供的方法,因客户端每次向一服务器发出针对另一服务器的服务请求时,不再需要通过客户端传递服务标识,从而提高了互操作性能,简化了系统结构;
对于以数据库方式存储用户状态的方案来说,本发明提供的方法,因每次另一服务器接收到一服务器通过客户端转发的服务请求时,不再需要向后台数据库查询用户状态,所以避免了在复杂网络环境下访问不到数据库的可能,同时也无需在服务器上部署数据库访问组件,因而简化了系统结构;
对于在服务器的内存上缓存状态的方案来说,本发明提供的方法,因每次另一服务器接收到一服务器通过客户端转发的服务请求时,不再需要向一服务器查询用户状态,所以减少了服务器为缓存用户状态而产生的存储消耗,同时也避免了因缓存的用户状态数据无限制膨胀,定期清除用户状态数据这一工作,因而简化了系统结构。
下面结合附图对本发明实施例提供的面向同一客户端的多服务器互操作方法。
本发明实施例提供一种面向同一客户端的多服务器互操作方法,如图3所示,该多服务器互操作方法包括如下步骤:
301、客户端向一服务器发出针对另一服务器的服务请求;
302、所述一服务器收到所述服务请求后,生成服务参数,并将服务参数进行数字签名,得到数字签名结果;
303、所述一服务器将所述将服务参数和所述数字签名结果通过客户端转发到所述另一服务器;
304、所述另一服务器接收所述服务参数和所述数字签名结果,并对所述数字签名结果进行验证,验证成功后,根据所述服务参数向客户端提供服务。
其中一服务器记为服务器1,另一服务器记为服务器2。
本发明实施例提供的一种面向同一客户端的多服务器互操作方法,客户端向服务器1发出针对服务器2的服务请求后,服务器1收到服务请求并生成服务参数,然后将服务参数进行数字签名;再通过客户端将服务参数和数字签名结果转发到服务器2;服务器2接收到后对数字签名结果进行验证,验证成功后,向客户端提供服务。
这样一来,利用数字签名的传递和验证,每次服务器2接收到服务器1通过客户端转发的服务请求时,服务器2都确知请求来源于服务器1,服务器2也就不再需要向服务器1或后台数据库查询用户状态,从而避免了每次互操作都需要在后台进行用户状态交换,提高了互操作性能;
对于需要后台交换用户状态的方案来说,本实施例提供的方法,因客户端向服务器1发出针对服务器2的服务请求,不再需要通过客户端传递服务标识,提高了互操作性能,简化了系统结构;
对于以数据库方式存储用户状态的方案来说,本实施例提供的方法,因每次服务器2接收到服务器1通过客户端转发的服务请求时,服务器2不再需要向后台数据库查询用户状态,所以避免了在复杂网络环境下访问不到数据库的可能,同时也无需在服务器2上部署数据库访问组件,因而简化了系统结构;
对于在服务器1的内存上缓存状态的方案来说,本实施例提供的方法,因每次服务器2接收到服务器1通过客户端转发的服务请求时,服务器2不再需要向服务器1的内存查询用户状态,所以减少了服务器1为缓存用户状态而产生的存储消耗,同时也避免了因缓存的用户状态数据无限制膨胀,定期清除用户状态数据这一工作,因而简化了系统结构。
其中本实施例的所述步骤302的服务参数包括:
需要访问的实际统一资源定位符,记为Param.URLserver2;
当前访问客户端的互联网协议地址,记为Param.IPClient;
客户端发起所述服务请求的发起时间,记为Param.T2server1;
客户端发起的所述服务请求的有效期,Param.LifeTime;
服务特定的参数。
如图4所示,本发明实施例的步骤302服务器1收到所述服务请求后,生成服务参数,并将服务参数进行数字签名,得到数字签名结果包括:
302A、服务器1收到所述服务请求后,生成针对服务器2的统一资源定位符,记为URLserver2,和服务参数,记为Param;
302B、将所述服务参数Param进行编码,得到编码服务参数,记为Enc(Param),Enc表示编码函数;
302C、利用数字签名算法和服务器1的私钥对编码后的服务参数进行数字签名,数字签名结果记为D(AlgD,PVKserver1,Enc(Param));其中AlgD为数字签名算法,PVKServer1为服务器1的私钥,D为数字签名函数。
步骤303服务器1将所述将服务参数和所述数字签名结果通过客户端转发到服务器2包括:
303A、服务器1将所述统一资源定位符、所述编码服务参数和数字签名结果返回给客户端;
303B、所述客户端根据所述统一资源定位符将所述编码服务参数和数字签名结果转发给服务器2。
如图4所示,步骤303A服务器1将所述统一资源定位符、所述编码服务参数和数字签名结果返回给客户端包括:
303A1、服务器1将所述编码服务参数Enc(Param)和数字签名结果D(AlgD,PVKServer1,Enc(Param))进行统一资源定位符编码,以保证这些数据能够在WEB环境中通过URL传递,其结果记为UrlEnc(Enc(Param))和UrlEnc(D(AlgD,PVKServer1,Enc(Param)))。
其中,UrlEnc表示统一资源定位符编码函数;
一个可选的统一资源定位符编码函数是将Enc(Param)和D(AlgD,PVKServer1,Enc(Param))转换为二进制字符串表示;
然后将得到的统一资源定位符编码服务参数UrlEnc(Enc(Param))和统一资源定位符编码数字签名结果UrlEnc(D(AlgD,PVKServer1,Enc(Param)))以及统一资源定位符URLserver2返回给客户端。
303A2,客户端接收服务器1的返回结果,并组织向服务器2发出请求转发服务URL。
进一步的,如图4所示,步骤303B所述客户端根据所述统一资源定位符将所述编码服务参数和数字签名结果转发给服务器2包括:
303B1、所述客户端根据所述统一资源定位符,将统一资源定位符编码服务参数和统一资源定位符编码数字签名结果转发给服务器2。
如果通过HTTP GET方式向服务器2请求服务时,完整的URL如下:
URLserver2?param=UrlEnc(Enc(Param))&signature=UrlEnc(D(AlgD,PVKServer1,Enc(Param)));
如果通过HTTP POST方式向服务器2请求服务时,URL则只有URLserver2,参数则通过表单传递。
如图4所示,本发明实施例的步骤304服务器2接收所述将服务参数和所述数字签名结果,并记录所述客户端的互联网协议地址,记为IPClient。
所述数字签名结果包括:
304A、所述另一服务器接收并读取所述统一资源定位符编码服务参数UrlEnc(Enc(Param))和统一资源定位符编码数字签名结果UrlEnc(D(AlgD,PVKServer1,Enc(Param)));
304B、对所述统一资源定位符编码服务参数UrlEnc(Enc(Param))和所述统一资源定位符编码数字签名结果UrlEnc(D(AlgD,PVKServer1,Enc(Param)))进行合法性验证;
当验证合法时,步骤304C、将所述统一资源定位符编码服务参数UrlEnc(Enc(Param))和统一资源定位符编码数字签名结果UrlEnc(D(AlgD,PVKServer1,Enc(Param)))进行统一资源定位符解码,解码结果用UrlEnc-1(UrlEnc(Enc(Param)))和UrlEnc-1(UrlEnc(D(AlgD,PVKServer1,Enc(Param))))表示,其中UrlEnc-1是UrlEnc的反函数。
其中,上述步骤304B对所述统一资源定位符编码服务参数和所述统一资源定位符编码数字签名结果进行合法性验证具体为:
确定统一资源定位符编码服务参数和统一资源定位符编码数字签名结果是否存在和格式是否合法,若所述统一资源定位符编码服务参数和统一资源定位符编码数字签名结果存在且格式合法,则所述验证统一资源定位符编码服务参数和统一资源定位符编码数字签名结果具有合法性。
如图4所示,本发明实施例的步骤304服务器2对所述数字签名结果进行验证,验证成功后,根据所述服务参数向客户端提供服务包括:
304C、根据统一资源定位符解码后的UrlEnc-1(UrlEnc(Enc(Param)))和UrlEnc-1(UrlEnc(D(AlgD,PVKServer1,Enc(Param)))),利用与步骤104相同的数字签名算法和服务器1的公钥PBKServer1进行签名验证,验证过程用V(AlgD,PBKServer1,UrlEnc-1(UrlEnc(Enc(Param))),UrlEnc-1(UrlEnc(D(AlgD,
PVKServer1,Enc(Param)))))表示,其中V为验证函数;
304D、若验证失败,执行步骤304H向客户端发送错误消息,并结束处理;
304E、若验证成功,对统一资源定位符解码后的服务参数UrlEnc-1(UrlEnc(Enc(Param)))进行服务参数解码,解码结果用Enc-1(UrlEnc-1(UrlEnc(Enc(Param))))表示,其中Enc-1是Enc的反函数,解码结果简化记为Param2;
304F、服务器2对所述服务参数进行验证包括:
比较所述服务参数中的统一资源定位符Param2.URLserver2与客户端转发时所根据的统一资源定位符URLserver2是否相同;和
比较所述服务参数中的客户端的互联网协议地址Param2.IPClient与服务器2所记录的客户端的互联网协议地址IPClient是否相同;和
确定客户端发起的服务请求是否在有效期之内,包括如下步骤:
如图4所示,服务器1和服务器2定期同步时钟:
41、服务器2向服务器1查询服务器1时钟;
42、服务器1读取本机时钟T1server1,将本机时钟返回服务器2;
43、服务器2接收服务器1时钟,并读取本机时钟T1server2,计算时钟差Tdiff=T1server2-T1server1;并记录下来备用;
验证客户端发起的服务请求是否在有效期之内时,读取服务器2当前时钟T2server2,如果T2server2-TDiff-Param.T2server1<Param2.LifeTime,则表示该请求在有效期内;
304G、若验证失败,则执行步骤304H,若成功,则执行步骤304I;
304H、向客户端发送错误消息,并结束处理;
304I、若成功,则执行步骤304I,根据所述服务参数向客户端提供服务。
本发明的实施例提供的面向同一客户端的多服务器互操作的方法、客户端向服务器1发出针对服务器2的服务请求,服务器1根据请求生成服务参数,并将服务参数编码后进行数字签名,再将编码后的服务参数和数字签名进行URL编码,并通过客户端转发至服务器2;服务器2接收并验证通过Get或Post传递的请求参数,验证成功后进行URL解码,再进行数字签名验证,验证成功后,进行解码得到服务参数,再对服务参数进行验证,验证成功后,根据服务参数向客户端提供服务。
这样一来,利用数字签名的传递和验证,每次服务器2接收到服务器1通过客户端转发的服务请求时,服务器2都确知请求来源于服务器1,服务器2也就不再需要向服务器1或后台数据库查询用户状态,从而避免了每次互操作都需要在后台进行用户状态交换,提高了互操作性能;由于无需在每次互操作时在服务器1和服务器2之间进行后台用户状态交换,避免了通过客户端传递服务标识,而且也不需要在共享数据库或服务器1的内存存储用户状态,简化了系统结构;
另外本发明实施例还利用了是否超出有效期这一验证来避免重放攻击。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。