14.2 跨域 - cors

index.html

document.cookie = 'name=cookieZxp'
fetch('http://localhost:4000/getData', {
  method: 'PUT',
  headers: {
    'name': 'zxp'
  },
  credentials: 'include' // 跨域请求携带cookie,需开启此凭证
})
.then(res => {
  console.log(res.headers.get('name'), 'x1'); //application/json
  return res.text()
})
.then(res => {
  console.log(res)
})

 

后端

server1.js

let express = require('express')
let app  = express()
app.use(express.static(__dirname))  // index.html
app.listen(3000)

 

server2.js

const app  = express()
const whileList = ['http://localhost:3000'] // 白名单
app.use((req, res, next) => {
  let origin = req.headers.origin;
  if (whileList.includes(origin)) {
    res.setHeader('Access-Control-Allow-Origin', origin)  // 设置允许跨域的源 这里origin是http://localhost:3000  *表示域可以访问,不能和Access-Control-Allow-Credentials共用(设置哪个源可以访问我)
    res.setHeader('Access-Control-Allow-Headers', 'name') // 前端设置header头,后端需同步设置。(允许携带哪个头访问我)
    res.setHeader('Access-Control-Allow-Methods', 'PUT')  // 不设置 默认支持get、post、head(允许哪个方法访问我)
    res.setHeader('Access-Control-Allow-Credentials', true) // (允许携带cookie)
    res.setHeader('Access-Control-Max-Age', 6)  // 预请求的返回结构被缓存的时间 (预检的存活时间)
    res.setHeader('Access-Control-Expose-Headers', 'name') // 参考 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Access-Control-Expose-Headers  (允许前端获取哪个头)
    if (req.method === 'OPTIONS') {
      res.end() // OPTIONS请求不做任何处理 (Request Method:OPTIONS)
    }
  }
  next()
})
app.put('/getData', (req, res) => {
  console.log(req.headers)  // 因为设置了Credentials,这里能拿到cookie
  res.setHeader('name', 'zxp2') // 这里的zxp2浏览器Response Headers里能拿到
  res.end('我不爱你')
})
app.get('/getData', (req, res) => {
  console.log(req.headers)
  res.end('我不爱你')
})
app.listen(4000)

 

posted @ 2019-02-01 16:42  Sampson1207  阅读(125)  评论(0编辑  收藏  举报