VUE访问接口的时候,很可能出现跨域请求,从而被提供接口的服务器拒绝,下面这篇文章主要给大家介绍了关于Vue如何解决跨域问题的相关资料,需要的朋友可以参考下
什么是跨域
跨域指浏览器不允许当前页面的所在的源去请求另一个源的数据。源指协议,端口,域名。只要这个3个中有一个不同就是跨域。 这里列举一个经典的列子:
#协议跨域
http://a.baidu.com访问https://a.baidu.com;
#端口跨域
http://a.baidu.com:8080访问http://a.baidu.com:80;
#域名跨域
http://a.baidu.com访问http://b.baidu.com;
通常在不同服务器访问过程中可能会遇到跨域问题,也就是口头上常说的策略同源问题 CORS
出现跨越一般就是判断三个地方,http协议,请求地址,端口号,三者若有一处不相同,那么就会出现跨域,解决这个问题就要配置一个代理服务器,通过代理服务器实现跨域请求
问题代码
前端代码
使用了Vue Admin Template
# just a flag
ENV = 'development'
# base api
VUE_APP_BASE_API = 'http://localhost:8201'
远程访问后端的地址为:
http://localhost:8201
前端地址为:
http://localhost:9528
请求的URI的地址
import request from '@/utils/request'
export function login(data) {
return request({
url: '/admin/user/login',
method: 'post',
data
})
}
export function getInfo(token) {
return request({
url: '/admin/user/info',
method: 'get',
params: { token }
})
}
export function logout() {
return request({
url: '/admin/user/logout',
method: 'post'
})
}
后端代码
@RestController
@RequestMapping("/admin/user")
@Slf4j
public class UserController {
@PostMapping("/login")
public R login(@RequestBody Map<String, Object> map) {
// 查询数据库
log.info(map.toString());
return R.ok().data("token", "admin-token");
}
@GetMapping("/info")
public R info(@RequestBody Map<String, Object> map) {
// 查询数据库
log.info(map.toString());
return R.ok()
.data("roles", "[admin]")
.data("introduction", "I am a super administrator")
.data("avatar", "https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif")
.data("name", "Super Admin");
}
}
问题复现
问题分析
看到这个状态码CORS error可以知道这是跨域访问出错,当然这个状态码也不是绝对的,也有可能是后端接口出了问题。
以前是前端和后端是一个项目,所以才没遇到这个问题。
跨域问题:当前端使用 axios给后端发送远程异步请求的时候,会遇到跨域问题!
要求后端和前端要保持ip【域名】、port、协议一致。前端和后端只要这三个有一个不一致就会有跨域问题。
解决方案
全局解决方案:
gateway,以后有空的时候完善一下这块解决方案,现在只是提一下这个方法。
局部解决方案:
只需要在后端的controller类上写@CrossOrigin注解就可以
@RestController
@RequestMapping("/admin/user")
@Slf4j
@CrossOrigin
public class UserController {
@PostMapping("/login")
public R login(@RequestBody Map<String, Object> map) {
// 查询数据库
log.info(map.toString());
return R.ok().data("token", "admin-token");
}
@GetMapping("/info")
public R info(@RequestBody Map<String, Object> map) {
// 查询数据库
log.info(map.toString());
return R.ok()
.data("roles", "[admin]")
.data("introduction", "I am a super administrator")
.data("avatar", "https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif")
.data("name", "Super Admin");
}
}