先后端分离的开发先后端, 前端使用的vue,后端的安全模块使用的SpringSecurity,使用postman测试后端的权限接口时发现都正常,可是使用vue+axios发送异步的请求后端一直获取不出axios提交的form表单的数据,爬坑两个半钟头找到了答案前端
axios用post异步形式提交的数据和咱们直接使用from表单提交的数据的格式(Form Data格式)是不同的,在下面列举vue
Request Payload
直接使用axios发送异步请求,没任何处理的代码以下:ios
const service = axios.create({}) doLogin (pojo) { return request({ url: '/api/user/login', method: 'post', data: pojo })
这种方式提交的表单格式是默认是RequestPayload, 它的长下面这个样子npm
能够看到,它的Contet-type是 "Content-Type": "application/json;"
可是后台的SpringSecurity对这种结果可不买单,在Request中解析不出任何数据来json
使用插件qs, 安装命令以下:axios
npm install --save qs
请求编码:后端
const service = axios.create({}) doLogin (pojo) { return request({ url: '/api/user/login', method: 'post', data: qs.stringify(pojo) }) } 或者 doLogin (pojo) { return request({ url: '/api/user/login', method: 'post', data: pojo , transformRequest: [function (data) { data = qs.stringify(data); return data; }], }) }
通过这样处理的表单数据长成下面的这样, 这也是咱们最经常使用的Form Data格式,这种格式的数据能够从后台的HttpRequest中把提交的属性解析出来api
const service = axios.create({ headers: { "Content-Type": "multipart/form-data; charset=utf-8;" } }) doLogin (pojo) { return request({ url: '/api/user/login', method: 'post', data: qs.stringify(pojo) }) }
它长这样
安全
const service = axios.create({ headers: { "Content-Type": "multipart/form-data; charset=utf-8;" } }) doLogin (pojo) { return request({ url: '/api/user/login', method: 'post', data: pojo }) } ---
const service = axios.create({ headers: { "Content-Type": "multipart/form-data; charset=utf-8;" } }) doLogin (pojo) { return request({ url: '/api/user/login', method: 'post', data:pojo }) }
const service = axios.create({ headers: { "Content-Type": "application/x-www-form-urlencoded; charset=utf-8;" } }) doLogin (pojo) { return request({ url: '/api/user/login', method: 'post', data: qs.stringify(pojo) }) }