具体思路:在a.com下设置cookie后,嵌入一个iframe框链接b.com的页面,b.com设置好页面cookie后,再嵌入一个a.com的页面,然后通过parent.parent就可以调用最外层的a.com的js方法,从而进行跳转或者一些其它的操作。具体代码示例如下:
假设a.com有页面:login.php和callback.php,b.com有页面synclogin.php
a.com的login.php代码:
<?php $sso = "e589hR6VnO8K1CNQZ4PSP/LWGBhRKE5VckawQwl1TdE8d4Q5E7tW"; setcookie("sso", $sso); ?> login success... <script type="text/javascript"> function jumpTo() { location.href = "http://a.com"; } </script> <iframe src="http://b.com/synclogin.php?sso=<?php echo $sso; ?>"></iframe>
b.com的synclogin.php页面
<?php setcookie("sso", $_GET["sso"]); ?> <iframe src="http://a.com/callback.php"></iframe>
a.com的callback.php页面
<script type="text/javascript"> parent.parent.jumpTo(); </script>
代码看起来也不难,值得一提的是这里嵌入了两个iframe,因为如果只用一个iframe的话,即在b.com的synclogin.php内直接调用父窗体的jumpTo方法,在有些浏览器下会提示没有权限的错误:
Error: Permission denied to access property
这里只是演示了cookie跨域同步的思路,具体细节还有很多可以改进的地方,比如iframe链接的页面可以考虑改成静态的页面,这样效率会比php动态页面快很多,还有像参数校验、多个主域(比如还有c.om)同时登录等等,这里就不再累述。
cookie的总结到这里就结束,如果你感觉有一些收获,可以在页面底部扫码给我打赏哟,感谢O(∩_∩)O~
session
$_SESSION
没有值
这个session使用和cookie有一点不太一样,session使用前必须先调用session_start
方法。否则会收到一个undefined的错误:
Notice: Undefined variable: _SESSION
session存储在哪
session存储在服务端,但是session究竟是存储在哪呢?php.ini中关于session有一个save_path的选项可以设置存放的目录,如果这个选项没有设置值,那么就存储在系统默认的tmp目录下。默认的tmp目录可以通过sys_get_temp_dir方法取到。
例如在mac下面,php的session一般会存储在/var/tmp目录下。
session_start(); echo session_id();//本例输出ipkl446enhae25uq92c28u4lo3 $_SESSION['name'] = "tony”; $_SESSION['users'] = array("tony", "andy");
通过session_id方法可以取到当前的session编号,通过这个编号可查看一下该session文件。