BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java-script / #3789同步于 2018/4/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
JavaScript机器人发帖

【问题】axios+koa2 前端发送请求,怎么让请求携带Cookie

buptzb
2018/4/12镜像同步3 回复
题主目前刚学习 node 以及后端知识。在把之前用 vue 写的 todolist 结合后端代码的时候(登录部分)出现了一些问题。希望论坛的大神们帮忙看看。。 ## 端口 前端 - localhost:8080 后端 - localhost:3000 ## 依赖 ```JavaScript { "kcors": "^2.2.1", "koa": "^2.2.0", "axios": "^0.18.0", "koa-session": "^5.8.1" } ``` ## 前端 vue(methods) ```JavaScript methods: { checkHasLogin () { axios.get('/api/login/hasLogin') .then((res) => { if (res.success) { this.username = res.success.msg console.log('username ok') } else { this.username = '' console.log('username fail') this.$router.replace('/login') } }) .catch((err) => { console.log(err) }) } }, mounted () { console.log('todolist mount') this.checkHasLogin() } ``` ## 前端 axios ```Javascript import axios from 'axios' axios.defaults.baseURL = 'http://localhost:3000' axios.defaults.withCredentials = true axios.defaults.crossDomain = true export default axios ``` ## 后端 app.js ```JavaScript const Koa = require('koa') const app = new Koa() const views = require('koa-views') const json = require('koa-json') const cors = require('kcors') const onerror = require('koa-onerror') const bodyparser = require('koa-bodyparser') const logger = require('koa-logger') const session = require('koa-session') const path = require('path') const index = require('./routes/index') app.keys = ['vue koa todo demo'] const CONFIG = { key: 'koa:todo', maxAge: 86400000, overwrite: true, httpOnly: true, signed: true, rolling: false, renew: false } // error handler onerror(app) // 允许跨域 app.use(cors({ origin: 'http://localhost:8080', credentials: true })) app.use(session(CONFIG, app)) // middlewares app.use(bodyparser({ enableTypes: ['json', 'form', 'text'] })) app.use(json()) app.use(logger()) app.use(require('koa-static')(path.resolve(__dirname, '/public'))) app.use(views(path.resolve(__dirname, '/views'), { extension: 'pug' })) // logger app.use(async (ctx, next) => { const start = new Date() await next() const ms = new Date() - start console.log(`${ctx.method} ${ctx.url} - ${ms}ms`) }) // routes app.use(index.routes(), index.allowedMethods()) // error-handling app.on('error', (err, ctx) => { console.error('server error', err, ctx) }) module.exports = app ``` ## 后端 login.js ```JavaScript const router = require('koa-router')() const User = require('../models/user') const checkLogin = async (ctx, next) => { const { name, pwd } = ctx.request.body const userDoc = await User.findOne({ userId: name }) if (userDoc) { if (userDoc.userPwd === pwd) { // ctx.session = { // userName: userDoc.userId // } console.log('userId', userDoc.userId) ctx.session.userName = userDoc.userId console.log('session userId', ctx.session.userName) ctx.body = { success: true, msg: '' } } else { ctx.body = { success: false, msg: '密码错误' } } } else { ctx.body = { success: false, msg: '用户名不存在' } } } const checkHasLogin = async (ctx, next) => { console.log(ctx.session.userName) if (ctx.session.userName) { ctx.body = { success: true, msg: ctx.session.userName } } else { ctx.body = { success: false, msg: '' } } } router.get('/hasLogin', checkHasLogin) router.post('/', checkLogin) ``` 在输入登录信息后,登录成功后,服务器端返回的响应中可以看见 set-cookie 字段,但是登录成功后前端再次请求的时候并没有携带上 Cookie,而且 Chrome 浏览器的 Application 中也没有 Cookie 信息。正常情况下不是服务器返回 set-cookie 以后,浏览器每次请求都要带上这个存有 session_id 的 Cookie 么(难道是我理解有问题呃)。。。 ## 登录成功的请求和响应头 ```JavaScript Request URL: http://localhost:3000/api/login Request Method: POST Status Code: 200 OK Access-Control-Allow-Credentials: true Access-Control-Allow-Origin: http://localhost:8080 Connection: keep-alive Content-Length: 34 Content-Type: application/json; charset=utf-8 Date: Thu, 12 Apr 2018 05:14:53 GMT Set-Cookie: koa:todo=eyJ1c2VyTmFtZSI6ImFhYSIsIl9leHBpcmUiOjE1MjM1OTY0OTMyOTcsIl9tYXhBZ2UiOjg2NDAwMDAwfQ==; path=/; expires=Fri, 13 Apr 2018 05:14:53 GMT; httponly Set-Cookie: koa:todo.sig=dm-u3i9SqFfHxi4qS44LlLueT9M; path=/; expires=Fri, 13 Apr 2018 05:14:53 GMT; httponly Vary: Origin Accept: application/json, text/plain, */* Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 Connection: keep-alive Content-Length: 26 Content-Type: application/json;charset=UTF-8 Host: localhost:3000 Origin: http://localhost:8080 Referer: http://localhost:8080/ ``` ## 登录成功后验证是否已经登录的请求和响应头 ```JavaScript Request URL: http://localhost:3000/api/login/hasLogin Request Method: GET Status Code: 200 OK Access-Control-Allow-Credentials: true Access-Control-Allow-Origin: http://localhost:8080 Connection: keep-alive Content-Length: 35 Content-Type: application/json; charset=utf-8 Date: Thu, 12 Apr 2018 05:14:54 GMT Vary: Origin Accept: application/json, text/plain, */* Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 Connection: keep-alive Host: localhost:3000 Origin: http://localhost:8080 Referer: http://localhost:8080/ ``` 麻烦各位大神看一哈。。。问题可能有点白,麻烦大家轻喷。。感谢感谢。。[ema23][ema23]
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
raaay0608机器人#1 · 2018/4/12
axios.defaults.withCredentials = true,默认请求携带使用当前网域的cookie。如果想自己管理cookie就自己设置header
buptzb机器人#2 · 2018/4/12
【 在 raaay0608 的大作中提到: 】 : axios.defaults.withCredentials = true,默认请求携带使用当前网域的cookie。如果想自己管理cookie就自己设置header 对呀,我设置了额。。但是并没有带[ema13]
wanbenyu机器人#3 · 2018/4/18
https://segmentfault.com/q/1010000009290635/a-1020000009299366