php session跨域

模擬了一下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

?> 

 

posted @ 2014-08-22 16:10  timily  阅读(246)  评论(0编辑  收藏  举报