使用axios和webpack-dev-server时无法从后台获取cookie

    闲着没事打算把老的后台系统用vue撸一遍。用的是quasar框架,ajax用axios,还配置了webpack-dev-server的proxy作为代理服务器。

    刚上手做了个登录页面就出问题了。老的后台是使用session配合cookie做登录验证的,但我用axios发送的登录请求的响应头没有set-cookie。用chrome的开发者工具查看了下请求,发现post请求的参数是request payload(json的数据格式)的形式发送的,而老系统的参数form data(url的参数格式,例子:name=value&name1=value1)的形式。

    所以需要修改post请求的参数形式,axios的方法如下

import axios from 'axios'
import Qs from 'qs'//引入axios自带的qs(不需要额外安装)

...

let config = {
  headers: {
    'Content-Type':'application/x-www-form-urlencoded' //设置请求头位Content-Type为application/x-www-form-urlencoded
  }
}

let data = {
  user_name: 'allen',
  password: '123456'
}

axios.post('/login',Qs.stringify(data),config).then(...)//用QS.stringify方法将javascript对象编码成url的参数格式

    修改后的请求还是无法获得cookie,于是继续用chrome的开发工具继续查看请求信息。发现老系统还多了一个请求头:'X-Requested-With':'XMLHttpRequest'。添加这个请求头并设置config的withCredentials为true之后就能获得cookie了。原来后台有一段代码通过X-Requested-With来判断该请求是不是ajax请求,如果是ajax才会进入下一步。withCredentials设为true是为了让axios发送的请求带上cookie。

    为了方便使用,我将这些配置写到axios的实例中,这样就不需要每次都写config了。以下是quasar添加插件的写法:

import axios from 'axios'
import Qs from 'qs'

export default ({ app, router, Vue }) => {
  let axios_instance=axios.create({
        transformRequest: [function (data) {
            data = Qs.stringify(data);
            return data;
        }],
        headers:{
          'Content-Type':'application/x-www-form-urlencoded',
          'X-Requested-With':'XMLHttpRequest'
        },
        withCredentials: true
    })
  Vue.prototype.$axios = axios_instance
}


猜你喜欢

转载自blog.csdn.net/qq_36391954/article/details/79971553