首页 > 后端开发 > 正文

PHP框架跨域问题 thinkphp6解决 CORS 跨域

2023-09-15 21:53:57 | 我爱编程网

今天我爱编程网小编整理了PHP框架跨域问题 thinkphp6解决 CORS 跨域相关内容,希望能帮助到大家,一起来看下吧。

PHP框架跨域问题 thinkphp6解决 CORS 跨域

PHP 如何实现不同网站登录跨域的问题

可以用sso单点登录解决这个问题,本质是不同的域名能同时记录同一个cookie

很久之前做过这个功能,有点忘了,大概的步骤:

  1. 例如你在test1.com登录成功后,会给一个应用中心发请求,这个应用中心保存着所有的sso登录的设置cookie的url,每个应用组装成一个script标签返回给你

  2. 你接收到这些script标签后,让这些标签执行就可以了,例如B站点的响应中就会有setCookie这个响应头,这样B站点的登录cookie就在你的浏览器上保存了

  3. 每个站点在你的浏览器上都有cookie了,自然就处于登录状态了

很久之前做过的,大体思想是这些

PHP框架跨域问题 thinkphp6解决 CORS 跨域

thinkphp6解决 CORS 跨域

1,在app/middleware.php中添加

中间件,这样就改成了

*是不安全的,可以在config/cookie.php配置cookie 有效域名的domain

如果接口请求发送了token,会提示Access-Control-Allow-Headers这个问题,tp6默认是这样

可以在'Access-Control-Allow-Headers' 这一样加上XXX-token,

我在搞这个时还遇见post请求变成get

把method改成了type

PHP框架跨域问题 thinkphp6解决 CORS 跨域我爱编程网

怎么解决跨域问题

1、 通过jsonp跨域
JSONP(JSON with Padding:填充式JSON),应用JSON的一种新方法,
JSON、JSONP的区别:
1、JSON返回的是一串数据、JSONP返回的是脚本代码(包含一个函数调用)
2、JSONP 只支持get请求、不支持post请求
(类似往页面添加一个script标签,通过src属性去触发对指定地址的请求,故只能是Get请求)

2、代理:
www.baidu.com/index.html 需要调用 www.sina.com/server.php ,可以写一个接口 www.baidu.com/server.php ,由这个接口在后端去调用 www.sina.com/server.php 并拿到返回值,然后再返回给index.html
3、PHP端修改header
header(‘Access-Control-Allow-Origin:*’);//允许所有来源访问
header(‘Access-Control-Allow-Method:POST,GET’);//允许访问的方式
4、document.domain
跨域分为两种,一种xhr不能访问不同源的文档,另一种是不同window之间不能进行交互操作;
document.domain主要是解决第二种情况,且只能适用于主域相同子域不同的情况;
document.domain的设置是有限制的,我们只能把document.domain设置成自身或更高一级的父域,且主域必须相同。例如:a.b.example.com中某个文档的document.domain可以设成a.b.example.com、b.example.com 、example.com中的任意一个,但是不可以设成c.a.b.example.com,因为这是当前域的子域,也不可以设成baidu.com,因为主域已经不相同了。
兼容性:所有浏览器都支持;
优点:
可以实现不同window之间的相互访问和操作;
缺点:
只适用于父子window之间的通信,不能用于xhr;
只能在主域相同且子域不同的情况下使用;
使用方式:
不同的框架之间是可以获取window对象的,但却无法获取相应的属性和方法。比如,有一个页面,它的地址是 , 在这个页面里面有一个iframe,它的src是 , 很显然,这个页面与它里面的iframe框架是不同域的,所以我们是无法通过在页面中书写js代码来获取iframe中的东西的:

<script type="text/javascript">
function test(){
var iframe = document.getElementById('ifame');
var win = document.contentWindow;//可以获取到iframe里的window对象,但该window对象的属性和方法几乎是不可用的
var doc = win.document;//这里获取不到iframe里的document对象
var name = win.name;//这里同样获取不到window对象的name属性
}
</script>
<iframe id = "iframe" src=" " onload = "test()"></iframe>
这个时候,document.domain就可以派上用场了,我们只要把 和 这两个页面的document.domain都设成相同的域名就可以了。
1.在页面 中设置document.domain:

<iframe id = "iframe" src=" " onload = "test()"></iframe>
<script type="text/javascript">
document.domain = 'example.com';//设置成主域
function test(){
alert(document.getElementById('iframe').contentWindow);//contentWindow 可取得子窗口的 window 对象
}
</script>
2.在页面 中也设置document.domain:

<script type="text/javascript">
document.domain = 'example.com';//在iframe载入这个页面也设置document.domain,使之与主页面的document.domain相同
</script>
5、window.name
关键点:window.name在页面的生命周期里共享一个window.name;
兼容性:所有浏览器都支持;
优点:
最简单的利用了浏览器的特性来做到不同域之间的数据传递;
不需要前端和后端的特殊配制;
缺点:
大小限制:window.name最大size是2M左右,不同浏览器中会有不同约定;
安全性:当前页面所有window都可以修改,很不安全;
数据类型:传递数据只能限于字符串,如果是对象或者其他会自动被转化为字符串,如下;
这里写图片描述
使用方式:修改window.name的值即可;
6、postMessage
关键点:
postMessage是h5引入的一个新概念,现在也在进一步的推广和发展中,他进行了一系列的封装,我们可以通过window.postMessage的方式进行使用,并可以监听其发送的消息;
兼容性:移动端可以放心用,但是pc端需要做降级处理
优点
不需要后端介入就可以做到跨域,一个函数外加两个参数(请求url,发送数据)就可以搞定;
移动端兼容性好;
缺点
无法做到一对一的传递方式:监听中需要做很多消息的识别,由于postMessage发出的消息对于同一个页面的不同功能相当于一个广播的过程,该页面的所有onmessage都会收到,所以需要做消息的判断;
安全性问题:三方可以通过截获,注入html或者脚本的形式监听到消息,从而能够做到篡改的效果,所以在postMessage和onmessage中一定要做好这方面的限制;
发送的数据会通过结构化克隆算法进行序列化,所以只有满足该算法要求的参数才能够被解析,否则会报错,如function就不能当作参数进行传递;
使用方式:通信的函数,sendMessage负责发送消息,bindEvent负责消息的监听并处理,可以通过代码来做一个大致了解;

Storage.prototype.sendMessage_ = function(type, params, fn) {
if (this.topWindow) {
this.handleCookie_(type, params, fn);
return;
}
var eventId = this.addToQueue_(fn, type);
var storageIframe = document.getElementById('mip-storage-iframe');
var element = document.createElement("a");
element.href = this.origin;
var origin = element.href.slice(0, element.href.indexOf(element.pathname) + 1);
storageIframe.contentWindow.postMessage({
type: type,
params: params,
eventId: eventId
}, origin);
}
Storage.prototype.bindEvent_ = function() {
window.onmessage = function (res) {
// 判断消息来源
if (window == res.source.window.parent &&
res.data.type === this.messageType.RES &&
window.location.href.match(res.origin.host).length > 0) {
var fn = this.eventQueue[res.data.eventId];
fn && fn();
delete this.eventQueue[res.data.eventId];
// reset id
var isEmpty = true;
for (var t in this.eventQueue) {
isEmpty = false;
}
if (isEmpty) {
this.id = 0;
}
}
}.bind(this);
}

以上就是PHP框架跨域问题 thinkphp6解决 CORS 跨域全部内容,更多相关信息,敬请关注我爱编程网。
与“PHP框架跨域问题 thinkphp6解决 CORS 跨域”相关推荐
PHP框架跨域问题 PHP 如何实现不同网站登录跨域的问题
PHP框架跨域问题 PHP 如何实现不同网站登录跨域的问题

怎么解决跨域问题1、通过jsonp跨域JSONP(JSONwithPadding:填充式JSON),应用JSON的一种新方法,JSON、JSONP的区别:1、JSON返回的是一串数据、JSONP返回的是脚本代码(包含一个函数调用)2、JSONP只支持get请求、不支持post请求(类似往页面添加一个script标签,通过src属性去触发对指定地址的请求,故只能是Get请求

2023-09-15 21:54:08
php框架解决跨域 微信公众号支付报跨域错误,后台是php
php框架解决跨域 微信公众号支付报跨域错误,后台是php

微信公众号支付报跨域错误,后台是php首先明确一个概念,微信接口并不是用ajax访问的。希望你是在后台使用curl的。在以上前提下,此报错是因为你的后台没有设置响应首部字段导致。以下两种方式均可解决:后台入口文件同级目录下.htaccess文件添加以下语句HeaderalwayssetAccess-Control-Allow-Origin"*"或者在被访问的PHP文件头部

2023-09-23 02:14:34
web前端开发怎么实现跨域 详解如何解决vue开发请求数据跨域的问题(基于浏览器的配置解决)
web前端开发怎么实现跨域 详解如何解决vue开发请求数据跨域的问题(基于浏览器的配置解决)

前端跨域问题有哪些常用的解决方式自己搭一个小型服务器就可以了。或者webstorm和brackets都有自己集成的小型服务器,能解决跨域问题。还有一种方法,就是如果是chrome浏览器的话这里加上“--allow-file-access-from-files”也可以解决跨域问题前端跨域如何解决?什么是跨域?跨域是通俗的说是从一个域名去请求另一个域名的资源。比

2023-10-13 07:45:48
php框架路由与请求跨域 跨域是指什么,因为什么引起的?有哪些解决方案?web前端知识
php框架路由与请求跨域 跨域是指什么,因为什么引起的?有哪些解决方案?web前端知识

ThinkPHP特点有哪些hinkPHP是一个免费开源的,快速、简单的面向对象的轻量级PHP开发框架,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP特点采用容器统一管理对象支持Facade更易用的路由注解路由支持路由跨域请求支持验证类增强配置和路由目录独立取消系统常量类库别名机

2023-10-02 23:11:17
web前端开发跨域 跨域是什么意思
web前端开发跨域 跨域是什么意思

跨域是什么意思问题一:跨域是指什么,因为什么引起的?有哪些解决方案?web前端知识跨域是指不同域名之间相互访问例如我的电脑上有2个服务器192.168.0.11192.168.0.12如果第一个服务器上的页面要访问第二个服务器就叫做跨域或者baidu要访问xxx也是不同域名也是跨域HTML5里有个window.postMessage方法,支持跨域访问,详情可以参考webhek/win

2023-09-14 06:05:49
php框架问题怎么解决 php知识框架总结
php框架问题怎么解决 php知识框架总结

php知识框架总结php知识框架总结篇一:php基础知识点总结PHP语言基础简单整理1.开始结束标记的格式只有在没有判断语句时才能使用。对表单传递的变量进行编码和解码:PHP中实现对查询字符串进行URL编码可以通过函数urlencode()实现,该函数的使用格式如下:stringurlencode(stringstr);对URL编码后的查询字符串进行解码,可以通

2023-09-15 16:28:40
php框架错误如何解决 PHP框架Phalcon 兼容问题
php框架错误如何解决 PHP框架Phalcon 兼容问题

php的YII框架的问题php的YII框架的问题手动装一次,PHP+MYSQL+APACHE我的QQ群的问题你可以设定现金奖励。比如每天丢掷一个聊天话题给大家讨论或辩论,你会挑选出答辩最好的奖励,然后每天再丢掷一个猜测性的话题,猜中的也可以奖励。再每天释出一些笑话,实时新闻话题等。再看看群里是些什么人,选择不同的话题聊。慢慢地会活跃起来。JDBC中的Statemen

2023-10-05 18:23:00
swoole改造php框架 swoole用来解决php什么问题
swoole改造php框架 swoole用来解决php什么问题

框架中集成swoole扩展怎么使用swoole扩展是PHP扩展。phpswoole扩展,PHP语言的高性能网络通信框架,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询。1、下载swoole源码包[root@nginx~]#wget2、解压进入swo

2023-09-14 21:57:46