【具体实施方式】
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
图1为本申请一实施例提供的跨域请求数据的方法的流程示意图。如图1所示,该方法包括:
101、拦截由客户端发往服务端的异步请求。
102、若上述异步请求是向服务端请求数据的跨域请求,将上述异步请求发送给服务端,接收服务端针对该异步请求返回的异步响应,并根据异步请求中的跨域请求头对该异步响应进行更新,以获得跨域响应。
103、将跨域响应发送给客户端。
本实施例提供一种跨域请求数据的方法,可由代理装置来执行。该代理装置位于客户端与服务端之间,负责对客户端和服务端之间的请求和响应进行处理,使得客户端能够向与客户端不在同一域内的服务端请求数据。
在本实施例中,客户端和服务端采用超文本传输协议(Hypertexttransfer protocol,HTTP)或超文本传输安全协议(Hyper Text TransferProtocol over Secure Socket Layer,HTTPS)进行交互。客户端主要是指浏览器或可以进行网页处理的APP。本申请的异步请求主要是指HTTP请求或HTTPS请求。
根据HTTP协议规范,为了保证安全性,客户端需要跨域请求数据时,需要在发出的异步请求中携带跨域请求头,用于标识该异步请求是跨域请求。跨域请求头可以是access-control-*系列的请求头。只有当服务端正确响应这些头信息时,该异步请求才可以合法地进行跨域。
考虑到服务端本身并不具备对跨域请求头进行响应的能力,所以若要实现上述规范,本领域技术人员很容易想到的方法是对服务端进行改进,使得服务端可以对跨域请求头进行响应。但是,由于单个页面往往对应多个后端应用,涉及的服务器数量很多,导致实现起来代价较大,所以在实际应用中该方法并未真正被使用。
面临客户端需要进行跨域请求数据的问题,本实施例提供一种方法,主要思想是在客户端和服务端之间布设代理装置,由代理装置负责进行跨域请求的处理,在实现跨域请求数据的同时,不需要对服务端和客户端进行改进,实现成本较低。
具体的,当客户端需要向服务端请求页面数据时,向服务端发送用于请求数据的异步请求。若客户端与服务端不在同一域内,则客户端向服务端发送的异步请求属于用于请求数据的跨域请求,则该异步请求中需要包括用于标识该异步请求是跨域请求的跨域请求头,可以是access-control-*系列的请求头。若客户端与服务端在同一域内,则客户端向服务端发送的异步请求属于常规请求,不属于跨域请求。
值得说明的是,access-control-*系列的请求头可以包括以下字段:
Origin字段:表示当前所在的域;
Access-Control-Request-Method字段:用于询问服务端,允许在请求中使用的方法;
Access-Control-Requeset-Header字段:用于询问服务端,允许在请求中使用的HTTP头信息。
代理装置拦截客户端发送给服务端的异步请求,判断该异步请求是不是向服务端请求数据的跨域请求。若判断结果为是,代理装置将该异步请求发送给服务端,服务端对该异步请求进行响应,并返回异步响应。其中,该异步响应中携带有客户端请求的页面数据。值得说明的是,由于异步请求是跨域请求,所以该请求中包括跨域请求头,服务端对此部分信息可以不做任何响应。
例如,代理装置可以对拦截到的异步请求进行解析,判断该异步请求是否携带有跨域请求头,若异步请求携带有跨域请求头,则确认该异步请求是跨域请求;若异步请求未携带有跨域请求头,则确认该异步请求不是跨域请求。可选的,若拦截到的异步请求是跨域请求,代理装置可以读取异步请求中的跨域请求头,并存储在本地。
代理装置接收到服务端返回的异步响应后,可以根据异步请求中的跨域请求头对异步响应进行更新,以获得跨域响应,并将跨域响应返回给客户端,以供客户端从跨域响应中获取所需的数据。跨域响应中也携带有客户端请求的页面数据。
例如,代理装置可以根据异步请求中的跨域请求头,生成跨域响应头;在异步响应中添加跨域响应头,以获得跨域响应。具体的,代理装置可以将跨域响应头添加到异步响应中的头部信息中。
跨域响应头主要是对跨域请求头的响应。以跨域请求头为access-control-*系列的请求头为例,则跨域响应头可以包括以下字段:
Access-Control-Allow-Origin字段:用于响应该请求的域名是否可以被合法跨域;
Access-Control-Expose-Header字段:用于响应该客户端允许访问的HTTP头信息。
另外,若判断出拦截到的异步请求不是跨域请求,而是向服务端请求数据的非跨域请求,则代理装置可以将该异步请求发送给服务端,接收服务端针对该异步请求返回的异步响应,直接将异步响应发送给客户端,以供客户端从异步响应中获取所需的数据。
由上述分析可见,本实施例通过代理装置对客户端发送给服务端的请求进行处理,拥有了正确响应跨域请求头的能力,使客户端的跨域请求可以正常进行,而服务端与客户端不需要进行任何改造处理,实现成本较低。
进一步,在部分情况下,客户端可以在向服务端发送请求数据的异步请求之前,先向服务端发送一个预验请求,用于对服务端进行跨域规则的验证,以便于在服务端具有响应跨域请求的能力的情况下,再向服务端发送请求数据的跨域请求。该预验请求也是一个异步请求。
值得说明的是,预验请求与用于请求数据的请求虽然都是异步请求,但可以通过采用的方法来区分。预验请求可以采用options方法(简称为options请求),用于请求数据的请求可以是通过Ajax发出的请求,称为Ajax请求。Ajax请求可能是跨域请求也可能不是跨域请求。
基于上述,代理装置在拦截到客户端发往服务端的异步请求之后,除了判断该异步请求是不是向服务端请求数据的跨域请求之外,还需要判断该异步请求是不是向服务端发送跨域请求之前对服务端进行跨域规则验证的预验请求。
代理装置具体可以通过对所拦截的异步请求进行解析,获取异步请求中请求方法字段的取值,若该字段的取值为options方法,则确定所拦截的异步请求是预验请求;若该字段的取值为其他方法,则确定所拦截的异步请求是用于请求数据的Ajax请求。
若判断出所拦截的异步请求是向服务端发送跨域请求之前对服务端进行跨域规则验证的预验请求,则生成用于标识服务端支持跨域请求的预验响应,将该预验响应发送给客户端,以供客户端继续向服务端发送跨域请求。
其中,预验请求也会携带请求头,为便于与上述跨域请求头进行区分,将预验请求中的请求头称为跨域验证请求头。具体的,代理装置可以获取异步请求中的跨域验证请求头,根据跨域验证请求头,生成跨域验证响应头,该跨域验证响应头用于标识服务端支持跨域请求,进一步生成携带有跨域验证响应头的预验响应。
跨域验证请求头也可以是access-control-*系列的请求头,例如包括以下字段:
Origin字段:表示当前所在的域;
Access-Control-Request-Method字段:用于询问服务端,允许在请求中使用的方法;
Access-Control-Requeset-Header字段:用于询问服务端,允许在请求中使用的HTTP头信息。
相应的,跨域验证响应头主要是对跨域验证请求头的响应。以跨域验证请求头为access-control-*系列的请求头为例,则跨域验证响应头可以包括以下字段:
Access-Control-Max-Age字段:用于响应预验请求结果的缓存时间;
Access-Control-Allow-Credentials字段:用于响应后续请求是否允许发送cookie;
Access-Control-Allow-Methods字段:用于响应后续请求允许使用的请求方法;
Access-Control-Allow-Headers字段:用于响应后续请求中允许使用的HTTP头字段;
Access-Control-Allow-Origin字段:用于响应该预验请求的域名是否可以被合法跨域。
值得说明的是,access-control-*系列的请求头中的字段名称和意义,可能会随着业界的发展而发生一些变化,甚至是增减;则本申请中的跨域请求中的跨域请求头和预验请求中的跨域验证请求头也会随着发生变化,相应响应头也会发生变化。
若判断出所拦截的异步请求不是向服务端发送跨域请求之前对服务端进行跨域规则验证的预验请求,意味着该异步请求是向服务端请求数据的请求,进一步可以判断该请求是不是向服务端请求数据的跨域请求;若是跨域请求,则将该异步请求发送给服务端,接收服务端返回的异步响应,并根据异步请求中的跨域请求头对异步响应进行更新,获得跨域响应,将跨域响应发送给客户端;若不是跨域请求,则将异步请求发送给服务端,接收服务端返回的异步响应,直接将异步响应返回给客户端。
由上述可见,本实施例通过代理装置对客户端发送给服务端的请求进行处理,拥有了正确响应跨域请求头的能力,使客户端的跨域请求可以正常进行,而服务端与客户端不需要进行任何改造处理,实现成本较低。
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为依据本申请,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本申请所必须的。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
图2为本申请一实施例提供的代理装置的结构示意图。如图2所示,该装置包括:拦截模块21、跨域处理模块22和发送模块23。
拦截模块21,用于拦截由客户端发往服务端的异步请求。
跨域处理模块22,用于在拦截模块21所拦截的异步请求是向服务端请求数据的跨域请求时,将异步请求发送给服务端,接收服务端针对异步请求返回的异步响应,并根据异步请求中的跨域请求头对异步响应进行更新,以获得跨域响应。
发送模块23,用于将跨域处理模块22获得的跨域响应发送给客户端。
在一可选实施方式中,跨域处理模块22具体用于:在异步请求是向服务端请求数据的跨域请求时,将异步请求发送给服务端,接收服务端针对异步请求返回的异步响应,并根据异步请求中的跨域请求头,生成跨域响应头,在异步响应中添加跨域响应头,以获得跨域响应。
在一可选实施方式中,如图3所示,该代理装置还包括:预验处理模块24。
预验处理模块24,用于在拦截模块21所拦截的异步请求是向服务端发送跨域请求之前对服务端进行跨域规则验证的预验请求时,生成用于标识服务端支持跨域请求的预验响应,将预验响应发送给客户端,以供客户端继续向服务端发送跨域请求。
在一可选实施方式中,预验处理模块24具体用于:在异步请求是向服务端发送跨域请求之前对服务端进行跨域规则验证的预验请求时,获取异步请求中的跨域验证请求头,根据跨域验证请求头,生成跨域验证响应头,跨域验证响应头用于标识服务端支持跨域请求,生成携带有跨域验证响应头的预验响应中。
在一可选实施方式中,如图3所示,该代理装置还包括:非跨域处理模块25。
非跨域处理模块25,用于在拦截模块21所拦截的异步请求是向服务端请求数据的非跨域请求时,将异步请求发送给服务端,接收服务端针对异步请求返回的异步响应,将异步响应发送给客户端。
可选的,上述跨域请求可以是Ajax请求;预验请求可以是options请求。
本实施例提供的代理装置,拦截由客户端发往服务端的异步请求,在异步请求是向服务端请求数据的跨域请求时,将异步请求发送给服务端,接收服务端返回的异步响应,并根据异步请求中的跨域请求头对异步响应进行更新,以获得跨域响应,将跨域响应发送给客户端,对客户端来说实现了跨域请求数据,并且不需要对客户端和服务端进行改动,降低了跨域请求数据的成本。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
上述以软件功能单元的形式实现的集成的单元,可以存储在一个计算机可读取存储介质中。上述软件功能单元存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(processor)执行本申请各个实施例所述方法的部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围。