程序员很关注的跨域问题,我总结的很全,今天全部给你!
大家有时经常问什么是跨域问题,这个问题并不是一句话能回答的,因为我也不知道你说的是哪一种性质的跨域,比如说,你说的是不同域名的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的同步
<?php
foreach($_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的跨域问题。
大家好,我是“上世是朵花”。如果你有什么好的看法或者观点可以在评论区展现你的才华,互动交流,如果想进一步了解我,那就关注我吧!