meface/docs/article/web/js/axios.md

126 lines
3.3 KiB
Markdown
Raw Normal View History

2023-11-17 10:54:23 +08:00
---
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<String,Object> 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 `,请求数据的格式如下:
<img src="../images/asioxdefaultcontenttype.png" alt="1613976940640" style="zoom: 80%;" />
#### 问题分析:
发送`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`到后端