具体实施方式
本发明实施例涉及的技术术语包括:
skey:用户登录认证后拿到的认证串,用于后续请求中判断用户是否己登录;
nginx:是高性能的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。其特点是占有内存少,并发能力强,国内使用nginx网站的用户有:新浪、网易、腾讯等;
cookie:有时也用其复数形式cookies,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。由网络服务器发送出来以存储在网络浏览器上;cookie是个存储在浏览器目录的文本文件,当浏览器运行时,存储在RAM中。一旦用户从该网站或网络服务器退出,cookie也可存储在计算机的硬驱上。当用户结束其浏览器对话时,即终止的所有cookie。
网站可以利用cookies跟踪统计用户访问该网站的习惯,比如什么时间访问,访问了哪些页面,在每个网页的停留时间等。利用这些信息,一方面是可以为用户提供个性化的服务,另一方面,也可以作为了解所有用户行为的工具。
目前cookies最广泛的的应用是记录用户登录信息,这样下次访问时可以不需要输入自己的用户名、密码,以便简化登录手续。
基于上述技术,如图1所示,本发明第一实施例提出一种实现跨域请求登录的方法,包括:
步骤S101,第一域业务服务器在浏览器登录第一域成功后,获取第二域的认证串写入所述第一域的cookie,并将所述第一域的cookie发送给浏览器;
本实施例方法运行环境涉及浏览器、第一域接入服务器、第一域业务服务器及至少一第二域业务服务器,其中:
浏览器作为前端接收用户的访问请求,根据该访问请求经第一域接入服务器转发从后台服务器(第一域业务服务器及至少一第二域业务服务器)获取访问数据,并展示给用户。
本实施例第一域接入服务器具体可以采用但不限于nginx服务器。如前所述,nginx服务器是高性能的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。通过第一域接入服务器实现访问请求的接入,并根据访问请求的类型转发至不同域的业务服务器。
本实施例可以实现不同于现有的JSONP跨域请求、iframe嵌入第二域的页面的请求方式以及服务端中转请求方式的跨域带登录态请求,以提高跨域请求登录的灵活性与通用性好,且成本低。
具体地,该跨域带登录态请求基于第一域的成功登录而实现。
首先,用户向浏览器发送对第一域的访问请求,浏览器接收到该第一域的访问请求后,将此访问请求转发至第一域接入服务器,由第一域接入服务器将此对第一域的访问请求转发至第一域业务服务器,以获取第一域的业务数据。
第一域业务服务器在收到对第一域的访问请求后,对此访问请求进行登录验证,当验证登录通过后,获取第二域的认证串(skey)写入第一域的cookie,并将携带有第二域的认证串的第一域的cookie发送给浏览器。
其中,获取第二域的认证串写入第一域的cookie,是为了后续第一接入服务器从第一域的cookie取出第二域的认证串,并在接入服务器向第二域业务服务器转发第二域的访问请求时带上该第二域的认证串,以实现跨域认证请求。
本实施例获取第二域的认证串写入第一域的cookie的方式具体可以采用以下两种:
对于第一域与第二域具有相同的认证串的情形,第一域业务服务器在浏览器登录第一域成功后,将第一域登录认证后得到的认证串写入第一域的cookie,该认证串可以作为后续第一域再次登录请求以及第二域登录请求时的登录认证,以判断用户是否己登录。
对于第一域的认证串与第二域的认证串不相同但可置换的情形,第一域业务服务器在浏览器登录第一域成功后,向第二域业务服务器置换获取第二域的认证串并写入所述第一域的cookie;当然作为第一域的正常登录流程,第一域业务服务器在浏览器登录第一域成功后,还会将第一域登录认证后得到的认证串写入第一域的cookie,该认证串作为后续第一域再次登录请求时的登录认证,以判断用户是否己登录。
步骤S102,所述浏览器在接收到对第二域的访问请求时,将第二域的访问请求携带所述第一域的cookie发送给第一域接入服务器;所述第二域的访问请求的域名预先修改为带有第二域专用标识的第一域的相关域;
在浏览器侧,浏览器在接收到第一域业务服务器发送的携带有第二域的认证串的第一域的cookie后,会将此携带有第二域的认证串的第一域的cookie保存在本地。
之后,浏览器在接收到用户对第二域的访问请求时,将携带有第二域的认证串的第一域的cookie携带在第二域的访问请求中,一同发送给第一域接入服务器,由第一域接入服务器将此对第二域的访问请求转发至第二域业务服务器。
其中,所述第二域的访问请求的域名预先修改为带有第二域专用标识的第一域的相关域,以便通过第一域接入服务器进行域名匹配,将此第二域的访问请求转发至第二域业务服务器,以实现跨域请求登录,同时又能避免前端存在跨域的问题,进而可以提高跨域请求登录的灵活性与通用性。
将第二域的访问请求的域名修改为带有第二域专用标识的第一域的相关域是为了便于第一域接入服务器对第二域的访问请求的判断识别,对于第二域的访问请求的域名的修改可以由开发人员预先根据用户需要来修改完成,上述域名修改具体可以采用以下方式:
第一种方式:
将第二域的访问请求的域名修改为第一域的子域,比如:第一域www.a.com需要请求带登录态的第二域地址www.b.com/xx/url.xhtml;用户登录后将skey写入www.a.com的cookie中,www.a.com的页面中本来请求第二域地址www.b.com/xx/url.xhtml,现在改请求为s.a.com/xx/url.xhtml,其中s.a.com为第二域请求专用子域,后续,第一域接入服务器收到请求后识别s.a.com为第二域的请求,将www.a.com的cookie中第二域的skey写入www.b.com的cookie中,并请求www.b.com/xx/url.xhtml完成跨域认证请求。
第二种方式:
将第二域的访问请求的域名修改为携带有第二域专用前缀、后缀或相关参数的第一域的相关域。比如,上述例子中,可将第二域地址www.b.com/xx/url.xhtml修改为www.a.com/p_b/xx/url.xhtml,其中p_b为第二域专用前缀,类似的修改方式,还可以在URL地址中采用后缀或其他相关参数。
步骤S103,所述第一域接入服务器通过域名匹配识别到所述第一域的相关域中的所述第二域专用标识时,判断当前接收的请求为第二域的访问请求,从所述第一域的cookie中获取所述第二域的认证串,写入第二域的cookie,并将所述第二域的cookie携带在第二域的访问请求中转发至第二域业务服务器。
第一域接入服务器接收到浏览器发送的域名修改后的第二域的访问请求后,对该请求进行域名匹配,识别到所述第一域的相关域中的第二域专用标识时,则可以判断当前接收的请求为第二域的访问请求,从第一域的cookie中获取第二域的认证串,写入第二域的cookie。
另外,第一域接入服务器还会将第二域的访问请求的域名由带有第二域专用标识的第一域的相关域还原为第二域地址的访问请求,并将第二域的cookie携带在第二域地址的访问请求中转发至第二域业务服务器,由此完成跨域登录认证请求的发送。
之后,第二域业务服务器接收到第二域的访问请求后,对此访问请求进行登录认证,在第二域登录成功之后,向浏览器返回业务数据。完成第二域的跨域访问。
本实施例通过将第二域的所有请求变成第一域的子域等相关域的请求,通过第一域的接入服务器带上第二域的认证串进行转发,完成跨域认证请求,使前端不存在跨域的问题,其实现形式灵活、通用性好且成本低。
下面以nginx接入服务器转发第二域的访问请求为例再次对本实施例方案进行详细阐述:
本实例使用nginx接入服务器转发请求,将第二域的所有请求变成第一域子域的请求,通过第一域的nginx带上skey进行转发,这样前端就不存在跨域的问题。详细过程如下:
如图2a所示,首先,用户通过浏览器、第一域的nginx向第一域业务服务器发送第一域的登录访问请求。
在第一域登录成功后,第一域业务服务器将认证通过后得到的skey(本实例以第一域与第二域具有相同的认证串进行举例)写入第一域cookie;
开发人员预先将所有原来访问第二域的请求的域名修改成第一域的子域(该子域只用于第二域的请求);
浏览器将访问第二域的请求发送给第一域的nginx,第一域的nginx接收到请求后,通过域名匹配,判断为第二域的请求,将第一域cookie中的skey写入第二域的cooike中,将第二域的cooike携带在第二域的访问请求中转发至第二域业务服务器,完成跨域认证请求,
具体举例如下:
比如:第一域www.a.com需要请求带登录态的第二域地址www.b.com/xx/url.xhtml;用户登录后将skey写入www.a.com的cookie中,www.a.com的页面中本来请求第二域地址www.b.com/xx/url.xhtml,现在改请求为s.a.com/xx/url.xhtml,其中s.a.com为第二域请求专用子域,nginx收到请求后识别s.a.com为第二域的请求,将www.a.com的cookie中的skey写入www.b.com的cookie中,并请求www.b.com/xx/url.xhtml完成跨域认证请求。
另外,当第一域和第二域的skey不相同但可以置换时,该方案也可以支持,只需要在用户第一域登录成功后,第一域业务服务器向第二域业务服务器置换获取到第二域的skey,写入第一域的cookie,第一域的nginx在转发请求时,将第一域的cookie中的第二域的skey取出,写入第二域的cookie中转发请求即可,如图2b所示。
如前所述,第一域接入服务器判断是否为第二域的请求,除了用子域的方式,也可以是url带前缀(比如上边例子中可用www.a.com/p_b/xx/url.xhtml,其中p_b为第二域专用前缀)、后缀或者参数的方式,在此不再赘述。
本实施例通过上述方案,nginx通过第二域专用标识识别出第二域的请求,获取第一域cookie中的skey写到第二域的cookie里,转发到第二域,从而避开浏览器跨域及认证的问题,提高了跨越登录请求的灵活性、通用性,同时还可以降低成本。
如图3所示,本发明第二实施例针对浏览器侧提出一种实现跨域请求登录的方法,包括:
步骤S10,接收对第一域的访问请求,将所述第一域的访问请求经所述第一域接入服务器转发至第一域业务服务器;
步骤S20,在浏览器登录第一域成功后,接收所述第一域业务服务器返回的携带有第二域的认证串的第一域的cookie;
其中,浏览器作为前端接收用户的访问请求,根据该访问请求经第一域接入服务器转发从后台服务器(第一域业务服务器及至少一第二域业务服务器)获取访问数据,并展示给用户。
本实施例第一域接入服务器具体可以采用但不限于nginx服务器。如前所述,nginx服务器是高性能的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。通过第一域接入服务器实现访问请求的接入,并根据访问请求的类型转发至不同域的业务服务器。
本实施例可以实现不同于现有的JSONP跨域请求、iframe嵌入第二域的页面的请求方式以及服务端中转请求方式的跨域带登录态请求,以提高跨域请求登录的灵活性与通用性好,且成本低。
具体地,该跨域带登录态请求基于第一域的成功登录而实现。
首先,用户向浏览器发送对第一域的访问请求,浏览器接收到该第一域的访问请求后,将此访问请求转发至第一域接入服务器,由第一域接入服务器将此对第一域的访问请求转发至第一域业务服务器,以获取第一域的业务数据。
第一域业务服务器在收到对第一域的访问请求后,对此访问请求进行登录验证,当验证登录通过后,获取第二域的认证串(skey)写入第一域的cookie,并将携带有第二域的认证串的第一域的cookie发送给浏览器。
其中,获取第二域的认证串写入第一域的cookie,是为了后续第一接入服务器从第一域的cookie取出第二域的认证串,并在接入服务器向第二域业务服务器转发第二域的访问请求时带上该第二域的认证串,以实现跨域认证请求。
本实施例获取第二域的认证串写入第一域的cookie的方式具体可以采用以下两种:
对于第一域与第二域具有相同的认证串的情形,第一域业务服务器在浏览器登录第一域成功后,将第一域登录认证后得到的认证串写入第一域的cookie,该认证串可以作为后续第一域再次登录请求以及第二域登录请求时的登录认证,以判断用户是否己登录。
对于第一域的认证串与第二域的认证串不相同但可置换的情形,第一域业务服务器在浏览器登录第一域成功后,向第二域业务服务器置换获取第二域的认证串并写入所述第一域的cookie;当然作为第一域的正常登录流程,第一域业务服务器在浏览器登录第一域成功后,还会将第一域登录认证后得到的认证串写入第一域的cookie,该认证串作为后续第一域再次登录请求时的登录认证,以判断用户是否己登录。
浏览器在接收到第一域业务服务器发送的携带有第二域的认证串的第一域的cookie后,会将此携带有第二域的认证串的第一域的cookie保存在本地。
步骤S30,接收对第二域的访问请求,所述第二域的访问请求的域名预先修改为带有第二域专用标识的第一域的相关域;
步骤S40,将第二域的访问请求携带所述第一域的cookie发送给第一域接入服务器;由所述第一域接入服务器通过域名匹配识别到第二域的访问请求时,将所述第一域的cookie中的第二域的认证串写入第二域的cookie,携带在第二域的访问请求中转发至第二域业务服务器。
浏览器在接收到用户对第二域的访问请求时,将携带有第二域的认证串的第一域的cookie携带在第二域的访问请求中,一同发送给第一域接入服务器,由第一域接入服务器将此对第二域的访问请求转发至第二域业务服务器。
其中,所述第二域的访问请求的域名预先修改为带有第二域专用标识的第一域的相关域,以便通过第一域接入服务器进行域名匹配,将此第二域的访问请求转发至第二域业务服务器,以实现跨域请求登录,同时又能避免前端存在跨域的问题,进而可以提高跨域请求登录的灵活性与通用性。
将第二域的访问请求的域名修改为带有第二域专用标识的第一域的相关域是为了便于第一域接入服务器对第二域的访问请求的判断识别,对于第二域的访问请求的域名的修改可以由开发人员预先根据用户需要来修改完成,上述域名修改具体可以采用以下方式:
第一种方式:
将第二域的访问请求的域名修改为第一域的子域,比如:第一域www.a.com需要请求带登录态的第二域地址www.b.com/xx/url.xhtml;用户登录后将skey写入www.a.com的cookie中,www.a.com的页面中本来请求第二域地址www.b.com/xx/url.xhtml,现在改请求为s.a.com/xx/url.xhtml,其中s.a.com为第二域请求专用子域,后续,第一域接入服务器收到请求后识别s.a.com为第二域的请求,将www.a.com的cookie中第二域的skey写入www.b.com的cookie中,并请求www.b.com/xx/url.xhtml完成跨域认证请求。
第二种方式:
将第二域的访问请求的域名修改为携带有第二域专用前缀、后缀或相关参数的第一域的相关域。比如,上述例子中,可将第二域地址www.b.com/xx/url.xhtml修改为www.a.com/p_b/xx/url.xhtml,其中p_b为第二域专用前缀,类似的修改方式,还可以在URL地址中采用后缀或其他相关参数。
然后,浏览器将携带有第二域的认证串的第一域的cookie携带在域名修改后的第二域的访问请求中,一同发送给第一域接入服务器,由第一域接入服务器将此对第二域的访问请求转发至第二域业务服务器。
第一域接入服务器接收到浏览器发送的域名修改后的第二域的访问请求后,对该请求进行域名匹配,识别到所述第一域的相关域中的第二域专用标识时,则可以判断当前接收的请求为第二域的访问请求,从第一域的cookie中获取第二域的认证串,写入第二域的cookie。
另外,第一域接入服务器还会将第二域的访问请求的域名由带有第二域专用标识的第一域的相关域还原为第二域地址的访问请求,并将第二域的cookie携带在第二域地址的访问请求中转发至第二域业务服务器,由此完成跨域登录认证请求的发送。
之后,第二域业务服务器接收到第二域的访问请求后,对此访问请求进行登录认证,在第二域登录成功之后,向浏览器返回业务数据。浏览器接收到第二域业务服务器返回的业务数据后展示给用户,由此完成第二域的跨域访问。
本实施例通过将第二域的所有请求变成第一域的子域等相关域的请求,通过第一域的接入服务器带上第二域的认证串进行转发,完成跨域认证请求,使前端不存在跨域的问题,其实现形式灵活、通用性好且成本低。
下面以nginx接入服务器转发第二域的访问请求为例再次对本实施例方案进行详细阐述:
本实例使用nginx接入服务器转发请求,将第二域的所有请求变成第一域子域的请求,通过第一域的nginx带上skey进行转发,这样前端就不存在跨域的问题。详细过程如下:
如图2a所示,首先,用户通过浏览器、第一域的nginx向第一域业务服务器发送第一域的登录访问请求。
在第一域登录成功后,第一域业务服务器将认证通过后得到的skey(本实例以第一域与第二域具有相同的认证串进行举例)写入第一域cookie;
开发人员预先将所有原来访问第二域的请求的域名修改成第一域的子域(该子域只用于第二域的请求);
浏览器将访问第二域的请求发送给第一域的nginx,第一域的nginx接收到请求后,通过域名匹配,判断为第二域的请求,将第一域cookie中的skey写入第二域的cooike中,将第二域的cooike携带在第二域的访问请求中转发至第二域业务服务器,完成跨域认证请求,
具体举例如下:
比如:第一域www.a.com需要请求带登录态的第二域地址www.b.com/xx/url.xhtml;用户登录后将skey写入www.a.com的cookie中,www.a.com的页面中本来请求第二域地址www.b.com/xx/url.xhtml,现在改请求为s.a.com/xx/url.xhtml,其中s.a.com为第二域请求专用子域,nginx收到请求后识别s.a.com为第二域的请求,将www.a.com的cookie中的skey写入www.b.com的cookie中,并请求www.b.com/xx/url.xhtml完成跨域认证请求。
另外,当第一域和第二域的skey不相同但可以置换时,该方案也可以支持,只需要在用户第一域登录成功后,第一域业务服务器向第二域业务服务器置换获取到第二域的skey,写入第一域的cookie,第一域的nginx在转发请求时,将第一域的cookie中的第二域的skey取出,写入第二域的cookie中转发请求即可,如图2b所示。
如前所述,第一域接入服务器判断是否为第二域的请求,除了用子域的方式,也可以是url带前缀(比如上边例子中可用www.a.com/p_b/xx/url.xhtml,其中p_b为第二域专用前缀)、后缀或者参数的方式,在此不再赘述。
本实施例通过上述方案,nginx通过第二域专用标识识别出第二域的请求,获取第一域cookie中的skey写到第二域的cookie里,转发到第二域,从而避开浏览器跨域及认证的问题,提高了跨越登录请求的灵活性、通用性,同时还可以降低成本。
如同4所示,本发明较佳实施例提出一种实现跨域请求登录的系统,包括:浏览器201、第一域接入服务器202、第一域业务服务器203、至少一第二域业务服务器204(图4中以一个第二域业务服务器204进行举例);
所述第一域业务服务器203,用于在浏览器201登录第一域成功后,获取第二域的认证串写入所述第一域的cookie,并将所述第一域的cookie发送给浏览器201;
所述浏览器201,用于接收所述第一域业务服务器203发送的所述第一域的cookie;在接收到对第二域的访问请求时,将第二域的访问请求携带所述第一域的cookie发送给所述第一域接入服务器202;所述第二域的访问请求的域名预先修改为带有第二域专用标识的第一域的相关域;
所述第一域接入服务器202,用于通过域名匹配识别到所述第一域的相关域中的所述第二域专用标识时,判断当前接收的请求为第二域的访问请求,从所述第一域的cookie中获取所述第二域的认证串,写入第二域的cookie,并将所述第二域的cookie携带在第二域的访问请求中转发至所述至少一第二域业务服务器204。
其中,浏览器201作为前端接收用户的访问请求,根据该访问请求经第一域接入服务器202转发从后台服务器(第一域业务服务器203及至少一第二域业务服务器204)获取访问数据,并展示给用户。
本实施例第一域接入服务器202具体可以采用但不限于nginx服务器。如前所述,nginx服务器是高性能的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。通过第一域接入服务器202实现访问请求的接入,并根据访问请求的类型转发至不同域的业务服务器。
本实施例可以实现不同于现有的JSONP跨域请求、iframe嵌入第二域的页面的请求方式以及服务端中转请求方式的跨域带登录态请求,以提高跨域请求登录的灵活性与通用性好,且成本低。
具体地,该跨域带登录态请求基于第一域的成功登录而实现。
首先,用户向浏览器201发送对第一域的访问请求,浏览器201接收到该第一域的访问请求后,将此访问请求转发至第一域接入服务器202,由第一域接入服务器202将此对第一域的访问请求转发至第一域业务服务器203,以获取第一域的业务数据。
第一域业务服务器203在收到对第一域的访问请求后,对此访问请求进行登录验证,当验证登录通过后,获取第二域的认证串(skey)写入第一域的cookie,并将携带有第二域的认证串的第一域的cookie发送给浏览器201。
其中,获取第二域的认证串写入第一域的cookie,是为了后续第一接入服务器从第一域的cookie取出第二域的认证串,并在接入服务器向第二域业务服务器204转发第二域的访问请求时带上该第二域的认证串,以实现跨域认证请求。
本实施例获取第二域的认证串写入第一域的cookie的方式具体可以采用以下两种:
对于第一域与第二域具有相同的认证串的情形,第一域业务服务器203在浏览器201登录第一域成功后,将第一域登录认证后得到的认证串写入第一域的cookie,该认证串可以作为后续第一域再次登录请求以及第二域登录请求时的登录认证,以判断用户是否己登录。
对于第一域的认证串与第二域的认证串不相同但可置换的情形,第一域业务服务器203在浏览器201登录第一域成功后,向第二域业务服务器204置换获取第二域的认证串并写入所述第一域的cookie;当然作为第一域的正常登录流程,第一域业务服务器203在浏览器201登录第一域成功后,还会将第一域登录认证后得到的认证串写入第一域的cookie,该认证串作为后续第一域再次登录请求时的登录认证,以判断用户是否己登录。
浏览器201在接收到第一域业务服务器203发送的携带有第二域的认证串的第一域的cookie后,会将此携带有第二域的认证串的第一域的cookie保存在本地。
之后,浏览器201在接收到用户对第二域的访问请求时,将携带有第二域的认证串的第一域的cookie携带在第二域的访问请求中,一同发送给第一域接入服务器202,由第一域接入服务器202将此对第二域的访问请求转发至第二域业务服务器204。
其中,所述第二域的访问请求的域名预先修改为带有第二域专用标识的第一域的相关域,以便通过第一域接入服务器202进行域名匹配,将此第二域的访问请求转发至第二域业务服务器204,以实现跨域请求登录,同时又能避免前端存在跨域的问题,进而可以提高跨域请求登录的灵活性与通用性。
将第二域的访问请求的域名修改为带有第二域专用标识的第一域的相关域是为了便于第一域接入服务器202对第二域的访问请求的判断识别,对于第二域的访问请求的域名的修改可以由开发人员预先根据用户需要来修改完成,上述域名修改具体可以采用以下方式:
第一种方式:
将第二域的访问请求的域名修改为第一域的子域,比如:第一域www.a.com需要请求带登录态的第二域地址www.b.com/xx/url.xhtml;用户登录后将skey写入www.a.com的cookie中,www.a.com的页面中本来请求第二域地址www.b.com/xx/url.xhtml,现在改请求为s.a.com/xx/url.xhtml,其中s.a.com为第二域请求专用子域,后续,第一域接入服务器202收到请求后识别s.a.com为第二域的请求,将www.a.com的cookie中第二域的skey写入www.b.com的cookie中,并请求www.b.com/xx/url.xhtml完成跨域认证请求。
第二种方式:
将第二域的访问请求的域名修改为携带有第二域专用前缀、后缀或相关参数的第一域的相关域。比如,上述例子中,可将第二域地址www.b.com/xx/url.xhtml修改为www.a.com/p_b/xx/url.xhtml,其中p_b为第二域专用前缀,类似的修改方式,还可以在URL地址中采用后缀或其他相关参数。
第一域接入服务器202接收到浏览器201发送的域名修改后的第二域的访问请求后,对该请求进行域名匹配,识别到所述第一域的相关域中的第二域专用标识时,则可以判断当前接收的请求为第二域的访问请求,从第一域的cookie中获取第二域的认证串,写入第二域的cookie。
另外,第一域接入服务器202还会将第二域的访问请求的域名由带有第二域专用标识的第一域的相关域还原为第二域地址的访问请求,并将第二域的cookie携带在第二域地址的访问请求中转发至第二域业务服务器204,由此完成跨域登录认证请求的发送。
之后,第二域业务服务器204接收到第二域的访问请求后,对此访问请求进行登录认证,在第二域登录成功之后,向浏览器201返回业务数据。浏览器201接收到第二域业务服务器204返回的业务数据后展示给用户,由此完成第二域的跨域访问。
本实施例通过将第二域的所有请求变成第一域的子域等相关域的请求,通过第一域的接入服务器带上第二域的认证串进行转发,完成跨域认证请求,使前端不存在跨域的问题,其实现形式灵活、通用性好且成本低。
下面以nginx接入服务器转发第二域的访问请求为例再次对本实施例方案进行详细阐述:
本实例使用nginx接入服务器转发请求,将第二域的所有请求变成第一域子域的请求,通过第一域的nginx带上skey进行转发,这样前端就不存在跨域的问题。详细过程如下:
如图2a所示,首先,用户通过浏览器201、第一域的nginx向第一域业务服务器203发送第一域的登录访问请求。
在第一域登录成功后,第一域业务服务器203将认证通过后得到的skey(本实例以第一域与第二域具有相同的认证串进行举例)写入第一域cookie;
开发人员预先将所有原来访问第二域的请求的域名修改成第一域的子域(该子域只用于第二域的请求);
浏览器201将访问第二域的请求发送给第一域的nginx,第一域的nginx接收到请求后,通过域名匹配,判断为第二域的请求,将第一域cookie中的skey写入第二域的cooike中,将第二域的cooike携带在第二域的访问请求中转发至第二域业务服务器204,完成跨域认证请求,
具体举例如下:
比如:第一域www.a.com需要请求带登录态的第二域地址www.b.com/xx/url.xhtml;用户登录后将skey写入www.a.com的cookie中,www.a.com的页面中本来请求第二域地址www.b.com/xx/url.xhtml,现在改请求为s.a.com/xx/url.xhtml,其中s.a.com为第二域请求专用子域,nginx收到请求后识别s.a.com为第二域的请求,将www.a.com的cookie中的skey写入www.b.com的cookie中,并请求www.b.com/xx/url.xhtml完成跨域认证请求。
另外,当第一域和第二域的skey不相同但可以置换时,该方案也可以支持,只需要在用户第一域登录成功后,第一域业务服务器203向第二域业务服务器204置换获取到第二域的skey,写入第一域的cookie,第一域的nginx在转发请求时,将第一域的cookie中的第二域的skey取出,写入第二域的cookie中转发请求即可,如图2b所示。
如前所述,第一域接入服务器202判断是否为第二域的请求,除了用子域的方式,也可以是url带前缀(比如上边例子中可用www.a.com/p_b/xx/url.xhtml,其中p_b为第二域专用前缀)、后缀或者参数的方式,在此不再赘述。
本实施例通过上述方案,nginx通过第二域专用标识识别出第二域的请求,获取第一域cookie中的skey写到第二域的cookie里,转发到第二域,从而避开浏览器201跨域及认证的问题,提高了跨越登录请求的灵活性、通用性,同时还可以降低成本。
如图5所示,本发明较佳实施例提出一种实现跨域请求登录的浏览器,包括:第一转发模块301、接收模块302以及第二转发模块303,其中:
第一转发模块301,用于接收对第一域的访问请求,将所述第一域的访问请求经所述第一域接入服务器转发至第一域业务服务器;
接收模块302,用于在浏览器登录第一域成功后,接收所述第一域业务服务器返回的携带有第二域的认证串的第一域的cookie;以及接收对第二域的访问请求,所述第二域的访问请求的域名预先修改为带有第二域专用标识的第一域的相关域;
第二转发模块303,用于将第二域的访问请求携带所述第一域的cookie发送给第一域接入服务器;由所述第一域接入服务器通过域名匹配识别到第二域的访问请求时,将所述第一域的cookie中的第二域的认证串写入第二域的cookie,携带在第二域的访问请求中转发至第二域业务服务器。
其中,浏览器作为前端接收用户的访问请求,根据该访问请求经第一域接入服务器转发从后台服务器(第一域业务服务器及至少一第二域业务服务器)获取访问数据,并展示给用户。
本实施例第一域接入服务器具体可以采用但不限于nginx服务器。如前所述,nginx服务器是高性能的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。通过第一域接入服务器实现访问请求的接入,并根据访问请求的类型转发至不同域的业务服务器。
本实施例可以实现不同于现有的JSONP跨域请求、iframe嵌入第二域的页面的请求方式以及服务端中转请求方式的跨域带登录态请求,以提高跨域请求登录的灵活性与通用性好,且成本低。
具体地,该跨域带登录态请求基于第一域的成功登录而实现。
首先,用户向浏览器发送对第一域的访问请求,浏览器接收到该第一域的访问请求后,通过第一转发模块301将此访问请求转发至第一域接入服务器,由第一域接入服务器将此对第一域的访问请求转发至第一域业务服务器,以获取第一域的业务数据。
第一域业务服务器在收到对第一域的访问请求后,对此访问请求进行登录验证,当验证登录通过后,获取第二域的认证串(skey)写入第一域的cookie,并将携带有第二域的认证串的第一域的cookie发送给浏览器,浏览器通过接收模块302接收第一域业务服务器发送的携带有第二域的认证串的第一域的cookie。
其中,第一域业务服务器获取第二域的认证串写入第一域的cookie,是为了后续第一接入服务器从第一域的cookie取出第二域的认证串,并在接入服务器向第二域业务服务器转发第二域的访问请求时带上该第二域的认证串,以实现跨域认证请求。
本实施例获取第二域的认证串写入第一域的cookie的方式具体可以采用以下两种:
对于第一域与第二域具有相同的认证串的情形,第一域业务服务器在浏览器登录第一域成功后,将第一域登录认证后得到的认证串写入第一域的cookie,该认证串可以作为后续第一域再次登录请求以及第二域登录请求时的登录认证,以判断用户是否己登录。
对于第一域的认证串与第二域的认证串不相同但可置换的情形,第一域业务服务器在浏览器登录第一域成功后,向第二域业务服务器置换获取第二域的认证串并写入所述第一域的cookie;当然作为第一域的正常登录流程,第一域业务服务器在浏览器登录第一域成功后,还会将第一域登录认证后得到的认证串写入第一域的cookie,该认证串作为后续第一域再次登录请求时的登录认证,以判断用户是否己登录。
浏览器在接收到第一域业务服务器发送的携带有第二域的认证串的第一域的cookie后,会将此携带有第二域的认证串的第一域的cookie保存在本地。
之后,浏览器在接收到用户对第二域的访问请求时,通过第二转发模块303将携带有第二域的认证串的第一域的cookie携带在域名修改后的第二域的访问请求中,一同发送给第一域接入服务器,由第一域接入服务器将此对第二域的访问请求转发至第二域业务服务器。
其中,将所述第二域的访问请求的域名预先修改为带有第二域专用标识的第一域的相关域,以便通过第一域接入服务器进行域名匹配,将此第二域的访问请求转发至第二域业务服务器,以实现跨域请求登录,同时又能避免前端存在跨域的问题,进而可以提高跨域请求登录的灵活性与通用性。
将第二域的访问请求的域名修改为带有第二域专用标识的第一域的相关域是为了便于第一域接入服务器对第二域的访问请求的判断识别,对于第二域的访问请求的域名的修改可以由开发人员预先根据用户需要来修改完成,上述域名修改具体可以采用以下方式:
第一种方式:
将第二域的访问请求的域名修改为第一域的子域,比如:第一域www.a.com需要请求带登录态的第二域地址www.b.com/xx/url.xhtml;用户登录后将skey写入www.a.com的cookie中,www.a.com的页面中本来请求第二域地址www.b.com/xx/url.xhtml,现在改请求为s.a.com/xx/url.xhtml,其中s.a.com为第二域请求专用子域,后续,第一域接入服务器收到请求后识别s.a.com为第二域的请求,将www.a.com的cookie中第二域的skey写入www.b.com的cookie中,并请求www.b.com/xx/url.xhtml完成跨域认证请求。
第二种方式:
将第二域的访问请求的域名修改为携带有第二域专用前缀、后缀或相关参数的第一域的相关域。比如,上述例子中,可将第二域地址www.b.com/xx/url.xhtml修改为www.a.com/p_b/xx/url.xhtml,其中p_b为第二域专用前缀,类似的修改方式,还可以在URL地址中采用后缀或其他相关参数。
第一域接入服务器接收到浏览器发送的域名修改后的第二域的访问请求后,对该请求进行域名匹配,识别到所述第一域的相关域中的第二域专用标识时,则可以判断当前接收的请求为第二域的访问请求,从第一域的cookie中获取第二域的认证串,写入第二域的cookie。
另外,第一域接入服务器还会将第二域的访问请求的域名由带有第二域专用标识的第一域的相关域还原为第二域地址的访问请求,并将第二域的cookie携带在第二域地址的访问请求中转发至第二域业务服务器,由此完成跨域登录认证请求的发送。
之后,第二域业务服务器接收到第二域的访问请求后,对此访问请求进行登录认证,在第二域登录成功之后,向浏览器返回业务数据。浏览器接收到第二域业务服务器返回的业务数据后展示给用户,由此完成第二域的跨域访问。
本实施例通过将第二域的所有请求变成第一域的子域等相关域的请求,通过第一域的接入服务器带上第二域的认证串进行转发,完成跨域认证请求,使前端不存在跨域的问题,其实现形式灵活、通用性好且成本低。
下面以nginx接入服务器转发第二域的访问请求为例再次对本实施例方案进行详细阐述:
本实例使用nginx接入服务器转发请求,将第二域的所有请求变成第一域子域的请求,通过第一域的nginx带上skey进行转发,这样前端就不存在跨域的问题。详细过程如下:
如图2a所示,首先,用户通过浏览器、第一域的nginx向第一域业务服务器发送第一域的登录访问请求。
在第一域登录成功后,第一域业务服务器将认证通过后得到的skey(本实例以第一域与第二域具有相同的认证串进行举例)写入第一域cookie;
开发人员预先将所有原来访问第二域的请求的域名修改成第一域的子域(该子域只用于第二域的请求);
浏览器将访问第二域的请求发送给第一域的nginx,第一域的nginx接收到请求后,通过域名匹配,判断为第二域的请求,将第一域cookie中的skey写入第二域的cooike中,将第二域的cooike携带在第二域的访问请求中转发至第二域业务服务器,完成跨域认证请求,
具体举例如下:
比如:第一域www.a.com需要请求带登录态的第二域地址www.b.com/xx/url.xhtml;用户登录后将skey写入www.a.com的cookie中,www.a.com的页面中本来请求第二域地址www.b.com/xx/url.xhtml,现在改请求为s.a.com/xx/url.xhtml,其中s.a.com为第二域请求专用子域,nginx收到请求后识别s.a.com为第二域的请求,将www.a.com的cookie中的skey写入www.b.com的cookie中,并请求www.b.com/xx/url.xhtml完成跨域认证请求。
另外,当第一域和第二域的skey不相同但可以置换时,该方案也可以支持,只需要在用户第一域登录成功后,第一域业务服务器向第二域业务服务器置换获取到第二域的skey,写入第一域的cookie,第一域的nginx在转发请求时,将第一域的cookie中的第二域的skey取出,写入第二域的cookie中转发请求即可,如图2b所示。
如前所述,第一域接入服务器判断是否为第二域的请求,除了用子域的方式,也可以是url带前缀(比如上边例子中可用www.a.com/p_b/xx/url.xhtml,其中p_b为第二域专用前缀)、后缀或者参数的方式,在此不再赘述。
本实施例通过上述方案,nginx通过第二域专用标识识别出第二域的请求,获取第一域cookie中的skey写到第二域的cookie里,转发到第二域,从而避开浏览器跨域及认证的问题,提高了跨越登录请求的灵活性、通用性,同时还可以降低成本。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。具体地,图3所述的实现跨域请求登录的浏览器所对应的程序指令可以存储在计算机等用户终端的可读存储介质中,并被其中的至少一个处理器执行,以实现图1、图3所述的实现跨域请求登录的方法。
以上所述仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或流程变换,或直接或间接运用在其它相关的技术领域,均同理包括在本发明的专利保护范围内。