解决跨域的常用方案

一、 什么是跨域?

跨域是指一个域下的文档或脚本试图去请求另一个域下的资源

二、什么是同源策略?

同源策略/SOP(Same origin policy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。

三、跨域解决方案

1、 通过jsonp跨域
2、 document.domain + iframe跨域
3、 location.hash + iframe
4、 window.name + iframe跨域
5、 postMessage跨域
6、 跨域资源共享(CORS)
7、 nginx代理跨域
8、 nodejs中间件代理跨域
9、 WebSocket协议跨域

四、常用跨域解析(都需要服务端配合)

  1. 通过jsonp跨域

响应头添加Header允许访问
跨域资源共享(CORS)Cross-Origin Resource Sharing

这个跨域访问的解决方案的安全基础是基于"JavaScript无法控制该HTTP头"

它需要通过目标域返回的HTTP头来授权是否允许跨域访问。

response.addHeader(‘Access-Control-Allow-Origin:*’);//允许所有来源访问
response.addHeader(‘Access-Control-Allow-Method:POST,GET’);//允许访问的方式

  1. jsonp 只支持get请求不支持post请求

jsonp 跨域的原理就是用的动态加载 script 标签的src ,所以我们只能把参数通过url的方式传递,所以jsonp的 type类型只能是get !

用法:①dataType改为jsonp
②jsonp : “jsonpCallback”————发送到后端实际为http://a.a.com/a/FromServlet?userName=644064&jsonpCallback=jQueryxxx
③后端获取get请求中的jsonpCallback
④构造回调结构

$.ajax({
   type : "GET",
   async : false,
   url : "http://a.a.com/a/FromServlet?userName=644064",
   dataType : "jsonp",//数据类型为jsonp
   jsonp : "jsonpCallback",//服务端用于接收callback调用的function名的参数
   success : function(data) {
   alert(data["userName"]);
},
error : function() {
   alert('fail');
   }
});

其实jquery 内部会转化成

http://192.168.10.46/demo/test.jsp?jsonpCallback=jQuery202003573935762227615_1402643146875&action=aaron

然后动态加载

然后后端就会执行jsonpCallback(传递参数 ),把数据通过实参的形式发送出去。

使用JSONP 模式来请求数据的整个流程:客户端发送一个请求,规定一个可执行的函数名(这里就是 jQuery做了封装的处理,自动帮你生成回调函数并把数据取出来供success属性方法来调用,而不是传递的一个回调句柄),服务器端接受了这个 jsonpCallback函数名,然后把数据通过实参的形式发送出去

  1. httpClient内部转发
    实现原理很简单,若想在B站点中通过Ajax访问A站点获取结果,固然有ajax跨域问题,但在B站点中访问B站点获取结果,不存在跨域问题,这种方式实际上是在B站点中ajax请求访问B站点的HttpClient,再通过HttpClient转发请求获取A站点的数据结果。但这种方式产生了两次请求,效率低,但内部请求,抓包工具无法分析,安全

  2. 使用nginx搭建企业级接口网关方式

我们访问以www.nginxtest.com开头且端口为80的网址,nginx将会进行拦截匹配,若项目名为A,则分发到a.a.com:81。实际上就是通过"同源"的域名,不同的项目名进行区分,通过nginx拦截匹配,转发到对应的网址。整个过程,两次请求,第一次请求nginx服务器,第二次nginx服务器通过拦截匹配分发到对应的网址。

猜你喜欢

转载自blog.csdn.net/qq_39490750/article/details/114023595