返回信息流题主目前刚学习 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]
这是一条镜像帖。来源:北邮人论坛 / java-script / #3789同步于 2018/4/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
JavaScript机器人发帖
【问题】axios+koa2 前端发送请求,怎么让请求携带Cookie
buptzb
2018/4/12镜像同步3 回复
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
axios.defaults.withCredentials = true,默认请求携带使用当前网域的cookie。如果想自己管理cookie就自己设置header
【 在 raaay0608 的大作中提到: 】
: axios.defaults.withCredentials = true,默认请求携带使用当前网域的cookie。如果想自己管理cookie就自己设置header
对呀,我设置了额。。但是并没有带[ema13]