前端跨域问题的解决

1.为什么会出现跨域问题

web浏览器中包含JavaScript解释器,也就是说,一旦载入Web页面,就可以任意的JavaScript代码在计算机里执行。安全隐患也就随之而来,所以由Netscape提出了一个著名的安全策略——同源策略,即JavaScript脚本不能读取从不同服务器载入的文档的内容。

2.同源策略的具体情况

一个完整的url地址包括:

协议名://域名:端口号/资源路径


URL


说明


是否允许通信


http://www.a.com/index.html

ftp://www.a.com/detail.html


协议名不同


不允许


http://www.a.com/index.html

http://www.b.com/detail.html


协议名相同,域名不同


不允许


http://www.a.com:8000/index.html

http://www.a.com:3000/detail.html


协议名和域名都相同,端口号不同


不允许


http://www.a.com/index.html

http://70.80.90.00 /detail.html


协议名相同,假设ip地址表示的是同一个网址


不允许


http://www.a.com/index.html

http://www.a.com/detail.html


协议名相同,域名相同,端口号相同


允许

总结:如果协议名、主机名或者端口号不同,就是跨域,即使是ip地址和主机名代表同一个网址。

3.跨域问题的几种解决方案

(1).动态创建script

         因为script不受同源策略的影响,所以用js动态的加载url,达到跨域。   

function loadScript(url, func) {
        var head = document.head || document.getElementByTagName(‘head‘)[0];
        var script = document.createElement(‘script‘);
        script.src = url;
        script.onload = script.onreadystatechange = function(){
        if(!this.readyState || this.readyState==‘loaded‘ || this.readyState==‘complete‘){
            func();
            script.onload = script.onreadystatechange = null;
        }
        };
        head.insertBefore(script, 0);
}
window.baidu = {
        sug: function(data){
        console.log(data);
        }
}
loadScript(‘http://suggestion.baidu.com/su?wd=w‘,function(){console.log(‘loaded‘)});

(2).jsonp

JSON是一种基于文本的数据交换方式,以键值对的形式存储数据,轻量级数据格式,适用互联网传递。而JSONP是一种非正式的传输协议,该协议的原理是:web客户端通过与调用脚本一模一样的方式,来调用跨域服务器上动态生成js格式文件(JSON后缀,封装客户端需要的数据),用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback函数作为函数名来包裹住JSON数据,这样客户端就可以使用JSON数据进行数据处理了。

//jQuery实现jsonp跨域的方法:
//$.JSON方法:
    $.getJSON({‘myUrl?callback=?’,function(data){
        //处理data数据
    });

//$.ajax方法:
    $.ajax({
        type:”get”,
        url:”http://www.baidu.com/..”,
        datatype:”jsonp”,
        jsonp:”callback”,//用于获得jsonp回调函数名的参数名,一般默认为callback
        jsonpCallback:”func()”,//自定义的jsonp回调函数名称
    success:function(json){
        console.log(json);
    },
    error:function(err){
        console.log(err);
    }
 });

(3).postMessage

在 HTML5 中, window 对象增加了一个非常有用的方法: 

    otherWindow.postMessage(message, targetOrigin);

  otherWindow:调用的window;message:发送的消息或对象;targetOrigin:目标的源,* 表示任意。

  

window.addEventListener("message", receiveMessage, false);

function receiveMessage(event)
{
  var origin = event.origin || event.originalEvent.origin; // For Chrome, the origin property is in the event.originalEvent object.
  if (origin !== "http://example.org:8080")
    return;

 event.source.postMessage("the data is",event.origin);
 }

(4)、使用CORS跨域

CORS(跨来源资源共享)是一份浏览器技术的规范,提供了web服务器从不同网域传来沙盒脚本的方法,以避开浏览器的同源策略,是JSONP模式的现代版。

①. 客户端    使用绝对地址

xhr.open("GET", "http://blog.csdn.net/api", true);

②. 服务器

服务器端对于CORS的支持,主要就是通过设置Access-Control-Allow-Origin来进行的。如果浏览器检测到相应的设置,就可以允许Ajax进行跨域的访问。

在PHP中:只需要使用如下的代码设置即可。

<?php

header("Access-Control-Allow-Origin:*");

以上的配置的含义是允许任何域发起的请求都可以获取当前服务器的数据。这样所有域的请求都被允许会造成潜在的不安全性。所以我们应该尽量有针对性的对限制安全的来源,比如限制只能从博客园上请求

Access-Control-Allow-Origin: http://www.cnblogs.com

(5).web socket(ws协议)

var socket = new WebSockt(‘ws://www.baidu.com‘);//http->ws; https->wss

socket.send(‘hello WebSockt‘);

socket.onmessage = function(event){

var data = event.data;

}

时间: 2024-09-29 16:04:25

前端跨域问题的解决的相关文章

前端跨域问题各种解决方式及原理

跨域的各种解决方式及原理 因为浏览器有某些安全级别的限制,例如,同源策略,所以在进行浏览器端的web应用开发的时候,经常会遇到跨域问题. 同源策略:只有在同源的情况下(同域名,同协议,同端口)才能进行数据交互 跨域问题报错:XMLHttpRequest cannot load https://api.douban.com/v2/movie/in_theaters. No 'Access-Control-Allow-Origin' header is present on the requeste

解决前端跨域请求的几种方式

利用 JSONP 实现跨域调用 说道跨域调用,可能大家首先想到的或者听说过的就是 JSONP 了. 1.1 什么是JSONP JSONP 是 JSON 的一种使用模式,可以解决主流浏览器的跨域数据访问问题.其原理是根据 XmlHttpRequest 对象受到同源策略的影响,而 <script> 标签元素却不受同源策略影响,可以加载跨域服务器上的脚本,网页可以从其他来源动态产生 JSON 资料.用 JSONP 获取的不是 JSON 数据,而是可以直接运行的 JavaScript 语句. 1.2

.net mvc webapi 解决前端跨域问题

跨域问题的原因不解释了,直接设置两步就可以解决前端跨域问题 1.Gloabel.asax文件中 //解决跨域问题 protected void Application_BeginRequest(object sender, EventArgs e) { RegisterRoutes(RouteTable.Routes); if (HttpContext.Current.Request.HttpMethod == "OPTIONS") { HttpContext.Current.Resp

JAVA解决前端跨域问题。

什么是跨域? 通俗来说,跨域按照我自己的想法来理解,是不同的域名之间的访问,就是跨域.不同浏览器,在对js文件进行解析是不同的,浏览器会默认阻止,所以 现在我来说下用java代码解决前端跨域问题. 用java代码解决前端跨域问题? 找到WEB-INF下面的web.xml文件,输入下面代码,在web.xml文件下面: 1 <!-- 解决跨域访问的问题 --> 2 <filter> 3 <filter-name>cors</filter-name> 4 <

解决vue+springboot前后端分离项目,前端跨域访问sessionID不一致导致的session为null问题

问题: 前端跨域访问后端接口, 在浏览器的安全策略下默认是不携带cookie的, 所以每次请求都开启了一次新的会话. 在后台打印sessionID我们会发现, 每次请求的sessionID都是不同的, 既然每次请求都是一个新的会话, 那我们去获取session的时候自然就是null了. 解决办法如下: 环境: vue 2.0 springboot 2.1.6 一.前端部分 1.  在vue引入axios的位置添加以下代码 import axios from 'axios' axios.defau

前端跨域访问

1. JSONP 2. CORS(Cross-origin resource sharing) 2.1 运行模式 2.2 JQuery支持CORS 2.3 与JSONP相比 3. 跨域访问在点评的应用 References 在互联网应用中: 一个页面需要请求多个域名下的web服务端接口 同时一个web服务接口可能会被很多不同域名下的页面请求. 一个web应用如果支持为了支持以上模式而申请多个域名是不合算的,因为域名申请和管理所占用的资源比较大,因此服务端支持跨域就成了一个更合理的解决方案.解决跨

前端跨域问题解决方法

1.什么是跨域及产生原因 跨域是指a页面想获取b页面资源,如果a.b页面的协议.域名.端口.子域名不同,或是a页面为ip地址,b页面为域名地址,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源. 跨域情况如下: url 说明 是否跨域 http://www.cnblogs.com/a.jshttp://www.a.com/b.js 不同域名 是 http://www.a.com/lab/a.jshttp://www.a.com/script/b.js

前端跨域请求原理及实践

前端跨域请求原理及实践 2017-03-03 前端大全 (点击上方公众号,可快速关注) 作者:高鹏 tingandpeng.com/2016/09/05/前端跨域请求原理及实践/ 如有好文章投稿,请点击 → 这里了解详情 一. 跨域请求的含义 浏览器的同源策略,出于防范跨站脚本的攻击,禁止客户端脚本(如 JavaScript)对不同域的服务进行跨站调用. 一般的,只要网站的 协议名protocol. 主机host. 端口号port 这三个中的任意一个不同,网站间的数据请求与传输便构成了跨域调用.

前端跨域方案-跨域请求代理(asp.net handler)

现在技术开发偏向于使用统一的接口处理浏览器或者app的http请求. 大家都知道因为浏览器的同源策略的原因 js直接请求webapi 接口会有一些问题,即使做好服务器端的配置 同样会有不少的 问题  并且会有浏览器的兼容性 而使用jsonp 又需要服务器端对返回数据做相关处理 所以考虑考虑使用代理来解决前端跨域请求的问题. 代理程序走asp.net的一般处理程序,来实现前端js请求的接受然后转发到api站点. 关键点: 1.使用url参数的方式传送api接口的站点路径 http://test.m