PHP教程:COOKIE与SESSION联合完成跨域-Php-优质IT资源分享社区

admin
管理员
管理员
  • UID1
  • 粉丝29
  • 关注4
  • 发帖数581
  • 社区居民
  • 忠实会员
  • 原创写手
阅读:302回复:0

  PHP教程:COOKIE与SESSION联合完成跨域

楼主#
更多 发布于:2016-05-31 16:53

PHP教程:COOKIE与SESSION联合完成跨域.

咱们都知道SESSION是不能够跨域的,也即是说:

A.WEMVC.COM这个域的可履行文件不能够拜访到B.WEMVC.COM的SESSION,这个是SESSION的特性,一样也是出于安全视点才这么的.

在通常情况下,一个网站只有一个域名,可是也有些网站架构是由多个子域名组成的.所以就需求SESSION能够跨子域被拜访到,这么才能够完成用户的跨域登录.即是说客户在A下登录的,一样B也一起登录了,不需求用户再次登录,一起也完成了参数的跨域传递.当然不可跨域的SESSION本身现已能够帮助咱们做许多工作了,那么跨域后的SESSION呢.读到这儿是不是很激动人心,当然你也可能是正在为SESSION跨域而忧愁而找到这篇文章的,一样也恭喜你.咱们长话断说了,开端咱们今日的课程:COOKIE与SESSION联用完成SESSION跨域.

首要让咱们再从头温习下PHP中的COOKIE和SESSION:

COOKIE:

界说:

cookie 常用于识别用户。cookie

是服务器留在用户计算机中的小文件。每逢一样的计算机经过浏览器恳求页面时,它一起会发送 cookie。经过 PHP,您能够创立并取回 cookie

的值。PS:其中文名叫”曲奇”.

在PHP顶用setCookie函数来设置COOKIE,该函数一共有7个参数(在此我要向曾经我面试过的一位同仁抱歉,其时我把答案说成了6个,SORRY~,一起我也提示广大作家赶快更新自个的文章,在PHP5.2.0版本中现已增加为7个参数.),这7个参数分别为

string $name [, string $value [, int $expire [, string $path [, string $domain

[, bool $secure [, bool$httponly ]]]]]] .

name The name of the cookie. 规则 cookie 的称号。

value The value of the cookie. This value is

stored on the clients computer; do not store sensitive information. Assuming the

name is ‘cookiename’, this value is retrieved through $_COOKIE['cookiename'] 规则

cookie 的值。

expire The time the cookie expires. This is a Unix

timestamp so is in number of seconds since the epoch. In other words, you’ll

most likely set this with the time() function plus the number of seconds before

you want it to expire. Or you might use mktime(). time()+60*60*24*30 will set

the cookie to expire in 30 days. If set to 0, or omitted, the cookie will expire

at the end of the session (when the browser closes).规则 cookie 的有效期。

Note: You may notice the expire

parameter takes on a Unix timestamp, as opposed to the date format Wdy,

DD-Mon-YYYY HH:MM:SS GMT, this is because PHP does this conversion

internally.

expire is compared to the client’s time which can

differ from server’s time.

path The path on the server in which the cookie

will be available on. If set to ‘/’, the cookie will be available within the

entire domain . If set to ‘/foo/’, the cookie will only be available within the

/foo/ directory and all sub-directories such as /foo/bar/ of domain . The

default value is the current directory that the cookie is being set in.规则 cookie

的服务器途径。

domain The domain that the cookie is available. To

make the cookie available on all subdomains of example.com then you’d set it to

‘.example.com’. The . is not required but makes it compatible with more

browsers. Setting it to www.example.com will make the cookie only available in

the www subdomain. Refer to tail matching in the » specfor details.规则 cookie

的域名。

secure Indicates that the cookie should only be

transmitted over a secure HTTPS connection from the client. When set to TRUE, the cookie will only be set if a secure connection

exists. The default is FALSE. On the server-side, it’s on the

programmer to send this kind of cookie only on secure connection (e.g. with

respect to$_SERVER["HTTPS"]).规则是不是经过安全的 HTTPS 连接来传输 cookie。

httponly When TRUE the cookie

will be made accessible only through the HTTP protocol. This means that the

cookie won’t be accessible by scripting languages, such as JavaScript. This

setting can effectly help to reduce identity theft through XSS attacks (although

it is not supported by all browsers). Added in PHP 5.2.0. TRUE or FALSE.规则是不是有必要经过HTTP协议来界说拜访COOKIE,避免XSS进犯.

SESSION全部教程

SESSION在这儿就不过多的解说了,首要是:

session_cache_expire — Return current cache

expire

session_cache_limiter — Get and/or set the current

cache limiter

session_commit — Alias of session_write_close

session_decode — Decodes session data from a

string

session_destroy — Destroys all data registered to

a session

session_encode — Encodes the current session data

as a string

session_get_cookie_params — Get the session cookie

parameters

session_id — Get and/or set the current session

id

session_is_registered — Find out whether a global

variable is registered in a session

session_module_name — Get and/or set the current

session module

session_name — Get and/or set the current session

name

session_regenerate_id — Update the current session

id with a newly generated one

session_register — Register one or more global

variables with the current session

session_save_path — Get and/or set the current

session save path

session_set_cookie_params — Set the session cookie

parameters

session_set_save_handler — Sets user-level session

storage functions

session_start — Initialize session data

session_unregister — Unregister a global variable

from the current session

session_unset — Free all session variables

session_write_close — Write session data and end

session

哈哈,不是我懒噢,这儿只讲跨域.

OK,大约温习了下COOKIE和SESSION,开端完成咱们的跨域.

首要我描绘下我的思路,COOKIE能够指定域名,也即是说它能够跨域子域,例如:setcookie(’name’,'joshua’,time()+3600*24,’/',’wemvc.com’),那么A.wemvc.com,B.wemvc.com都能够拜访到$_COOKIE['name'],值也均为’joshua’.同理,SESSION

ID也能够设置成这个域名,那么A.wemvc.com和B.wemvc.com都能够得到同一个SESSION

ID,那么咱们的意图也就达到了.由于知道了同一个SESSION

ID就能够拜访到这个SESSION中的值了.SESSION有多种办法存储,文件\数据库内存等,咱们选用数据库存储,由于假如A.wemvc.com,B.wemvc.com不在同一台服务器上,那么内存和文件的存储办法就很难完成跨域了,至于究竟又没有办法,自个还没有试过.

首要在数据库中创立一张SESSION表:

CREATE TABLE `sessions` (

`sid` varchar(32) NOT NULL default '',

`expiry` int(20) unsigned NOT NULL default

'0',

`value` text NOT NULL,

PRIMARY KEY (`sid`),

KEY `expiry` (`expiry`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;

然后写一个类,这个类用于读取插入\更新\删去以及废物收回SESSION

class session{

private $db;

function __construct($db){

$this->db=$db;

}

public function

open($save_path,$session_name){

return true;

}

public function close(){

$this->db=null;

return true;

}

public function read($sid){

$rs=$this->db->query("select * from sessions

where sid='".$sid."'");

foreach ($rs as $row){

return $row['value'];

}

return null;

}

public function write($sid,$value){

if(is_null($oldvalue=$this->read($sid))){

//insert

return $this->db->query(”insert into

sessions (sid,expiry,value)values(’”.$sid.”‘,’”.time().”‘,’”.$value.”‘)”);

}else{

//update

return $this->db->query(”update sessions set

expiry=’”.time().”‘,value=’”.$value.”‘ where sid=’”.$sid.”‘”);

}

}

public function destroy($sid){

return $this->db->query(”delete from

sessions where sid=’”.$sid.”‘”);

}

public function gc($max_life_time){

return $this->db->query(’delete from

sessions where expiry+’.$max_life_time.’<’.time());

}

}

我来解说下这个类:

private $db; 类的DATABASE特点.

function __construct($db)

类的结构函数,在声明类时,能够直接传递DB特点到类中,当然假如还不理解能够先GOOGLE一下”PHP 类 construct 办法”;

public function open($save_path,$session_name)

session翻开,没有什么花头,直接回来TRUE;

public function close()

session封闭,同理open,但留意要封闭DB连接;

public function read($sid)

session读取,传值SID,在数据表中将这个SID的VALUE作为回来值回来;

public function write($sid,$value)

session的写入与更新,这个你会有疑问,为何set expiry=’”.time().”‘,稍后答案在清空过期SESSION GC办法中便会揭晓;

public function destroy($sid)

session的销毁,很简单,即是把数据表中等于这个SID的数据删去掉;

public function gc($max_life_time)

清空过期session,把超越max_life_time的SESSION都销毁掉,也即是SESSION的创立时刻加上最大生计时刻小于现在时刻(

expiry+’.$max_life_time.’<’.time())的SESSION数据删去掉,这下你会理解为何在写入和更新SESSION的办法中为何写其时时刻了吧,当然这个写法不是肯定的,随自个志愿只需你的SQL写准确了,也就能够了.

好咱们接着来看更首要的有些:

上面的类中需求一个数据库连接特点,所以声明目标的时候需求这么:

$session=new session(your db connect adapter);

数据库连接我能够供给咱们一个PDO的办法,参照运用:

function connect_db($arrPDODB){

$db=new

PDO($arrPDODB['db_driver'].’:host=’.$arrPDODB['db_host'].’;dbname=’.$arrPDODB['db_name'],$arrPDODB['db_user'],$arrPDODB['db_password']);

$db->query(”set names ‘utf8′”);

return $db;

}

SO,上面声明目标有些你能够这么写:

$session=new session(connect_db($arrPDODB));

接下来:

//设置色session id的姓名

ini_set('session.name', 'sid');

//不运用 GET/POST 变量办法

ini_set('session.use_trans_sid', 0);

//设置废物收回最大生计时刻

ini_set('session.gc_maxlifetime', 3600);

//运用 COOKIE 保留 SESSION ID 的办法

ini_set('session.use_cookies', 1);

ini_set('session.cookie_path', '/');

//多主机同享保留 SESSION ID 的 COOKIE,留意此处域名为一级域名

ini_set('session.cookie_domain', '

wemvc.com');

//将 session.save_handler 设置为 user,而不是默许的 files

session_module_name('user');

session_set_save_handler(array($session,'open'),

array($session,'close'),

array($session,'read'),

array($session,'write'),

array($session,'destroy'),

array($session,'gc'));

以上都是SESSION的设置,不理解的多查找下手册,我喜爱追根问底这么的学习办法,这么你能够学透一个知识点,而不是知道一知半解,就以为自个懂了或者会了.

最终在你需求的地方将SESSION发动:

session_start();

最终再供给一个怎么避免Session假造进犯的博文,希望能够仔细阅读.

好了,功德圆满,只需在每个履行文件之前包括这个类,并发动它,你的程序能够跨域了,呵呵.当然也能够跨一级域名.你能够在我写出下一篇博文之前自个先研讨下啊.

别的,先说一句,其实AJAX也能够跨子域,其时给我下一篇博文作铺垫了.哈哈,期待咱们与我一起评论学习.

2008年9月26日更新:

新增了一个demo程序,程序很简单,没有写入库的东西,合适菜鸟学习.

附:

demo_session_1

程序解说:很简单的 a b

两个文件夹代表你两个域,把你的虚拟机设置为a.yourdomain.com、b.yourdomain.com就能够了。先把这个搞懂,再考虑session入库的工作。session入库首要是由于一个网站有多台服务器的情况下,若session还是以默许的文件型保留的话,多服务器是行不通的。

demo_session 2

程序解说:这份程序添加了入库功用,数据表的创立,文件上面有的。

优质IT资源分享社区为你提供此文。

本站有大量优质php教程视频,资料等资源,包含php基础教程,高级进阶教程等等,教程视频资源涵盖传智播客,极客学院,达内,北大青鸟,猎豹网校等等IT职业培训机构的培训教学视频,价值巨大。欢迎点击下方链接查看

php教程视频

优质IT资源分享社区(www.itziyuan.top)
一个免费,自由,开放,共享,平等,互助的优质IT资源分享网站。
专注免费分享各大IT培训机构最新培训教学视频,为你的IT学习助力!

!!!回帖受限制请看点击这里!!!
!!!资源失效请在此版块发帖说明!!!

[PS:按 CTRL+D收藏本站网址~]

——“优质IT资源分享社区”管理员专用签名~

本版相似帖子

游客