vue 跨域简记

0.服务端设置

app.use(function(req, res, next){
    //设置跨域访问
    res.header(‘Access-Control-Allow-Origin‘, ‘*‘);
    res.header(‘Access-Control-Allow-Headers‘, ‘Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild‘);
    res.header(‘Access-Control-Allow-Methods‘, ‘PUT, POST, GET, DELETE, OPTIONS‘);

    if (req.method == ‘OPTIONS‘) {
        res.send(200); /*让options请求快速返回*/
    }else {
        next();
    }
})

1.axios

axios中只能使用get和post方法来进行请求数据,没有提供jsonp等方法

配置一个代理的服务器可以请求另一个服务器中的数据,然后把请求出来的数据返回到我们的代理服务器中,代理服务器再返回数据给我们的客户端,这样我们就可以实现跨域访问数据

1) 安装所需中间件和插件等,比如axios,http-proxy-middleware

2) 配置BaseUrl

在main.js中,配置数据所在服务器的前缀(即固定部分):

// 项目入口,配置全局vue
import Vue from ‘vue‘
import VueRouter from ‘./router/routes.js‘
import Store from ‘./store/index.js‘

import ‘./assets/less/index.less‘
import App from ‘./App.vue‘

import ElementUI from ‘element-ui‘
import ‘element-ui/lib/theme-default/index.css‘

import axios from ‘axios‘
Vue.prototype.$axios = axios
axios.defaults.baseURL = ‘/api‘  //关键代码
Vue.config.productionTip = false

Vue.use(ElementUI);

new Vue({
    router:VueRouter,
    store:Store,
    template:‘<App/>‘,
    components: {App}
}).$mount(‘#app‘)

关键代码:axios.defaults.baseURL = ‘/api‘,作用是我们每次发送的请求都会带一个/api的前缀。

3) 配置代理

在config文件夹下的index.js文件中的proxyTable字段中,作如下处理:

dev: {
    env: require(‘./dev.env‘),
    port: 8090,
    autoOpenBrowser: true,
    assetsSubDirectory: ‘static‘,
    assetsPublicPath: ‘/‘,
    proxyTable: {
      ‘/api‘: {
        target:‘http://api.douban.com/v2‘, // 你请求的第三方接口
        changeOrigin:true, // 在本地会创建一个虚拟服务端,然后发送请求的数据,并同时接收请求的数据,这样服务端和服务端进行数据的交互就不会有跨域问题
        pathRewrite:{  // 路径重写,
          ‘^/api‘: ‘‘  // 替换target中的请求地址,也就是说以后你在请求http://api.douban.com/v2/XXXXX这个地址的时候直接写成/api即可。
        }
      }
    },
    // CSS Sourcemaps off by default because relative paths are "buggy"
    // with this option, according to the CSS-Loader README
    // (https://github.com/webpack/css-loader#sourcemaps)
    // In our experience, they generally work as expected,
    // just be aware of this issue when enabling this option.
    cssSourceMap: false
  }

4) 在具体使用axios的地方,修改url如下即可:

axios.get("/movie/top250").then((res) => {
                  res = res.data
                  if (res.errno === ERR_OK) {
                     this.themeList=res.data;
                  }
                }).catch((error) => {
                  console.warn(error)
                })
原文链接:https://blog.csdn.net/wh_xmy/article/details/87705840//原请求地址:http://api.douban.com/v2/movie/top250

因为我们给url加上了前缀/api,我们访问/movie/top250就当于访问了:localhost:8080/api/movie/top250(其中localhost:8080是默认的IP和端口)。

在index.js中的proxyTable中拦截了/api,并把/api及其前面的所有替换成了target中的内容,因此实际访问Url是http://api.douban.com/v2/movie/top250。

5) 打包部署时,在config文件夹里面创建一个api.config.js的配置文件:

let serverUrl = ‘/api/‘  //本地调试时
// let serverUrl = ‘http://api.douban.com/v2/‘ //打包部署上线时  export default { dataUrl: serverUrl }

或者:

const isPro = Object.is(process.env.NODE_ENV, ‘production‘)

console.log(isPro);

module.exports = {
  baseUrl: isPro ? ‘http://api.douban.com/v2/‘ : ‘api/‘ }

6) 在main.js文件里面引入上面文件,这样就可以保证动态的匹配生产和开发环境的定义前缀了:

import Vue from ‘vue‘
import App from ‘./App‘
import router from ‘./router‘
import ‘bootstrap/dist/js/bootstrap.min‘
import ‘bootstrap/dist/css/bootstrap.min.css‘
import axios from ‘axios‘
import apiConfig from ‘../config/api.config‘

Vue.prototype.$axios = axios;
Vue.config.productionTip = false;
axios.defaults.baseURL = apiConfig.baseUrl;// 配置接口地址
axios.defaults.withCredentials = false;

2.jsonp

0) 原理:动态创建script标签,利用script标签的src属性可以获取任何域下的js脚本,通过这个特性(也可以说漏洞),服务器端不再返回json格式,而是返回一段调用某个函数的js代码,在src中进行了调用,这样实现了跨域。

核心是动态添加。自动帮你生成回调函数并把数据取出来供success属性方法来调用。

在所处的页面逻辑里写好一个函数,函数名与远程的js文件中的函数名一致。通过script的src属性访问远程js,并调用该函数,同时将需要的数据作为参数传过来,于是实现了跨域。

1) 执行命令:npm install vue-jsonp --save;

2) 添加到main.js中

import VueJsonp from ‘vue-jsonp‘

3) 使用

this.$jsonp(‘xxx.js‘,jsonParam).then(popData=>{
    if(popData){//返回的数据格式为json
        ...
    }
})

3.杂记

浏览器的同源策略拒绝跨域存取cookie

jsonp形式可默认携带浏览器cookie:

可以此根据cookie进行默认登录:

第三方扫码后跳转直接登录:

window.open(onemapUrlConfig.authLink + ‘/oauth_client/weixin/login?next=‘+onemapUrlConfig.siteLink);

原文地址:https://www.cnblogs.com/xulei1992/p/12039141.html

时间: 2024-09-29 03:34:24

vue 跨域简记的相关文章

c# vue 跨域get post cookie等问题

背景介绍: 开发微信公共号时前后端分离,后台用C#开发,前端使用vue框架,数据采用axios传输 具体问题: 1:前后端分离造成的跨域访问问题 2:跨域后cookie传输和设置问题 解决方案: 1:使用jsonp作为数据传输的方式,前端和后端配合解决跨域问题 2:通过设置webconfig配合axios.js解决cookie传输(get.set) 具体方案: 问题一: 1:controller /// <summary> /// get /// </summary> /// &l

vue跨域解决方法 及设置api路径方法

vue项目中,前端与后台进行数据请求或者提交的时候,如果后台没有设置跨域,前端本地调试代码的时候就会报"No 'Access-Control-Allow-Origin' header is present on the requested resource." 这种跨域错误. 要想本地正常的调试,解决的办法有三个: 一.后台更改header 1 2 header('Access-Control-Allow-Origin:*');//允许所有来源访问 header('Access-Con

解决vue跨域axios异步通信

在项目中,常常需要从后端获取数据内容.特别是在前后端分离的时候,前端进行了工程化部署,跨域请求成了一个前端必备的技能点.好在解决方案很多. 在vue中,在开发中,当前使用较多的是axios进行跨域请求数据,但不少人遇到如下问题: 异步通信,无法同步执行 无法集中管理 不便阅读 还未请求成功就调转了 then里面的逻辑越来越繁杂 以往的网络请求的写法如下: // main.js // 引入axios import axios from 'axios' Vue.prototype.$axios =

vue跨域配制

(第一种方法) 在config文件夹下的index.js中配制 proxyTable: { '/api': { //使用"/api"来代替"http://f.apiplus.c" target: 'http://127.0.0.1:8000/', //源地址 changeOrigin: true, //改变源 pathRewrite: { '^/api': '' //路径重写 } } } (第二种方法) 用Django的第三方包 django-cors-header

Spring Boot + Vue 跨域请求问题

使用Spring Boot + Vue 做前后端分离项目搭建,实现登录时,出现跨域请求 Access to XMLHttpRequest at 'http://localhost/open/login' from origin 'http://localhost:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. V

php &amp; vue 跨域问题解决方案

方案1:在服务端配置指定的域名 (注:在vue中无需设置:'Access-Control-Allow-Origin'如果为*则依然会报错,必须得是指定的域名) /** * 设置能访问的域名 * * @var array */ static public $originarr = [ 'http://lc.vue.com:82', // 前端本地测试域名 'http://127.0.0.1:82', // 前端本地测试域名 'http://localhost:8066', // 前端本地测试域名

vue跨域的问题,在开发环境下

找到config文件夹下的index.js proxyTable: { '/api': { target: 'http://访问网址/', //设置调用接口域名和端口号别忘了加http changeOrigin: true,//允许跨域 pathRewrite: { '^/api': 'http://访问网址/' //这里理解成用'/api'代替target里面的地址,组件中我们调接口时直接用/api代替 // 比如我要调用'http://0.0:300/user/add',直接写'/api/u

4.Vue跨域session问题解决

1.设置koa2服务器从本地代理转发修改:项目/config/index.js-->dev中proxyTable: { '/api': { target: 'http://localhost:3000', changeOrigin: true, pathRewrite: { //需要rewrite重写的, 如果在服务器端做了处理则可以不要这段 '^/api/': '' } } }, //--------------------------------------------------dev:

vue跨域处理(vue项目中baseUrl设置问题)

1.开发环境: 2.生产环境: 然后 const instance = axios.create({ baseURL: process.env.API }) 原文地址:https://www.cnblogs.com/jiorence/p/11068730.html