咱们看下跨域不生效的问题,首先抛出两个问题:html
- 咱们如何设置 cookie ?
- 又如何肯定 cookie 设置是否生效了 ?
首先,咱们实现一个简单的接口,新建一个 test.js 文件,将以下代码复制进去,经过 node test.js
启动服务,在本地就能够经过 http://localhost:3000/rest/collect/event/h5/v1/
来访问了咱们建立的接口了(node 环境安装的教程网上有不少详细的教程,本文再也不赘述)前端
var express = require('express'); var app = express(); var URL = require('url') var path = require('path'); app.post('/rest/collect/event/h5/v1/', function(req, res) { res.cookie('token','11111112222222224444444444') res.cookie('httpOnly-token','11111112222222224444444444',{ httpOnly: true }) function User() { this.name; this.city; this.age; } var user = new User(); if(params.id == '1') { user.name = "ligh"; user.age = "1"; user.city = "北京市"; }else{ user.name = "SPTING"; user.age = "1"; user.city = "杭州市"; } var response = {status:1,data:user}; res.send(JSON.stringify(response)); }); app.listen(3000); console.log('Listening on port 3000...');
访问效果以下node
在前端代码中访问咱们的接口nginx
在浏览器中咱们能够看到请求的 Resopnse Headers 里,有两个 set-cookie
头部,区别在于一个带有 HttpOnly
的标识,咱们打开浏览器的调试窗口Application
咱们能够看到,两个数值都被设置到浏览器里了,httpOnly
的值在浏览器调试窗口的http
一栏,打了个小勾,说明这个变量是只能经过 http 请求来获取到这个cookie ,前端没法经过 js 的 document.cookie
来获取到express
讲到这块内容,咱们顺便讲下 cookie 设置的其余参数的做用跨域
cookie 和域名相关的哟,Domain
变量表示 cookie 生效的域名,expries
和max-age
表示 cookie 的有效时间浏览器
在开发阶段我本身用node 简单的写了一个接口,便于联调前端传参问题,但愿经过 http 的set-cookie 存储变量, 可是却始终没有把 cookie 成功设置到浏览器里,通过排查发现是跨域致使的 cookie 设置不生效cookie
不生效的缘由是我本地项目启动在 http://localhost:70
,可是调用的接口在 http://localhost:3000
上,端口不同,存在跨域的问题,因此虽然在 Response Header 里看到了set-cookie
的操做,可是在浏览器的 application
里看到,并无被设置进来,解决办法,经过nginx 代理(最长用的跨域解决办法)app
跨域的问题在开发过程当中比较常见,咱们常常会碰到,简单来讲只要请求资源的协议,域名,端口不一致,都会致使跨域
,网上的解决方法也比较多,比较成熟,本文不作扩展,附带几个连接供你们参考cors