先後端分離的開發先後端, 前端使用的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) }) }