跨域的原理,就是受同源策略(域名,协议,端口)的影响,本域的js不能操作其它域的页面对象。

跨域资源共享(cors)

1、概述

当一个资源请求一个其他域名或者端口的资源时,会产生跨域http请求。
浏览器会限制脚本发起跨域请求,这是对网站资源的保护。
所以我们需要跨域资源共享规范。即cors(Cross-origin resource sharing)

2、两种请求

跨域将请求分为两种:简单请求 + 非简单请求

2.1 简单请求

简单请求处理:浏览器直接发出跨域共享请求–》在头信息中,增加origin字段,说明请求来源 请求字段:
origin:
说明请求来源
服务器返回字段:
Access-Control-Allow-Origin:
值要么是请求时Origin字段的值,要么是一个*,表示接受任意域名的请求
Access-Control-Allow-Credentials:
是否允许发送Cookie,true or false
Access-Control-Expose-Headers:
允许访问的服务器的头信息的白名单

2.2 非简单请求

非简单请求处理:浏览器先发出预检请求,预检请求带OPTIONS,表达这个请求是询问的。
预检请求字段: Access-Control-Request-Method:
列出浏览器的CORS请求会用到哪些HTTP方法,
Access-Control-Request-Headers:
列出浏览器CORS请求会额外发送的头信息字段,
服务器返回字段:
Access-Control-Allow-Methods:
表示服务器支持的所有跨域请求的方法
Access-Control-Allow-Headers:
表示服务器支持的所有头信息字段
Access-Control-Max-Age:
指定本次预检请求的有效期,单位为秒,在此期间,不用发出另一条预检请求
预检请求通过,则会继续发出和简单请求一样的http请求。
预检请求未通过,请求失败

2.3 带凭证信息的请求

在简单请求中,有是否发送HTTP Cookies和验证信息功能。
请求字段:
withCredentials:ture
允许凭证信息一起发送
服务器返回字段:
Access-Control-Allow-Credentials: true
**特别注意
Access-Control-Allow-Origin
不能为
*,需要设置为该请求网页一致的域名。

跨域的原理,就是受同源策略(域名,协议,端口)的影响,本域的js不能操作其它域的页面对象,然后我们就要解决这个问题。

解决跨域方法之 服务器代理跨域 NODEJS跨域

服务器不受同源策略影响

1.创建express应用程序

var express = require('express');  
var app = express();

2.设置跨域访问相应标头

通过all方法设置所有请求都需要的头信息

app.all('*', function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With");
    res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
    res.header("X-Powered-By", ' 3.2.1')
    res.header("Content-Type", "application/json;charset=utf-8");
}

3.发送请求

采取nodejs request模拟浏览器发起请求

app.all('*', function(req, res, next) {
	option = {
	    url: 'http://KKKK' + req.originalUrl,
	    method: req.method,
	    json: true,
	    body: req.body,
	    headers: {
	        "content-type": "application/json"
	    }
	};
	request(option, function(error, response, body) {
		if (!error && response.statusCode == 200) {
	        res.send(body);
	    }
	}
}

4.监听8081端口,将8081端口的请求发送到 http://KKKK

app.listen(8081);

解决跨域方法之 JSONP 学习

1.概述

json:轻量级的数据交换格式
jsonp:一种使用JSON数据的方式

2.JSONP 原理

HTTP请求虽然受跨域限制,但是Web页面上调用js文件时则不受是否跨域的影响,而且拥有”src”这个属性的标签都拥有跨域的能力。比如 <’script’>、<’img’>、<’iframe’>

于是乎? 如果要进行跨域请求,通过使用html的script标记来进行跨域请求,并在响应中返回要执行的script代码
即在跨域的服务端生成JSON数据,然后包装成script脚本回传,就突破同源策略的限制,实现跨域! 动态创建一个script标签,设置src,将script作为参数返回调用。
客户端代码:

script type="text/javascript"  
    $.ajax({  
        url:"http://crossdomain.com/services.php",  
        dataType:'jsonp',  
        data:'',  
        jsonp:'callback',  
        success:function(result) {  
            for(var i in result) {  
                alert(i+":"+result[i]);//循环输出a:1,b:2,etc.  
            }  
        },  
        timeout:3000  
    });  
/script

var a = 1; console.log(a++); console.log(++a);

解决跨域方法之 nginx 实现跨域

1、概述

nginx 类似于tomcat,可以进行HTTP服务处理,主要作为反向代理服务器使用,Wordpress、GitHub等知名的网站都使用到了Nginx。在这里我们使用nginx作为正向代理。

2、反向代理 VS 正向代理

正向代理:架设在客户机与目标主机之间,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。 反向代理:设在服务器端,此时代理服务器与目标主机一起对外表现为一个服务器。 正向代理代理的对象是客户端,反向代理代理的对象是服务端。

3、使用

安装nginx,修改配置文件

进入nginx目录,cd /usr/local/etc/nginx/
进入conf文件,sudo vim /usr/local/etc/nginx/nginx.conf 修改文件如下

server {
            listen       9999;
            server_name  localhost;


        location /autho-dev/ {
            add_header 'Access-Control-Allow-Origin' 'http://localhost:8080' always;
            add_header 'Access-Control-Allow-Credentials' 'true' always;
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
            add_header 'Access-Control-Allow-Headers' 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With' always;

            if ($request_method = OPTIONS ) {
                return 200;
            }

    #       proxy_pass http://autho.chiq-cloud.com;
            proxy_pass http://10.4.32.70:8080;
        }
    }

然后重启nginx
sido nginx -s reload

4、nginx命令:

启动nginx:sido nginx
关闭nginx:查找当前nginx进程号,然后输入命令:kill -HUP 进程号