模擬了一下session跨域原理
在本機上面做了以下測試
http://localhost/test/test.php 在這個頁面裡面設置了session,通過另外一個域名來訪問這個session值,內容如下:
<?php
session_save_path('e:/tmp'); session_start(); if(empty($_SESSION['test'])){ $_SESSION['test'] = 'mytest'.mt_rand(); } var_dump($_SESSION);
上面的頁面生成了一個PHPSESSION 的ID值:t2r41hp5hhkvai1mfqsee37u53,另外的一個頁面通過以下地址訪問,取上面的session
http://192.168.10.174/test/test_domain.php 頁面內容:
<?php session_save_path('e:/tmp'); session_id('t2r41hp5hhkvai1mfqsee37u53'); session_start(); var_dump($_SESSION);
通過傳遞session_id過來保持兩邊的頁面ID一樣即可取到第一個頁面設置的session值。
此兩個頁面的session數據要為共同訪問到,即是“e:/tmp”目錄。
對於實質上的跨域,則是要共用session保存的數據才能實現session跨域,可以通過保存session的數據存入數據庫,或者是redis等這一類擴展來實現到。
原理也是一樣的。
以下給出改寫session handle辦法來達到目地
<?php function open($save_path, $session_name) { global $sess_save_path; $sess_save_path = $save_path; return(true); } function close() { return(true); } function read($id) { global $sess_save_path; $sess_file = "$sess_save_path/sess_$id"; return (string) @file_get_contents($sess_file); } function write($id, $sess_data) { global $sess_save_path; $sess_file = "$sess_save_path/sess_$id"; if ($fp = @fopen($sess_file, "w")) { $return = fwrite($fp, $sess_data); fclose($fp); return $return; } else { return(false); } } function destroy($id) { global $sess_save_path; $sess_file = "$sess_save_path/sess_$id"; return(@unlink($sess_file)); } function gc($maxlifetime) { global $sess_save_path; foreach (glob("$sess_save_path/sess_*") as $filename) { if (filemtime($filename) + $maxlifetime < time()) { @unlink($filename); } } return true; } session_set_save_handler("open", "close", "read", "write", "destroy", "gc"); session_start(); // proceed to use sessions normally ?>