跨域产生的原因
当协议、子域名、主域名、端口号中任意一个不相同时,浏览器会将请求视为跨域请求,限制浏览器在不同域之间的资源请求。
对跨域的误解
浏览器在发现跨域请求时,会根据同源策略(Same-Origin Policy)进行限制,不允许直接在浏览器中获取跨域请求的响应数据。这意味着即使服务器正常响应了跨域请求,浏览器也无法将响应数据返回给页面,导致无法在前端使用该数据。
解决方法
在Vue项目中的 /src/main.js
中配置axios实例:
import axios from 'axios'
// 创建 axios 实例
const instance = axios.create({
// 设置基础URL为 '/api'
baseURL: '/api',
// 设置请求超时时间
timeout: 5000,
headers: {
'Content-Type': 'application/json; charset=utf-8'
},
// 发送跨域请求时携带凭据(例如 cookie)
withCredentials: true
})
// 全局注册,之后可在其他组件中通过 this.$axios 发送数据
Vue.prototype.$axios = instance
在Vue项目中的 /config/index.js
中配置
proxyTable: {
'/api': {
// 代理的目标地址,即后端服务器的地址。
target: 'http://127.0.0.1:8443/Spring_Demo_war_exploded/',
// 在代理请求时,将请求头中的 Origin 字段设置为目标地址,以实现跨域请求。
changeOrigin: true,
// 以`/api`开头的路径将被重写为空字符串,即去除`/api`前缀。
pathRewrite: {
'^/api': ''
}
}
}
在Vue组件中请求时
login () {
this.$axios.post('/login', {
username: this.loginForm.username,
password: this.loginForm.password
})
.then(successResponse => {
console.log(successResponse)
})
.catch(failResponse => {
})
}
原理和解释
当浏览器发起跨域请求时,代理服务器充当中间人的角色,将请求转发到目标服务器,并将目标服务器的响应返回给浏览器,实现跨域请求的数据交互。具体的原理如下:
- 前端应用通过配置代理表,将请求的目标地址设置为代理服务器的地址,例如将请求的基础URL设置为
/api
。 - 当浏览器发送请求时,请求会被发送到代理服务器的地址,而不是目标服务器的地址。
- 代理服务器接收到请求后,会将请求转发给目标服务器。
- 目标服务器接收到请求并处理后,生成响应数据。
- 代理服务器将目标服务器的响应返回给浏览器。
- 浏览器接收到响应后,将响应数据返回给前端应用。
通过这种方式,前端应用可以绕过浏览器的同源策略限制,实现与不同域的服务器进行数据交互。代理服务器充当了一个桥梁的作用,实现了跨域请求的中转和转发。
以下是前端与后端交互的一个过程:
- 前端应用发起登录请求:
- 前端代码中的
this.$axios.post('/login', {
username: this.loginForm.username,
password: this.loginForm.password
})
发起 POST 请求到 /login
。
- 由于前端配置了代理表,因此实际请求的地址为
http://localhost:8080/api/login
。
- 请求被代理到后端服务:
- 代理表配置将
/api/login
的请求转发到http://localhost:8443/Spring_Demo_war_exploded/login
。 - 后端服务接收到请求。
- 后端处理请求:
- 后端返回响应: