原理
node中间件实现跨域代理,原理大致与nginx相同,都是通过启一个代理服务器,实现数据的转发,<br><br>也可以通过设置cookieDomainRewrite参数修改响应头中cookie中域名,实现当前域的cookie写入,方便接口登录认证。<br>
http-proxy-middleware<br><br>这里说是可以用于线上<br>以后遇到了再说吧,<br>自己不好尝试线上环境<br>
利用node + express + http-proxy-middleware搭建一个proxy服务器。
配置
前端
var xhr = new XMLHttpRequest();<br><br>// 前端开关:浏览器是否读写cookie<br>xhr.withCredentials = true;<br><br>// 访问http-proxy-middleware代理服务器<br>xhr.open('get', 'http://www.domain1.com:3000/login?user=admin', true);<br>xhr.send();<br>
中间件服务器
var express = require('express');<br><font color="#c41230">var proxy = require('http-proxy-middleware');</font><br>var app = express();<br><br><font color="#c41230">app.use('/', proxy</font>({<br> // 代理跨域目标接口<br><font color="#c41230"><b> target: 'http://www.domain2.com:8080',</b><br><b> changeOrigin: true,</b></font><br><br> // 修改响应头信息,实现跨域并允许带cookie<br><font color="#c41230"> onProxyRes: function(proxyRes, req, res) {<br><b> res.header('Access-Control-Allow-Origin', 'http://www.domain1.com');<br> res.header('Access-Control-Allow-Credentials', 'true');</b><br> },</font><br><br> // 修改响应信息中的cookie域名<br><b><font color="#c41230"> cookieDomainRewrite: 'www.domain1.com' // 可以为false,表示不修改</font></b><br>}));<br><br>app.listen(3000);<br>console.log('Proxy server is listen at port 3000...');<br>
<font color="#c41230">开发环境下的跨域</font><br>
<font color="#c41230">利用node + webpack + webpack-dev-server代理接口跨域。</font><br><br>在开发环境下,由于vue渲染服务和接口代理服务都是webpack-dev-server同一个,<br>所以页面与代理接口之间不再跨域,无须设置headers跨域信息了。<br>
webpack.config.js部分配置:<br><br>module.exports = {<br> entry: {},<br> module: {},<br> ...<br> devServer: {<br> historyApiFallback: true,<br><b><font color="#c41230"> proxy: [{<br> context: '/login',<br> target: 'http://www.domain2.com:8080', // 代理跨域目标接口<br> changeOrigin: true,<br> secure: false, // 当代理某些https服务报错时用<br> cookieDomainRewrite: 'www.domain1.com' // 可以为false,表示不修改<br> }],</font></b><br> noInfo: true<br> }<br>}<br>