当前位置:  编程技术>php
本页文章导读:
    ▪php 跨域、跨子域,跨服务器读取session的方法介绍      1、跨子域和跨服务器 Session主要分两部分: 一个是Session数据,该数据默认情况下是存放在服务器的tmp文件下的,是以文件形式存在。 另一个是标志着Session数据的Session Id,Session ID,就是那个.........
    ▪php mcrypt启用、加密以及解密的方法介绍      一、PHP加密扩展库Mcrypt安装 在标准的PHP安装过程中并没有把Mrcypt安装上,但PHP的主目录下包含了libmcrypt.dll和libmhash.dll文件 (libmhash.dll是Mhash扩展库,这里可以一起装上)。首先,将这两个文件.........
    ▪php开发API接口(注册,登录,查询等)的代码示例      1、服务端   代码示例: <?php /** * API接口服务端 * site http://www. * */     require 'conn.php';      header('Content-Type:text/html;charset=utf-8');            $action = $_GET['action'];      switch .........

[1]php 跨域、跨子域,跨服务器读取session的方法介绍
    来源: 互联网  发布时间: 2013-12-24

1、跨子域和跨服务器

Session主要分两部分:

一个是Session数据,该数据默认情况下是存放在服务器的tmp文件下的,是以文件形式存在。

另一个是标志着Session数据的Session Id,Session ID,就是那个 Session 文件的文件名,Session ID 是随机生成的,因此能保证唯一性和随机性,确保 Session 的安全。一般如果没有设置 Session 的生存周期,则 Session ID 存储在内存中,关闭浏览器后该 ID 自动注销,重新请求该页面后,重新注册一个 session ID。如果客户端没有禁用 Cookie,则 Cookie 在启动 Session 会话的时候扮演的是存储 Session ID 和 Session 生存期的角色。

两个不同的域名网站,想用同一个Session,就是牵扯到Session跨域问题!
默认情况下,各个服务器会各自分别对同一个客户端产生 SESSIONID,如对于同一个用户浏览器,A 服务器产生的 SESSION ID 是 11111111111,而B 服务器生成的则是xxxxxx。另外,PHP 的 SESSION数据都是分别保存在本服务器的文件系统中。想要共享 SESSION 数据,那就必须实现两个目标:

一个是各个服务器对同一个客户端产生的SESSION ID 必须相同,并且可通过同一个 COOKIE 进行传递,也就是说各个服务器必须可以读取同一个名为 PHPSESSID 的COOKIE;另一个是 SESSION 数据的存储方式/位置必须保证各个服务器都能够访问到。这两个目标简单地说就是多服务器(A、B服务器)共享客户端的 SESSION ID,同时还必须共享服务器端的 SESSION 数据。

第一个目标的实现其实很简单,只需要对 COOKIE 的域(domain)进行特殊地设置即可(setcookie()函数中的第4个参数),默认情况下,COOKIE 的域是当前服务器的域名/IP 地址,而域不同的话,各个服务器所设置的 COOKIE 是不能相互访问的。

1)跨子域
采用这种方式,跨域不行,但同一子域可以,如:aaa. 和www. 都属于域 .是可以的,那么我们就可以设置 COOKIE 的域为 .,这样 aaa.、www.等等都可以访问此COOKIE。这样各个服务器共享同一客户端 SESSION ID 的目的就达到了。

1、只要在php页面的最开始(要在任何输出之前,并且在session_start()之前)的地方进行以下设置
 

代码示例:
ini_set('session.cookie_path', '/');
ini_set('session.cookie_domain', '.mydomain.com');
ini_set('session.cookie_lifetime', '1800');

2、在php.ini里设置
 

代码示例:

session.cookie_path = /
session.cookie_domain = .mydomain.com

session.cookie_lifetime = 1800

3、在php页面最开始的地方(条件同1)调用函数
 

代码示例:
session_set_cookie_params(1800 , '/', '.mydomain.com');


这三种方式都是同样的效果。

这里我用第一种方法设置,分别在www.mydomain.com和sub.mydomain.com两个域名来测试。
sub1.php
 

代码示例:

<?php
//先访问的页面做设置
ini_set('session.cookie_path', '/');
ini_set('session.cookie_domain', '.mydomain.com');
ini_set('session.cookie_lifetime', '1800');

//
session_set_cookie_params(1800 , '/', '.mydomain.com');
session_start();
$_SESSION['sub1'] = 'sub1';
print_r($_SESSION);
?>

sub2.php
 

代码示例:
<?php
session_set_cookie_params(1800 , '/', '.mydomain.com');
session_start();
$_SESSION['sub2'] = 'sub2';
print_r($_SESSION);
?>

访问顺序:
(1)www.mydomain.com/sub1.php
页面输出:Array ( [sub1] => sub1 )

(2)sub.mydomain.com/sub2.php
页面输出:Array ( [sub1] => sub1 [sub2] => sub2 )

成功

第二个目标的实现可以使用数据库来保存SESSION 数据,这样各个服务器就可以方便地访问同一个数据源,获取相同的SESSION 数据了;或者是通过文件共享方式,如 NFS 方式(我的其他文章有如何配置nfs)
如果用数据库存储session数据的话,可能会有遗留问题,就是如果网站的访问量很大的话,SESSION 的读写会频繁地对数据库进行操作,可以把这个放在memcache中。存放在数据库里的前面有文章实现了。把数据库和memcache结合的思路,前面有了。如果单独用memcache存放session不太好,最好和数据库结合操作。

2)跨域解决
思路:
用iframe解决,但是ff不支持,所以需要前面加上p3p协议。

P3P(Platform for Privacy Preferences Project),是个协议,通过其声明它是好人,允许收集浏览器用户行为。
可现实中,大家都可以说自己是好人,背地里没准儿干啥坏事呢。
这就是其分歧所在。[参考] 国内多数网站,都不关注这个 P3P。隐私问题可能没国外(微软的隐私声明)重视吧。

首先想到就是通过JS操作Cookie并让两个不同域的cookie能够相互访问,这样就可达到了上述的效果。

以下是具体实现过程,分两个步骤:
1、在A系统下成功登录后,利用JS动态创建一个隐藏的iframe,通过iframe的src属性将A域下的cookie值作为get参数重定向到B系统下b.jsp页面上;
 

代码示例:
    var _frm = document.createElement("iframe"); 
    _frm.style.display="none"; 
    _frm.src = "http://www./setcookie.php?mycookie=xxxxx";//此处xxx最好编码 
    document.body.appendChild(_frm); 

2、在B系统的setcookie.php页面中来获取A系统中所传过来的cookie值,并将所获取到值写入用户的cookie中,当然域是自己的了,这样就简单的实现了cookie跨域的访问; 不过这其中有个问题需要注意,就是在IE浏览器下这样操作不能成功,需要在setocokie.php页面中设置P3P HTTP Header就可以解决了(具体詳細信息可以参考:http://www.w3.org/P3P/),P3P设置代码为:
 

代码示例:
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');//ecshop这么设置的

您可能感兴趣的文章:
PHP防止跨域提交表单的解决方法
php使用P3P实现跨域的方法分享
http与https跨域共享session的解决方法
php借助P3P完成COOKIE跨域操作的方法分享
php中json的跨域实例分析
php session跨域跨服务器的解决方法分享
php的json格式和js跨域调用的代码
php JSON 跨域调用数据的例子


    
[2]php mcrypt启用、加密以及解密的方法介绍
    来源: 互联网  发布时间: 2013-12-24

一、PHP加密扩展库Mcrypt安装
在标准的PHP安装过程中并没有把Mrcypt安装上,但PHP的主目录下包含了libmcrypt.dll和libmhash.dll文件 (libmhash.dll是Mhash扩展库,这里可以一起装上)。首先,将这两个文件复制到系统目录windows\system32下,然后在 PHP.ini文件中按Ctrl+F快捷键跳出查找框,并找到;extension=php-mcrypt.dll和; extension=php_mhash.dll这两个语句,接着将前面的“;”去掉;最后,保存并重启Apache服务器即可生效。

二、PHP加密扩展库Mcrypt的算法和加密模式
Mcrypt库支持20多种加密算法和8种加密模式,具体可以通过函数mcrypt_list_algorithms()和mcrypt_list_modes()来显示,结果如下:

Mcrypt支持的算法有:
cast-128 gost rijndael-128 twofish arcfour cast-256 loki97 rijndael-192 saferplus wake blowfish-compat des rijndael-256 serpent xtea blowfish enigma rc2 tripledes

Mcrypt支持的加密模式有:cbc cfb ctr ecb ncfb nofb ofb stream

这些算法和模式在应用中要以常量来表示,写的时候加上前缀MCRYPT_和MCRYPT_来表示,如下面Mcrypt应用的例子:

DES算法表示为MCRYPT_DES;
ECB模式表示为MCRYPT_MODE_ECB;

三、PHP加密扩展库Mcrypt应用
例1,
 

代码示例:
<?php
 $str = "我是李云"; 
 $key = "123qwe.019860905061X"; 
 $cipher = MCRYPT_RIJNDAEL_128; 
 $mode = MCRYPT_MODE_ECB; 
 $iv = mcrypt_create_iv(mcrypt_get_iv_size($cipher,$mode),MCRYPT_RAND); 
  
 echo "原文:".$str."<br>"; 
 $str_encrypt = mcrypt_encrypt($cipher,$key,$str,$mode,$iv); 
 echo "加密后的内容是:".$str_encrypt."<br>"; 
  
 $str_decrypt = mcrypt_decrypt($cipher,$key,$str_encrypt,$mode,$iv); 
  
 echo "解密后的内容:".$str_decrypt."<br>"; 
?>

运行结果:
原文:我是李云
加密后的内容是:B@鴹?=(I辩蝣Z%
解密后的内容:我是李云

1)、使用PHP加密扩展库Mcrypt对数据加密和解密之前,首先创建了一个初始化向量,简称为iv。由 $iv = mcrypt_create_iv(mcrypt_get_iv_size($cipher,$modes),MCRYPT_RAND);可见创建初始化 向 量需要两个参数:size指定了iv的大小;source为iv的源,其中值MCRYPT_RAND为系统随机数。

2)、函数mcrypt_get_iv_size($cipher,$modes)返回初始化向量大小,参数cipher和mode分别指算法和加 密模式。

3)、加密函数$str_encrypt = mcrypt_encrypt($cipher,$key,$str,$modes,$iv); 该函数的5个参数分 别如下:cipher——加密算法、key——密钥、data(str)——需要加密的数据、mode——算法模式、 iv——初始化向量

4)、解密函数 mcrypt_decrypt($cipher,$key,$str_encrypt,$modes,$iv); 该函数和加密函数的参数几乎 一样,唯一不同的是data,也就是说data为需要解密的数据$str_encrypt,而不是原始数据$str。

//手册里的写法:
 

代码示例:
<?php
 //指定初始化向量iv的大小: 
 $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); 
 //创建初始化向量: 
 $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 
 //加密密码: 
 $key = "123qwe.019860905061x"; 
 //原始内容(未加密): 
 $text = "My name is Adam Li!"; 
 echo $text. "<br>\n"; 
 //加密后的内容: 
 $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_ECB, $iv); 
 echo $crypttext. "\n<br>"; 
 //解密已经加密的内容: 
 $str_decrypt = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $crypttext, MCRYPT_MODE_ECB, $iv); 
 echo $str_decrypt; 
//原文链接 http://www./article/7382.html
?>

加/解密请求的例子:
 

代码示例:
<?php
 $request_params = array( 
  'controller' => 'todo', 
  'action' => 'read', 
  'username' => "bl", 
  'userpass' => "a1" 
 ); 
  
 $private_key = "28e336ac6c9423d946ba02d19c6a2632";  
  
 //encrypt request 
 $enc_request = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $private_key, json_encode($request_params), MCRYPT_MODE_ECB)); 
 echo "CRYPT:".$enc_request."<br/>"; 
  
 //decrypt request 
 $params = json_decode()(trim(mcrypt_decrypt( MCRYPT_RIJNDAEL_256, $private_key, base64_decode($enc_request), MCRYPT_MODE_ECB )),true); 
 echo "ENCRYPT:<br/>"; 
  
 //print result 
 var_dump($params); 
?>

注意:
加密和解密函数中的参数cipher、key和mode必须一一对应,否则数据不能被还原。


    
[3]php开发API接口(注册,登录,查询等)的代码示例
    来源: 互联网  发布时间: 2013-12-24

1、服务端
 

代码示例:
<?php
/**
* API接口服务端
* site http://www.
*
*/
    require 'conn.php'; 
    header('Content-Type:text/html;charset=utf-8'); 
     
    $action = $_GET['action']; 
    switch ($action) { 
     
        //注册会员 
        case"adduserinfo"; 
            $username = lib_replace_end_tag(trim($_GET['username'])); 
            $password2 = lib_replace_end_tag(trim($_GET['userpassword'])); 
            $password = md5("$password2" . ALL_PS); 
            $email = lib_replace_end_tag(trim($_GET['email'])); 
     
            if ($username == '' || $password2 == '' || $password == '') { 
                $res = urlencode("参数有误"); 
                exit(json_encode($res)); //有空信息 
            } 
     
            $sql = "select username from `member` where username='$username'"; 
            $query = mysql_query()($sql, $conn); 
            $count = mysql_num_rows($query); 
     
            if ($count > 0) { 
                exit(json_encode(1)); //返回1表示注册失败 
            } else { 
     
                $addsql = "insert into `member` (username,password,email) values ('$username','$password','$email')"; 
                mysql_query($addsql); 
                exit(json_encode(0)); //返回0表示注册成功 
            } 
            break;
     
        //查询用户信息 
        case"selectuserinfo"; 
            $username = lib_replace_end_tag($_GET['username']); 
            $sql = "select id,username,nickname,mobile from `member` where username='$username'"; 
            $query = mysql_query($sql, $conn); 
            $row = mysql_fetch_array($query); 
            foreach ($row as $key => $v) { 
                $res[$key] = urlencode($v); 
            } 
            exit(json_encode($res)); 
            break;
     
        //会员登录 
        case"userlogin"; 
            $username = lib_replace_end_tag($_GET['username']); 
            $password2 = lib_replace_end_tag(trim($_GET['userpassword'])); 
            $password = md5("$password2" . ALL_PS); 
            $sqluser = "select id,username,password from `member` where username='" . $username . "' and password='" . $password . "'"; 
            $queryuser = mysql_query($sqluser); 
            $rowuser = mysql_fetch_array($queryuser); 
            if ($rowuser && is_array($rowuser) && !emptyempty($rowuser)) { 
                if ($rowuser['username'] == $username && $rowuser['password'] == $password) { 
                    if ($rowuser['password'] == $password) { 
                        $res = urlencode("登录成功"); 
                        exit(json_encode($res)); 
                    } else { 
                        $res = urlencode("密码错误"); 
                        exit(json_encode($res)); 
                    } 
                } else { 
                    $res = urlencode("用户名不存在"); 
                    exit(json_encode($res)); 
                } 
            } else { 
                $res = urlencode("用户名密码错误"); 
                exit(json_encode($res)); 
            } 
            /*
             * 0:表示登录成功,1:表示密码错误,2:用户名不存在,3:用户名密码错误
             */ 
            break; 
     
        default: 
            exit(json_encode(error)); 
    }  
?> 

2、客户端例子:
 

代码示例:
<?php     
/**
 * 客户端调用API
* site http://www.
*/
    header('Content-Type:text/html;charset=utf-8'); //避免输出乱码 
     
    function httpPost($url, $parms) { 
        $url = $url . $parms; 
        if (($ch = curl_init($url)) == false) { 
            throw new Exception(sprintf()("curl_init error for url %s.", $url)); 
        } 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
        curl_setopt($ch, CURLOPT_HEADER, 0); 
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 600); 
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
        if (is_array($parms)) { 
            curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data;')); 
        } 
        $postResult = @curl_exec($ch); 
        $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
        if ($postResult === false || $http_code != 200 || curl_errno($ch)) { 
            $error = curl_error($ch); 
            curl_close($ch); 
            throw new Exception("HTTP POST FAILED:$error"); 
        } else { 
            // $postResult=str_replace()("\xEF\xBB\xBF", '', $postResult); 
            switch (curl_getinfo($ch, CURLINFO_CONTENT_TYPE)) { 
                case 'application/json': 
                    $postResult = json_decode()($postResult); 
                    break; 
            } 
            curl_close($ch); 
            return $postResult; 
        } 
    } 
     
    $postUrl = "http://pujia.test.com/api/server.php"; 
     
    $p=$_GET['p']; 
    if ($p =="selectuserinfo") { 
     
        $username = $_GET['username']; 
        $parms = "?action=selectuserinfo&username=" . $username . ""; 
     
    } elseif ($p =="adduserinfo") { 
     
        $username = $_GET['username']; 
        $userpassword = $_GET['userpassword']; 
        $parms = "?action=adduserinfo&username=" . $username . "&userpassword=" . $userpassword . ""; 
     
    } elseif ($p =="userlogin") { 
        $username = $_GET['username']; 
        $userpassword = $_GET['userpassword']; 
        $parms = "?action=userlogin&username=" . $username . "&userpassword=" . $userpassword . ""; 
     
    } 
    $res = httpPost($postUrl, $parms); //$parms 
    $res = json_decode($res); 
    print_r(urldecode(json_encode($res))); 
?>

以上就是今天php 教程给出的示例代码,用php开发简单的API接口,希望对大家有所帮助。
,专为心你每一天。


    
最新技术文章:
▪PHP函数microtime()时间戳的定义与用法
▪PHP单一入口之apache配置内容
▪PHP数组排序方法总结(收藏)
▪php数组排序方法大全(脚本学堂整理奉献)
▪php数组排序的几个函数(附实例)
▪php二维数组排序(实例)
▪php根据键值对二维数组排序的小例子
▪php验证码(附截图)
▪php数组长度的获取方法(三个实例)
▪php获取数组长度的方法举例
▪判断php数组维度(php数组长度)的方法
▪php获取图片的exif信息的示例代码
▪PHP 数组key长度对性能的影响实例分析
▪php函数指定默认值的方法示例
▪php提交表单到当前页面、提交表单后页面重定...
▪php四舍五入的三种实现方法
▪php获得数组长度(元素个数)的方法
▪php日期函数的简单示例代码
▪php数学函数的简单示例代码
▪php字符串函数的简单示例代码
▪php文件下载代码(多浏览器兼容、支持中文文...
▪php实现文件下载、支持中文文件名的示例代码...
▪php文件下载(防止中文文件名乱码)的示例代码
▪解决PHP文件下载时中文文件名乱码的问题
▪php数组去重(一维、二维数组去重)的简单示例
▪php小数点后取两位的三种实现方法
▪php Redis 队列服务的简单示例
▪PHP导出excel时数字变为科学计数的解决方法
▪PHP数组根据值获取Key的简单示例
▪php数组去重的函数代码示例
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3