vue项目跨域问题

跨域

了解同源政策:所谓"同源"指的是"三个相同"。

  • 协议相同
  • 域名相同
  • 端口相同

解决跨域

  1. jsonp 缺点:只能get请求 ,需要修改B网站的代码
  2. cors 这个方案缺点 是 ie6 7 兼容不好(倒是不见得要兼容)。需要B网站在响应中加头
  3. postMessage 缺点也是 ie6 7 兼容不好(倒是不见得要兼容)。需要修改B网站的代码
  4. iframe window.name 传值得方式很巧妙,兼容性也很好。但是也是需要你能修改B网站代码
  5. 服务端主动请求B网站,兼容性好而且你客户端的代码还是原来的ajax,缺点是感觉不好。(服务器端是不存在跨域安全限制的)
  6. 类似5 用nginx把B网站的数据url反向代理。

node, express 解决跨域

  • 加上请求头:

1 app.all(‘*‘, (req, res, next)=>{
2     res.header("Access-Control-Allow-Origin", "*");
3     res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With");
4     res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
5     res.header("X-Powered-By",‘ 3.2.1‘)
6
7     if(req.method=="OPTIONS") res.send(200);/*让options请求快速返回*/
8     else next();
9 });

重点说一下vue-cli处理跨域

  • 前后端分离的项目,常常开发的时候,请求的接口地址存在跨域问题
  • webpack 前后端分离开发接口调试解决方案,proxyTable解决方案
  • 首先要在项目目录中找到根目录下config文件夹下的index.js文件。由于我们是在开发环境下使用,自然而然是要配置在dev里面:

 1 port: 8080,
 2 proxyTable: {
 3   ‘/api‘: {
 4     target: ‘http://www.ainyi.com‘,  // 目标接口域名
 5     changeOrigin: true,  // 是否跨域
 6     // secure: false,  // 如果是https接口,需要配置这个参数
 7     pathRewrite: {
 8       ‘^/api‘: ‘‘   // 重写接口,一般不更改
 9     }
10   },
11 },

  • ‘/api‘ 为匹配项,target 为被请求的地址
  • 以上代码表示:只要是http://www.ainyi.com/api的接口,都将被本地8080端口的请求代理:

    http://localhost:8080/api ===> http://www.ainyi.com/api

  • 也就是说,想请求接口http://www.ainyi.com/api,就是通过http://localhost:8080/api代理访问,就不会产生跨域。
  • 这样就不需要在axios配置axios.defaults.baseURL,所有接口都由本地代理了。

  

描述问题

项目中表格需要一些数据,于是前端自己写好了一个json文件,自己模拟后端请求接口,然后封装api,在自己的页面请求数据

封装api在部署时遇到的跨域问题

项目一般都分三种环境,开发测试生产,三个环境的ip或者域名是不一样的。这就需要咱们走不同的ip,之前是结合vue+webpack打包,配置哪个环境走哪个IP下面。第一次是部署到ip下面,我就把ip写成和地址栏一样的ip就不存在跨域问题了,相当于是在一个IP下,但是后端将ip重写为域名后又发生了跨域问题,一个ip对应四个域名,之前的方法自然不能采用,于是就把ip干掉,让他都走浏览器的当前域名就可以了。获取方法是var domain = document.domain;

json文件的写法和存放

{
    "jobs": [{
        "id": 1,
        "name": "保险合伙人团队负责人",
        "experience": "1年",
        "number": "2人",
        "duty": [
             "组建并管理金融营销团队,负责员工的招聘、培训以及业务目标的设定与达成。",
             "负责为高端个人客户和企业客户提供全方位理财咨询、建议服务,并制定相应的金融产品组合和投资理财策略。",
             "通过与客户沟通,了解客户的理财需求,为客户进行测算并量身定制理财方案,达到客户满意。",
             "根据客户的委托,帮助客户实施并签订(信托、证券、银行、保险)等理财产品的购买计划,完成并实施客户的理财需求。",
             "负责对公司综合金融理财产品的全力宣传、推广、销售。",
             "负责与公司原有的重要贵宾级客户保持良好的关系,通过与客户沟通,及时了解客户需求并调整客户的财务安排,减少客户流失。 ",
             "建立和扩展客户网络,以探索新的业务机遇。",
             "加强客户服务意识,成功发展客户的介绍来源,拓展客户渠道。",
             "通过交叉销售、客户推荐、主动升级销售、个人业务关系等方式,获得新客户和拓展新的业务。"
        ],
        "status": [
            "25岁-45岁,本科及以上学历 (3年以上工作经验可大专学历)",
            "具有一定的金融基础知识;",
            "具有广泛的高端客户资源和金融营销经验;",
            "具有较强的沟通能力和客户开发能力;",
            "具有很强的工作责任心和良好的人际关系;",
            "具有较强的团队合作精神,能承受一定的工作压力。",
            "热爱金融销售工作,具备职业经理人形象,阳光、开朗、有激情,有朝气;有韧性;",
            "有清晰的职业生涯规划,目标明确,勇于挑战自我,不甘平庸,追求高品质生活,渴望成功。",
            "具备信托、证券、银行、保险、第三方理财机构等经验优先!",
            "具备房地产、医疗、高尔夫、高端会所、会籍顾问等经验优先!"
        ],
        "pay": [
            "公司为员工提供完善优厚有竞争力的薪酬福利,多元化的收入来源(多达30项)上不封顶.。",
            "初级销售经理年薪在10万-30万,",
            "中级销售经理年薪在30万-80万,",
            "高级销售经理年薪已达到80万-200万并向更高发展!"
        ]
    }],
}

api封装的写法

var base = ${process.env.HOST}:${process.env.PORT}
const ApiSetting = {
news: /static/data/news.json,//这个直接直接浏览器域名走(相当于不用配置)
news: ${base}/static/data/news.json,//这个是之前分环境走打包
}
export default ApiSetting

页面调用的方法

<tr v-for="item in jobs">//html部分
                                    <td>{{item.name}}</td>
                                    <td>{{item.number}}</td>
                                    <td>{{item.experience}}</td>
                                    <td>
                                        <router-link :to="{name: ‘hiredetails‘,query: {id: item.id}}">查看详情 </router-link>
                                    </td>
                                </tr>

import ApiSetting from ‘@/api‘   //引入api

created() {
            this.$ajax.get(ApiSetting.news)//调用静态json文件
            .then(res => {
                console.log(res.data)
                this.jobs = res.data.jobs
            })
        }

转载至:https://www.cnblogs.com/lml-lml/p/9438754.html    https://www.cnblogs.com/ainyi/p/9335952.html

原文地址:https://www.cnblogs.com/mz-2015/p/9509487.html

时间: 2024-07-30 20:13:48

vue项目跨域问题的相关文章

vue resource 携带cookie请求 vue cookie 跨域

vue resource 携带cookie请求 vue cookie 跨域 1.依赖VueResource 确保已安装vue-resource到项目中,找到当前项目,命令行输入: npm install vue-resource --save 在主方法添加 过滤 Vue.http.interceptors.push(function(request, next) {//拦截器 // 跨域携带cookie request.credentials = true; next() }) 以下是针对每个请

java-web项目跨域的问题

当web项目跨域访问时,给response添加一个Access-Control-Allow-Origin:*的头即可接口,添加方式: response.setHeader("Access-Control-Allow-Origin", "*");

解决vue axios跨域请求发送两次问题

问题: vue axios跨域请求,在Request Headers加Authorization传递Token时,发现统一请求触发了两次,第一次是Request Method: OPTIONS请求. 原因: 跨域请求时,浏览器会首先使用OPTIONS方法发起一个预请求,判断接口是否能够正常通讯.如果通讯异常,则不会发送真正的请求,如果测试通讯正常,则开始真正的请求. 解决方法: 后台:判断请求方式是OPTIONS,则不处理: 预请求 发送真正请求  PHP解决方法 class Common ex

vue resource 携带cookie请求 vue cookie 跨域(六)

1.依赖VueResource  确保已安装vue-resource到项目中,找到当前项目,命令行输入: npm install vue-resource --save 在主方法添加 过滤 Vue.http.interceptors.push(function(request, next) {//拦截器 // 跨域携带cookie request.credentials = true; next() }) 以下是针对每个请求都会携带cookie ,也可以指定接口请求携带cookie this.$

银行卡项目跨域总结

银行卡项目中所请求的银行卡相关接口为https://wallet.iqiyi.com/...和https://pay.iqiyi.com/... 调用情形为任意页面的弹窗,所以其域名是不固定的:主要为http://www.iqiyi.com和http://vip.iqiyi.com以及其他域名.因此存在跨域问题. 方案1:采用jsonp jsonp是最常用的做法,但是在本项目中不能使用. 原因1:接口不支持jsonp,但不是主要原因,可以让接口方作出修改. 原因2:采用jsonp的话,请求时数据

vue + vue-resource 跨域访问

使用vue + vue-resource进行数据提交,后台使用RESTful API的方式存取数据,搞了一天,终于把后台搞好了.进行联合调试时,数据不能提交,报403错误: XMLHttpRequest cannot load http://localhost:8090/xxx/xxx. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header

ajax调用.net API项目跨域问题解决

ajax调用.net API项目,经常提示跨域问题.添加如下节点代码解决:httpProtocol <system.webServer> <handlers> <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> <remove name="OPTIONSVerbHandler" /> <remove name="TRACEVerbHandle

JAVA web项目跨域

CORS跨域请求控制方法 1.http请求头 Origin: 普通的HTTP请求也会带有,在CORS中专门作为Origin信息供后端比对,表明来源域. Access-Control-Request-Method: 接下来请求的方法,例如PUT, DELETE等等 Access-Control-Request-Headers: 自定义的头部,所有用setRequestHeader方法设置的头部都将会以逗号隔开的形式包含在这个头中 2.http响应头 然后浏览器再根据服务器的返回值判断是否发送非简单

vue flask 跨域问题

最近一直忙着检查点测试平台的开发.之前主要是从事后端开发,现在所有的东西都需要自己一个人撸.也遇到了之前在后端服务开发中未碰到的问题,在此记录下解决的全过程. 前端采用vue + element的技术,开发完成后生成静态文件扔到nginx服务器上.后端用python的flask,完成之后放到gunicorn中.两个单独开发到没有什么太大问题,问题就出在将两个合在一起的时. 第一次合并的时候出现了下面的问题,额...跨域问题,问题不大改改后台的响应就ok,就写了一个简单的装饰器 装饰器代码: de