闲着没事打算把老的后台系统用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 }