前端解决跨域的方法及为什么有跨域

解决前端的九种方法 知识的广度来自知识的深度,学习如果不成体系那是多可怕的一件事儿,希望我们在未来的学习道路上坚守初心,不要给自己留下遗憾,以自己喜欢的方式生活,做自己喜欢做的事,宠爱自己,做一个独一无二的自己! 对于文章中出现的任何错误请大家批评指出,会及时做出修改! 有任何想要讨论和学习的问题可联系我:cittaksana@qq.com 解决前端的九种方法什么是?什么是同源策略?常见场景解决方案一、 通过jsonp二、 document.domain + iframe三、 location.. 阅读详情

为什么有跨域:
浏览器未来保护用户的安全和隐私给js设置的限制,ajax发送请求,读取响应,浏览器虽然不会阻止你发送请求,但是却读取不到响应
浏览器同源策略:
一个域名的js,在未经允许的情况下,不得读取另一个域名的内容。但是浏览器并不会阻止你发送请求。

  1. 不同服务器
    2. 同一服务器,不同端口
    3. 协议不同
    form表单为什么可以跨域:
    form表单会刷新页面,不会讲结果返回给js所有浏览器认为这是安全的
    **

前端解决跨域的方法

**

jsonp:

通过动态的向页面中添加script标签,并且将src设置成请求地址的方式,来实现域请求
jsonp只能实现get请求
原生ajax用jsonp解决跨域:
封装ajax请求:

function ajax(json) {

        json.type = json.type ? json.type : 'get';
        json.async = json.async == false ? false : true;
        json.contentType = json.contentType ? json.contentType : 'application/x-www-form-urlencoded';
        json.date = json.date ? json.date : '';
        var ajax = new XMLHttpRequest();
        // 判断get还是post
        if (json.type.toLowerCase() == 'post') {
            ajax.open('post', json.url, json.async);
            ajax.setRequestHeader('Content-type', json.contentType + ';charset=utf-8');
            ajax.send(json.date);
        } else {
            ajax.open('get', json.url + '?' + json.date, json.async);
            ajax.send();
        }
        ajax.onreadystatechange = function () {
            if (ajax.readyState == 4 && ajax.status == 200) {
                json.success(ajax.response);
            }
        }
    }

使用:

 you.ajax({
        'url': './json/index.json',//这里我使用的是自己本地的文件
        'dataType': 'jsonp',
        'success': function (res) {
            var r = JSON.parse(res);
        }'jsonpCallback': 'a'//jsonpCallback用来接收跨域请求的回调函数, 如果没有设置jsonpCallback, 由success的函数来充当回调函数
    })

jquery用jsonp:

var url = "https://p.3.cn/prices/mgets?skuIds=J_5089253&type=1";
        $.get(url,function(res){
           console.log(res)
        })

vue中的axios跨域:

  • 地址:http://www.axios-js.com
  • 含义:易用、简洁且高效的(基于promise)http库 (一个封装好的http插件)
  • 特点:
    • 支持node端和浏览器端
    • 支持promise
    • 丰富的配置项

安装:
cnpm/npm install axios -S
页面引入:

import axios from axios

get方法:
axios.get(请求地址,配置对象).then(res=>{ }).catch(err=>{})

//不传参数
axios.get('url')
.then(res=>{
  
})
.catch(err=>{
  
})

//传参数 第一种
axios.get('url?id=5&name=张三')
.then(res=>{
  
})
.catch(err=>{
  
})
//传参数 第二种
axios.get('url'{
   params:{
     参数1:值,
     参数2:值
   }
})
.then(res=>{
  
})
.catch(err=>{
  
})

post方法

axios.post(url, {
    参数1:,
    参数2:})
  .then((res) =>{
    console.log(response);
  })
  .catch((error)=> {
    console.log(error);
  });

axios封装:
src下新建http文件夹,http文件夹下新建index.js用于封装跨域请求和请求拦截及响应拦截,新建api.js用于封装后端接口
config/index.js:

module.exports = {
  dev: {

    // Paths
    assetsSubDirectory: 'static',
    assetsPublicPath: '/',
    proxyTable: {// 【设置代理!!!】
      '/api': {  //使用"/地址名"来代替"请求网址" 
            target: 'http://localhost:3000/',   //后端源地址 
            changeOrigin: true,  //改变源 
            pathRewrite: {  // 路径重写
              '^/api': '' // 当请求的路径开头有  /地址名  的时候就替换成请求网址
            }
          }
    },
    }

http/index.js:

import axios from 'axios'
import router from '../router'
import {Message} from 'element-ui'
const $axios=axios.create({
    baseURL:'/api',//使用"/地址名"来代替"请求网址",在config/index.js内
    timeout:3000
})

 // 请求拦截器   修改请求头 【在请求头上加token】
 $axios.interceptors.request.use(function (config) {
  //  console.log(config)
  var token = sessionStorage.getItem('token')
  //  修改请求头,每一个请求都会添加token
config.headers.Authorization=token?token:"";
    // 请求发送之前做一些事情
    return config;  //一定要return config 请求无法发送
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });

// 响应拦截器   返回数据的校验  状态是否正确  信息的提取
$axios.interceptors.response.use(function (response) {
    // 对响应数据做点什么
    // console.log(response)
    if(response.data.code == 403){
      Message.error(response.data.msg);
    
      router.push('/login')
    }
    return response;
  }, function (error) {
    // 对响应错误做点什么
    return Promise.reject(error);
  });

  export default $axios

http/api.js:

// 存放接口地址
export default{
  baseUrl:'http://localhost:3000',
  // 菜单管理
  menuinfoUrl:'/api/menuinfo',//获取菜单1条
  menuaddUrl:'/api/menuadd',//菜单添加
  menulistUrl:'/api/menulist',//菜单列表
  menueditUrl:'/api/menuedit',//修改
  menudeleteUrl:'/api/menudelete',//删除
  //角色管理
  roleinfoUrl:'/api/roleinfo',//角色菜单1条
  roleaddUrl:'/api/roleadd',//角色添加
  rolelistUrl:'/api/rolelist',//角色列表
  roleeditUrl:'/api/roleedit',//修改
  roledeleteUrl:'/api/roledelete',//删除
  //管理员管理
  userinfoUrl:'/api/userinfo',//获取菜单1条
  useraddUrl:'/api/useradd',//菜单添加
  userlistUrl:'/api/userlist',//菜单列表
  usereditUrl:'/api/useredit',//修改
  userdeleteUrl:'/api/userdelete',//删除
  usercountUrl:'/api/usercount',//删除

  // 用户登录
  postuserlogin:'/api/userlogin'
}

vue中使用:

created() {
    this.$axios
      .get("/api/catelist", {
        params: {
          istree: 1,
        },
      })
      .then((res) => {
        this.first_cates = res.data.list.length;
      });
  },

react使用axios跨域:
axios封装:
封装步骤和vue一样
使用:

constructor() {
        super()
        this.state={
            bannerarr:[],
          
        }
    }
this.$axios.get(this.$api.bannerUrl)
        .then(res=>{
            // console.log(res.data.banners,"res")
            this.setState({
                bannerarr:res.data.banners
                
            })
            console.log(this.state.bannerarr)
        })


render(){

        return(<div>
            <div className="banner">
                <AwesomeSwiper ref={ref => (this.swiperRef = ref)} config={config} className="your-classname banner">
                    <div className="swiper-wrapper">
                        
                        {
                            this.state.bannerarr.map((item,index)=>{
                                return <div className="swiper-slide" key={index}>
                                    <img src={item.imageUrl} />
                                </div>
                            })
                        }
                    </div>
                    {/* <!--左箭头--> */}
                    <div className="swiper-button-prev"></div>
                    {/* <!--右箭头--> */}
                    <div className="swiper-button-next"></div>
                    <div className="swiper-pagination"></div>
                </AwesomeSwiper>
                </div>
<div className="main">
    
</div>

        </div>)
    }

uni-app跨域网络请求(uni.request):

let  baseUrl = null; 
if(process.env.NODE_ENV === "development"){
	//开发环境
	baseUrl="http://localhost:3000"
}else{
	baseUrl = "https://api.zhaowei.shop"
}
export default baseUrl;

网络请求

uni.request({
			url:"",
			data:{},
			method:"get",
			header:{
				"content-type":"application/json"
			},
			success(res){
}
		})

封装

import baseUrl from './config.js'
const http = (options)=>{
	return new Promise((resolve,reject)=>{
		uni.request({
			url:baseUrl + options.url,
			data:options.data || {},
			method:options.method || "get",
			header:options.header || {
				"content-type":"application/json"
			},
			success:resolve,
			fail:reject
		})
	})
}
export default http;

封装api

// 管理所有的api接口
import  http  from "./http.js"
// 1.获取一级分类
const  _getTopCates = () =>{
	var options = {
		url:"/api/getcate"
	}
	return  http(options)
}
springboot 解决问题 | Spring Boot 24 一、为什么会出现问题 出于浏览器的同源策略。 同源策略是一种约定,它是浏览器最核心也是最基本的安全功能,如果缺少了同源策略,则浏览器正常功能可能都会受到影响。可以说web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个JavaScript脚本和另外一个的内容进行交互。所谓同源(即指在同一个),就是两个页面具有相同的协议protocol、主机host和端口号port。 二、当一个请求url的协议、名、端口三者之间任意一个与当前页面url不同即为 当前 阅读详情

相关推荐

Web 项目问题及常见解决方法---以 Geoserver 问题为例

问题是经常遇到的问题,尤其是在地图开发中,本文以 geoserver 为例,介绍一下工作中解决问题的几种方法

非科班Java出身GISer的博客 7276

前端请求后端接口出现问题

可以在 入口文件 中加上以下代码 主要是解决 请求头 和 请求 的问题 // 指定允许其他名访问 header('Access-Control-Allow-Origin:http://abc.cn'); // 允许所有名访问 header('Access-Control-Allow-Origin:*'); // 允许响应类型 header('Access-Control-Allow-Methods:POST,GET,OPTIONS'); // 响应头设置,允许设置Aut

扯文艺的猿的博客 2650

百度飞桨+文心大模型实战:生成式AI工程师认证备考全攻略(含真题解析)

本文详细解析百度飞桨与文心大模型结合的生成式AI工程师认证备考策略,涵盖认证体系、学习路径、核心技能突破及真题分析。帮助开发者掌握大模型原理、飞桨平台操作和文心大模型应用,高效通过工信部与百度联合认证考试。

loss4bartender的博客 648

几种常见解决方案

一、同源策略 现在很多的项目开发,都实现了前后端分离开发,能够大大提高效率,但是导致前端向后端发送请求,会出现错误。 先说说什么是当访问一个网站时,一个完整的名由传输协议、网络名、名主体和名后缀四个部分组成,如下图所示: 相同后缀的名主体是不能重复。http://www.baidu.com和http://www.google.cn就是两个不同的就是在当前去访问其他的资源。就比如我们在自己的机器上通过ajax去调用百度地图提供的API接口数据,这就是请求。 <!DOCT

江夏、的博客 1623

问题分析及解决方案(方案在文末)

一、什么是浏览器对于javascript的同源策略的限制 。 以下情况都属于原因说明 示例 名不同 www.jd.com 与 www.taobao.com 名相同,端口不同 www.jd.com:8080 与 www.jd.com:8081 二级名不同 item.jd.com 与 miaosha.jd.com 如果名和端口都相同,但是请...

weixin_39433171的博客 517

定义、出现原因、解决办法

:当页面的某个接口请求的地址与当前页面的地址中名、端口、协议有时,即为。出现原因:因为浏览器发起接口请求必须符合同源协议,即名,端口和协议必须都一样,否则,无法请求数据,目的是保证网站安全。

日晞的博客 812

前端问题原因及解决方案

是如何形成的? 当我们请求一个url的 协议、名、端口三者之间任意一个与当前页面url的协议、名、端口 不同这种现象我们把它称之为 会导致: 1、无法读取非同源网页的 Cookie、LocalStorage 和 IndexedDB 2、无法接触非同源网页的 DOM 3、无法向非同源地址发送 AJAX 请求(可以发送,但浏览器会拒绝接受响应) 导致的根本原因是请求浏览器的同源策略导致的 ,而请求报错的原因是: 浏览器同源策略 && 请求是ajax类型 &&

棠樾的博客 9982

关于

什么是指不能执行其他网站的脚本,浏览器对js的同源策略的限制。 例如:a.cn下面不能调用b.cd中的js,对象或数据因为a.cn和b.cn是不同,所有就出现了 。 同的概念:比如url中相同名,(主名,子名)相同的端口,相同的协议。如果不相同,则前端解决的几种方法: 1.iframe随着近年来前端技术的飞跃发展以及移动互联网时代的洗礼,iframe的使用渐渐...

weixin_43783614的博客 146

前端问题原因分析以及解决方式

前端问题原因分析以及解决方式

法研鲁迅的个人博客 3335

问题 原理以及解决方法

深入讲解一下CORS:CORS其实就是资源共享,它允许浏览器源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。:出现的较晚,它是W3C标准,属于Ajax请求的根本解决方案。

Monster的博客 1890

什么是解决方法

什么是解决方法

weixin_66375317的博客 9万+

解决前端的几种方法

解决前端的几种方法 了解出现的原因 解决的几种方法 想要解决 先要知道为什么会出现 :指的是浏览器不能执行其他网站的脚本 它是由浏览器的同源策略造成的 是浏览器javascript添加的安全限制 同源策略是一种约定 是浏览器核心的安全功能 同源策略会造成以下的影响 Cookie、LocalStorage 和 IndexDB 无法读取 DOM 和 JS 对象无法获取 Ajax请求发送不出去 是否同源主要看一下三个方面: 协议是否相同(http https fil

greed 1万+

为什么会产生,以及解决方法

一、 1、为什么会产生 答:因为浏览器的同源政策,就会产生。比如说发送的异步请求是不同的两个源,就比如是不同的的两个端口或者不同的两个协议或者不同的名。由于浏览器为了安全考虑,就会产生一个同源政策,不是同一个地方出来的是不允许进行交互的。 2、怎么解决 解决方法:第一种jsonp的方法,但是由于它的安全性太低了,现在很多都不用了。第二种使用CORS解决问题,即资源共享,在后端设置响应头部,加一句代码:access-control-allow-origin:"*"或者允许交互的

zzyaiaad的博客 9808

什么是为什么、怎么解决

什么是为什么、怎么解决 ​ ​ 例如:http://192.168.0.1:8080与https://192.168.3.1:8080不是同源,因为协议不同,第一个冒号前面的为协议,中间的为名,第二个冒号后面的为端口,只要满足有一处不同,则就不是同源。 所谓就是从 A 向 B 发请求,如若他们的地址协议、名、端口都不相同,直接访问就会造成问题是非常常见的现象!请求是的但并不一定会报错,普通的图片请求。css文件请求是不会报错的。报错的条件是浏览器

qq_46034942的博客 1万+

详解前端中的解决措施

针对浏览器的"同源策略"进行了详细的解释,文章中还包含了一些关于解决的具体措施及代码示例

2301_78675670的博客 3657

前端和后端解决问题方法

后端接收到请求并返回结果了,浏览器把这个响应拦截了。

m0_63803244的博客 6417

前端解决方案

前端请求一个不同于应用部署的时,例如从http://localhost:3000向http://localhost:8080发送请求,就会发起一个请求。默认情况下,请求是被禁止的,因此会导致请求失败。同源策略是浏览器的一项安全策略,浏览器只允许js 代码请求和当前所在服务器名,端口,协议相同的数据接口上的数据,这就是同源策略.JS采取的是同源策略,也就是说,当协议、名、端口任意一个不相同时,都会产生问题,所以又应该如何解决问题呢?,请求一个测试网站的资源时,出现的报错。

狮子也疯狂的博客 7万+

什么是为什么?怎么解决?一篇文章全搞懂!

什么是为什么?怎么解决?一篇文章全搞懂! 在前端开发中,你一定听过一个词:“”。听起来好像很高深,但其实它和我们的日常上网行为息息相关。 今天我们就来用最通俗的语言,带你彻底了解 (Cross-Origin) 是什么、它是怎么产生的,以及我们应该如何应对它。

m0_62197905的博客 4194

前端常见的解决方法

由于jsonp实现的原理是动态尝试script标签,利用script标签的src不受同源策略的限制,但是使用jsonp的缺点是只能实现get请求,不能实现post请求;自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

2401_84150102的博客 1722
上一篇: 对重构的理解
下一篇: vuex-状态管理--vuex是什么及使用方法--使用vuex的好处
九州清宴
博客等级 码龄7年 6粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值