126 lines
3.3 KiB
Markdown
126 lines
3.3 KiB
Markdown
---
|
||
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`到后端 |