# 4. CORS 进阶之 cookie 处理
#### 1. Set-Cookie
在这一篇文章[CORS进阶之设置请求头信息(三)](http://www.rails365.net/articles/cors-jin-jie-zhi-she-zhi-qing-qiu-tou-xin-xi-san)中,可以使用CORS来设置自定义的请求头部信息,然而为了安全,默认情况下,浏览器的cookie也是不能作为信息传递给跨域的服务器的。
第一步,要做的是首先浏览器上有cookie。
第一步,是要测试把cookie发送给跨域的服务器。
先来完成第一步,设置cookies。
其实最简单的是通过javascript来设置,不过这里介绍另一种方法:通过响应头信息`Set-Cookie`来处理。
```
add_header 'Set-Cookie' 'name=value';
```
上面表示的是响应一个头部信息叫`Set-Cookie`,浏览器得到它的值就会自动设置cookie信息的,键为`name`,值为`value`。
还是按照之前的例子,从localhost:3000跨域到nginx服务器localhost:8080。
先访问一下localhost:8080这台服务器。
![](https://box.kancloud.cn/09e7b748d8b57cc0154e6ae195b49f4a_1114x447.png)
现在在localhost这个域上就有`name=value`这样的cookie信息了。
接着在localhost:3000上把这个cookie信息跨域发送给localhost:8080这台nginx服务器。
#### 2. Access-Control-Allow-Credentials
要发送带cookie的请求到跨域服务器中,只需要把`withCredentials`设为`true`即可。
```
var xhttp = new XMLHttpRequest();
xhttp.open("GET", "http://localhost:8080", true);
xhttp.withCredentials = true
xhttp.send();
```
效果图如下:
![](https://box.kancloud.cn/1552580915a0227b7ba051c307e00f9d_1304x242.png)
大体的意思是这样,当`Access-Control-Allow-Origin`为`*`时,又把`withCredentials`设为了`true`,那是不被允许的。
我们先把`Access-Control-Allow-Origin`改为localhost:3000这台机器。
```
add_header 'Access-Control-Allow-Origin' 'http://localhost:3000';
```
再重新发送跨域请求。
![](https://box.kancloud.cn/b135e7a64d9ac39bea9a7bafbe1572e4_1306x230.png)
之前`Access-Control-Allow-Origin`为`*`的问题解决了,可是又出现了新的错误:在服务器端`Access-Control-Allow-Credentials`应该被设为`true`。
```
add_header 'Access-Control-Allow-Origin' 'http://localhost:3000';
add_header 'Access-Control-Allow-Credentials' 'true';
```
再重新发起新的域跨请求。
![](https://box.kancloud.cn/06f24133cf6a50b25dfbb0ef73f803cd_663x210.png)
可见,请求是成功的。
但是,服务器能得到那些cookie信息的内容吗?
#### 3. echo指令
在nginx中还是可以轻易获取到cookie的内容的,那就是通过nginx的变量来获得。
`$cookie_XXX`这样的变量就是获取cookie内容,比如`name=value`这样的cookie信息可以通过`$cookie_name`变量获得。
为了验证要在nginx中把cookie的内容打印出来,我们在这里要利用一个模块:[echo-nginx-module](https://github.com/openresty/echo-nginx-module)。
它提供了`echo`指令可以输出变量的内容。
要编译这个模块,可以参照我之前的一篇文章:[nginx之编译第三方模块(六)](http://www.rails365.net/articles/nginx-zhi-bian-yi-di-san-fang-mo-kuai-liu)。
```
add_header 'Access-Control-Allow-Origin' 'http://localhost:3000';
add_header 'Access-Control-Allow-Credentials' 'true';
echo "name = $cookie_name";
```
现在重新发起跨域请求,来看下响应的信息。
![](https://box.kancloud.cn/ff9083b24dad91348e0cbe5894ee6568_736x207.png)
果然,服务器上是能获得cookie的信息的。
完结。
下一篇:[CORS进阶之Expose-Headers(五)](http://www.rails365.net/articles/cors-jin-jie-expose-headers-wu)