首先我这里用到了redis 和 p3p技术。当然任意的nosql都可以满足
模拟的一个登陆访问的客户端。
<?php session_start(); $get = $_GET; if($get['uname'] == 'ftt'&& $get['pass'] == '123') { $token = md5(rand()); $_SESSION['user'] = 'ftt'; $_SESSION['islogin'] = 1; save_redis($token,json_encode($_SESSION)); header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"'); $file .= '<script type="text/javascript" src="http://o3web.demo.com/P3pApi/index?token='.$token.'" reload="1"></script>'; echo $file; } else { echo 'None'; } function save_redis($keys,$value) { try{ $_redis = new Redis(); $res = $_redis->connect('10.10.112.195','6379'); } catch(RedisException $e) { print_r($e); } $_redis->set($keys,$value); } ?>
下面是接受的接口。
<?php namespace _O3webController; use ThinkController; /* * @desc * @author Carey * @time 2016年4月25日14:50:44 * @ps 用于和o3提交数据的 */ /* p3p协议用于对o3登录用户的sesion信息获取 */ class P3pApiController extends BaseController { /* 获取p3p协议的 token标示并写入cookie中 */ public function index() { $token = I('get.token'); header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"'); setcookie('token', $token, time()+3600,'/'); } }
我会在自己的需要的页面的init或者bese里面加载。
<?php /* * 公用控制器 * @author Carey */ namespace _O3webController; use ThinkController; class BaseController extends Controller { public function _initialize(){ load_ext_config('configType',FALSE); //调用配置文件 $ref = $this->set_ref(); $this->assign('ref',$ref); /* 将o3的用户登录信息 */ $userinfo = array(); if(!isset($_SESSION['userinfo']) && empty($_SESSION['userinfo'])){ //如果SESSION中没有用户信息那么通过redis获取p3ptoken中的用户信息 $userinfo = $this->P3p(); if(!empty($userinfo)){ $_SESSION['userinfo'] = $userinfo; $this->assign('is_uid',1); //如果is_uid是1那么就是登录状态 }else{ $this->assign('is_uid',2); //如果is_uid是2那么就是没有登录 } }else{ $this->assign('is_uid',2); //如果is_uid是2那么就是没有登录 } } /* p3p获取o3用户登录信息 */ public function P3p(){ PredisAutoloader::register(); $a = new PredisClient(); $info = $a->get($_COOKIE['token']); return json_decode($info,TRUE); }