A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 大佬小跟班 初级黑马   /  2019-5-31 11:28  /  789 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

大家有时经常问什么是跨域问题,这个问题并不是一句话能回答的,因为我也不知道你说的是哪一种性质的跨域,比如说,你说的是不同域名的session共享呢?还是说ajax跨域问题呢。不管是哪种的跨域,我今天的文章中都给它列出来,并附上具体的操作方法,供大家借鉴,一起学习交流。

先说session共享的跨域问题,一个域名下都会保持一份会话,跨域就是说从一个域名到另一个域名这个会话还能继续保持,很常见的就是在一个网站跳到另一个网站还是继续保持登录状态,一般情况下从一个域名下跳到另一个域名下,登录状态是会丢失的,如果说没有丢失,那么就是进行了跨域处理。


图片来之互联网
关于跨域处理有两个级别的处理:

1.两个不同的二级域名session共享

这种级别的处理做个简单的设置就可以了,一句代码就可以做到会话保持,我以php为例,假如说你是是个电商网站,一个是母婴频道,一个是数码频道,他们是两个不同的二级域名,比如一个是muying.yourdomain.com,一个是dianzi.yourdomain.com,如果不做任何处理的话,从muying.yourdomain.com跳转到dianzi.yourdomain.com登录状态是没法保持的,要想做到两个二级域名的跨域就可以去修改php.ini的配置,修改改配置项session.cookie_domain,如果觉得修改配置项嫌麻烦的话,也可以修改php代码,在自己的php框架里处理session的地方加上这么一句就可以了

ini_set("session.cookie_domain",'yourdomain.com');

有了这句代码之后关于yourdomain.com的所有二级域名的会话都能保持了,不会出现退出登录现象,就像同一个域名下访问一样。


2.两个不同的域名的session共享

上面说的是同一个域名下的两个不同二级域名的跨域问题,接下来要说的是两个完全不一样的域名的跨域问题,比如说一个域名是abc.com,另一个域名是cde.com,那么这样怎么做到两个不同的域名实现会话个共享呢?

先说一下原理,就是实现一个session的同步问题,在abc.com的页面埋一个1像素的图片去请求一下cde.com并把session_id交给它,同样在cde.com的页面也埋一个1像素的图片去请求abc.com,并把session_id传给服务器,就这样实现了2个域名之间的session共享问题

代码实现如下:

$currentHost = $_SERVER['HTTP_HOST'];$sessid = $_REQUEST['sid'];if(isset($sessid)){session_id($sessid); session_start(); if(!isset($_SESSION['all_domains'])){ $_SESSION['all_domains'] = array( 'abc.com' => false, 'cde.com' => false, ); $_SESSION['all_domains'][$currentHost] = true; } else { $_SESSION['all_domains'][$currentHost] = true; } }else{ session_start(); if(!isset($_SESSION['all_domains'])){ $_SESSION['all_domains'] = array( 'abc.com' => false, 'cde.com' => false, ); $_SESSION['all_domains'][$currentHost] = true; } else { $_SESSION['all_domains'][$currentHost] = true; } }在其他php文件中都包含以下这样一句代码来保证session的同步<?phpforeach($_SESSION['all_domains'] as $domain => $domainset){ if(!$domainset){ echo '<img src="http://'.$domain.'/share.php?sid='.session_id().'" width="1" height="1"/>'; }}


3ajax的跨域问题

关于ajax的跨域问题有两种方式去实现,一种是利用JSONP的原理,这个我就不过多说了,因外网上能搜的到,百度上搜JSONP有一堆,说的很详细,JSONP的原理,及JSONP的具体实现等等,看了之后一会就学会了,

还有一种方式实现ajax的跨域,那就是在服务端的代码进行设置,也是一句代码的事情,就以PHP代码为例。在php的http请求框架中加入下面的这句代码,保证每一个请求能够执行到就行。

header('Access-Control-Allow-Origin:*'); header('Access-Control-Allow-Methods:POST'); //这里暂且设置请求类型为post header('Access-Control-Allow-Headers:x-requested-with,content-type');

加了这个代码之后,就可以实现ajax的跨域问题。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马