--- title: 使用axios问题小结 date: 2021-02-22 author: ac tags: - axios categories: - Web --- ### 问题一:axios发送post请求,后端使用HttpServletRequest接受不到参数 #### 问题场景: 前端发送`post` 请求: ```javascript axios({ url: this.serverUrl + "/login/checkUser", data: { 'name':'张思瑞', 'password': '333', 'validate': 'haha' }, method: "post" }).then((response) => { console.log(response); }); ``` 后端使用`springMVC`接收: ```java @RequestMapping("/login/checkUser") @ResponseBody public Map checkUser(HttpServletRequest request){ String userName = request.getParameter("name"); String password = request.getParameter("password"); String validate = request.getParameter("validate"); ... } ``` 接口可以调通,但是`request`中找不到传送过来的数据。查看请求头发现`Content-Type`是` application/json;charset=UTF-8 `,请求数据的格式如下: 1613976940640 #### 问题分析: 发送`Post`请求,参数都是在请求正文中传递到服务端。 但`axios`会自动转换请求头和响应头数据。经过查阅网上资料发现,不管是下面哪种方式: ```javascript //方式一 axios({ url: this.serverUrl + "/login/checkUser", data: { 'name':'张思瑞', 'password': '333', 'validate': 'haha' }, method: "post" }) //方式二 axios.post(this.serverUrl + "/login/checkUser",{ 'name':'张思瑞', 'password': '333', 'validate': 'haha' }) ``` 发送`post`请求都会进入`axios`中的`transformRequest`中的`isObject(data)`代码块中: ```javascript transformRequest: [function transformRequest(data, headers) { normalizeHeaderName(headers, 'Content-Type'); if (utils.isFormData(data) || utils.isArrayBuffer(data) || utils.isBuffer(data) || utils.isStream(data) || utils.isFile(data) || utils.isBlob(data) ) { return data; } if (utils.isArrayBufferView(data)) { return data.buffer; } if (utils.isURLSearchParams(data)) { setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8'); return data.toString(); } if (utils.isObject(data)) { setContentTypeIfUnset(headers, 'application/json;charset=utf-8'); return JSON.stringify(data); } return data; }], ``` 也就是说,使用上述的方式发送`post`请求,`Content-Type`都会变成`application/json;charset=utf-8`。但在全局的`axios`默认值中, ```javascript axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; ``` ### 问题二:`axios`访问服务器`Session`丢失问题 #### 问题场景: 之前在做一个`vue`项目的时候,需要用到验证码,所以将生成的验证码保存在后端的`session`中,当用户提交表单时,再从`session`中取出来进行校验。但出现了访问不到`session`数据的问题。 #### 问题分析: 开发环境中前后端分离端口号不同导致跨域问题,因为跨域请求时,每次`ajax`请求都是新的`session`,导致无法获取验证码信息。 #### 解决方法: 每次`axios`发起跨域类型请求时必须要带上`cookie`到后端