首先,跨域问题的是如何产生的:浏览器的同源策略 (服务器可以不遵守)。
请求方式为XHR时,如果客户端和服务端之间满足三个条件中的任意一个都会产生跨域:
1.协议不同;2.域名不同;3.端口不同
只有协议、域名、端口都相同时才符合同源策略。
项目上线部署之后如果满足同源策略是不会产生跨域问题的,但是在前后端分离的主流模式下,开发时就一定会碰见跨域问题,利用dev-server解决跨域的原理:将所有ajax请求发送给devServer服务器,再由devServer服务器做一次转发,发送给服务器,由于ajax请求是发送给devServer服务器的,所以不存在跨域,而devServer由于是用node平台发送的http请求,自然也不涉及到跨域问题。借助这一特性,我们可以进行代理转发,利用 node 监听 web 服务器开启的端口,并进行代理转发;
在vue.config.js文件中配置devserver实现跨域的详解:
假设主机名为 localhost:8080 , 需要请求 API 的 url 是 http://192.168.2.3:8080/user/list
将'/api'设置为:http://192.168.2.3:8080, 那么在具体定义api的时候需要将api拼接成:'baseurl(http://localhost:8080)/api/user/list',通过devserver代理为(http://192.168.2.3:8080/user/list)
原因是不做任何处理时url是http://localhost:8080/user/list
proxy设置'/api'后代表对路径为/api开头的api做代理转发,那么需要首先在拼接url时拼上/api,即http://localhost:8080/api/user/list
然后代理主机名及端口(或者域名)http://localhost:8080/api/user/list 代理为 http://192.168.2.3:8080/api/user/list
但是多了/api,这不是理想的url,所以通过pathRewrite,将'/api'重写为'',url最终为http://192.168.2.3:8080/user/list
最终在封装http请求之后,将'/api'拼在path前面,即可实现跨域访问。
还有一个问题就是,现在后端基本都用微服务,或许不同模块,服务器会启用不同的端口,那么前端只配置单个字符串开头的代理便不够用了,
例如服务器还是192.168.2.3这个ip,但是用户模块服务端口为8080,角色模块服务端口为8081,这时就可以配置两个以解决模块化的问题。