小程序开发定制如何解决跨域问题

小程序开发定制如何解决跨域问题???

一、小程序开发定制为什么会出现跨域问题呢?
小程序开发定制首先了解一下(SOP),它是由Netscape公司在1995小程序开发定制年引入浏览器的。小程序开发定制同源策略是浏览器中最小程序开发定制基本最重要的安全功能,小程序开发定制如果缺少了同源策略,小程序开发定制我们的浏览器就会很容易受到XSS、CSFR等攻击。小程序开发定制而所谓的同源策略是指:协议+域名+端口三者相同。
因此,小程序开发定制当我们请求url的协议、域名、小程序开发定制端口三者之间任意一个小程序开发定制与当前页面url不同即为跨域。
例如:

二、解决跨域问题的方法(重点!!!)
1、通过JSONP跨域
JSONP 是服务器与客户端跨源通信的常用方法。最大特点就是简单适用,兼容性好(兼容低版本IE),缺点是只支持get请求,不支持post请求。
核心思想:网页通过添加一个script元素,向服务器请求 JSON 数据,服务器收到请求后,将数据放在一个指定名字的回调函数的参数位置传回来。

第一种,原生实现:

<script src="http://test.com/data.php?callback=dosomething"></script>// 向服务器test.com发出请求,该请求的查询字符串有一个callback参数,用来指定回调函数的名字 // 处理服务器返回回调函数的数据<script type="text/javascript">    function dosomething(res){        // 处理获得的数据        console.log(res.data)    }</script>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

第二种,jQuery ajax实现:

$.ajax({    url: 'http://www.test.com:8080/login',    type: 'get',    dataType: 'jsonp',  // 请求方式为jsonp    jsonpCallback: "handleCallback",    // 自定义回调函数名    data: {}});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

第三种,在Vue.js实现:

this.$http.jsonp('http://www.domain2.com:8080/login', {    params: {},    jsonp: 'handleCallback'}).then((res) => {    console.log(res); })
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2、设置document.domain解决无法读取非同源网页的 Cookie问题
因为浏览器是通过document.domain属性来检查两个页面是否同源,因此只要通过设置相同的document.domain,两个页面就可以共享Cookie(此方案仅限主域相同,子域不同的跨域应用场景。)

// 两个页面都设置document.domain = 'test.com';
  • 1
  • 2

3、CORS
CORS 是跨域资源分享(Cross-Origin Resource Sharing)的缩写。它是 W3C 标准,属于跨源 AJAX 请求的根本解决方法。

1、普通跨域请求:只需服务器端设置Access-Control-Allow-Origin
2、带cookie跨域请求:前后端都需要进行设置

需要注意的是,CORS跨域需要在前、后端同时设置!

前端设置】根据.withCredentials字段判断是否带有cookie。

第一种,原生ajax:

var xhr = new XMLHttpRequest(); // IE8/9需用window.XDomainRequest兼容 // 前端设置是否带cookiexhr.withCredentials = true; xhr.open('post', 'http://www.domain2.com:8080/login', true);xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');xhr.send('user=admin'); xhr.onreadystatechange = function() {    if (xhr.readyState == 4 && xhr.status == 200) {        alert(xhr.responseText);    }};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

第二种, jQuery ajax :

$.ajax({   url: 'http://www.test.com:8080/login',   type: 'get',   data: {},   xhrFields: {       withCredentials: true    // 前端设置是否带cookie   },   crossDomain: true,   // 会让请求头中包含跨域的额外信息,但不会含cookie});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

第三种,vue-resource:

Vue.http.options.credentials = true
  • 1

第四种,axios :

axios.defaults.withCredentials = true
  • 1

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

第一种,Java后台:

/* * 导入包:import javax.servlet.http.HttpServletResponse; * 接口参数中定义:HttpServletResponse response */ // 允许跨域访问的域名:若有端口需写全(协议+域名+端口),若没有端口末尾不用加'/'response.setHeader("Access-Control-Allow-Origin", "http://www.domain1.com");  // 允许前端带认证cookie:启用此项后,上面的域名不能为'*',必须指定具体的域名,否则浏览器会提示response.setHeader("Access-Control-Allow-Credentials", "true");  // 提示OPTIONS预检时,后端需要设置的两个常用自定义头response.setHeader("Access-Control-Allow-Headers", "Content-Type,X-Requested-With");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

第二种,Nodejs后台:

var http = require('http');var server = http.createServer();var qs = require('querystring'); server.on('request', function(req, res) {    var postData = '';     // 数据块接收中    req.addListener('data', function(chunk) {        postData += chunk;    });     // 数据接收完毕    req.addListener('end', function() {        postData = qs.parse(postData);         // 跨域后台设置        res.writeHead(200, {            'Access-Control-Allow-Credentials': 'true',     // 后端允许发送Cookie            'Access-Control-Allow-Origin': 'http://www.domain1.com',    // 允许访问的域(协议+域名+端口)            /*              * 此处设置的cookie还是domain2的而非domain1,因为后端也不能跨域写cookie(nginx反向代理可以实现),             * 但只要domain2中写入一次cookie认证,后面的跨域接口都能从domain2中获取cookie,从而实现所有的接口都能跨域访问             */            'Set-Cookie': 'l=a123456;Path=/;Domain=www.domain2.com;HttpOnly'  // HttpOnly的作用是让js无法读取cookie        });         res.write(JSON.stringify(postData));        res.end();    });}); server.listen('8080');console.log('Server is running at port 8080...');
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

第三种,PHP后台:

<?php header("Access-Control-Allow-Origin:*");
  • 1
  • 2

第四种,Apache需要使用mod_headers模块来激活HTTP头的设置,它默认是激活的。你只需要在Apache配置文件的, , 或的配置里加入以下内容即可:

Header set Access-Control-Allow-Origin *
  • 1

4、webpack本地代理

在webpack.config.js中利用 WebpackDevServer 配置本地代理,详情配置查看devServer。

如下简单配置案例,这样 http://localhost:8080/api/getUser.php 的请求就是后端的接口 http://192.168.25.20:8088/getUser.php

    devServer: {        port: 8080,        proxy: {            "/api": {              target: "http://192.168.25.20:8088" // 后端接口            }        }    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

5、websocket
是 HTML5 的一个持久化的协议,它实现了浏览器与服务器的全双工通信,同时也是跨域的一种解决方案。WebSocket 和 HTTP 都是应用层协议,都基于 TCP 协议。但是 WebSocket 是一种双向通信协议,在建立连接之后,WebSocket 的 服务器与 客户端都能主动向对方发送或接收数据。同时,WebSocket 在建立连接时需要借助 HTTP 协议,连接建立好了之后 client 与 server 之间的双向通信就与 HTTP 无关了。

6、Nginx反向代理
实现原理类似于 Node 中间件代理,需要你搭建一个中转 nginx 服务器,用于转发请求。

使用 nginx 反向代理实现跨域,是最简单的跨域方式。只需要修改 nginx 的配置即可解决跨域问题,支持所有浏览器,支持 session,不需要修改任何代码,并且不会影响服务器性能。

我们只需要配置nginx,在一个服务器上配置多个前缀来转发http/https请求到多个真实的服务器即可。这样,这个服务器上所有url都是相同的域 名、协议和端口。因此,对于浏览器来说,这些url都是同源的,没有跨域限制。而实际上,这些url实际上由物理服务器提供服务。这些服务器内的 javascript可以跨域调用所有这些服务器上的url。

先下载nginx,然后将 nginx 目录下的 nginx.conf 修改如下:

server {     #nginx监听所有localhost:8080端口收到的请求	listen       8080;	server_name  localhost; 	# Load configuration files for the default server block.	include /etc/nginx/default.d/*.conf;    #localhost:8080 会被转发到这里	#同时, 后端程序会接收到 "192.168.25.20:8088"这样的请求url	location / {		proxy_pass http://192.168.25.20:8088;	}	#localhost:8080/api/ 会被转发到这里    #同时, 后端程序会接收到 "192.168.25.20:9000/api/"这样的请求url	location /api/ {		proxy_pass http://192.168.25.20:9000;	}	error_page 404 /404.html;		location = /40x.html {	}	error_page 500 502 503 504 /50x.html;		location = /50x.html {	}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

7、跨文档通信 API:window.postMessage()
调用postMessage方法实现父窗口http://test1.com向子窗口http://test2.com发消息(子窗口同样可以通过该方法发送消息给父窗口)

它可用于解决以下方面的问题:

  • 页面和其打开的新窗口的数据传递
  • 多窗口之间消息传递
  • 页面与嵌套的iframe消息传递
  • 上面三个场景的跨域数据传递
// 父窗口打开一个子窗口var openWindow = window.open('http://test2.com', 'title'); // 父窗口向子窗口发消息(第一个参数代表发送的内容,第二个参数代表接收消息窗口的url)openWindow.postMessage('Nice to meet you!', 'http://test2.com');
  • 1
  • 2
  • 3
  • 4
  • 5

调用message事件,监听对方发送的消息

// 监听 message 消息window.addEventListener('message', function (e) {  console.log(e.source); // e.source 发送消息的窗口  console.log(e.origin); // e.origin 消息发向的网址  console.log(e.data);   // e.data   发送的消息},false);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

好啦,以上就是总结的七种常用的解决跨域问题的方法,希望对大家有所帮助,别忘了点赞关注哦。

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发