“异域名 存取 session”的问题,一个巨迷惑人的问题。(大家都来挑战这个问题) 我认为你可以通过sessionid来处理这个问题 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1、设置两域为信任域,并指定session的域为其中之一2、可通过显式的传递sessionid来解决,条件是两站在同一机器上,或两站使用同一数据库存放session 也在考虑有没有更好的办法。用cookie 好了,不用考虑服务器的问题 我也在考虑这个问题。很是郁闷。如何设置信任域?session 如何指定域?? 唠叨大哥,我的二级域名怎么设置信任域呀?我的session是在文件中存放的,我的主机域名是wwcec.net,设置www,search,reg等多个二级域名,现在session在www.wwcec.net中完全正常,但是在search.wwcec.net、reg.wwcec.net、service.wwcec.net中不能正常使用。我用session进行登录验证,在www.wwcec.net中登录后,跳转search.wwcec.net或者service.wwcec.net中都不能显示登录后的信息,这该怎么办呀?我不想用Cookie来解决问题,请教高手有没有好的办法? 如何显式传递sessionid?我的站点用同一个数据库,而且网页在一台机器上。 不知道这个程序能否实现跨域访问session<? //config 开始 $session_cfg['host']='localhost'; // ← MySQL 服务器的 host $session_cfg['port']='3306'; // ← MySQL 服务器的端口号,默认为 3306 $session_cfg['user']='session_user'; // ← MySQL 登录用户名 $session_cfg['user_passwd']='12345'; // ← MySQL 登录用户的密码 $session_cfg['db']='sessiondb'; // ← MySQL 中存放session数据的数据库名 $session_cfg['pconnect']=true; // ← 是否使用 持续连接 连接 MySQL,建议设为 // 持续连接 $session_cfg['expires']=20; // ← Session 生存周期,即用户离开本站后 // 多长时间算其已经 timeout $session_cfg['cookie_name']='SESSION_ID'; // ← Session 所使用的 cookie 名称 $session_cfg['cookie_path']='/'; // ← Session 所使用的 cookie 的路径 $session_cfg['cookie_domain']=''; // ← Session 所使用的 cookie 域名,例如设为 // 'test.com',那么用户在访问任何以 // test.com 结尾的主机时此 Session // 都有效,如 aa.test.com 、 bb.test.com //config 结束 //↓假若需要,请在此文件中写 session_onstart() 和 session_onend() 处理函数 require('global.php'); //↓以下是所有函数定义 function session_init(){ //此函数初始化一个 Session ,并调用 session_onstart() 函数 global $session_cfg,$s_link,$HTTP_SERVER_VARS; $session_id=md5(uniqid(rand())); //↑生成唯一的 Session ID,并发送 cookie ,使 client 的 cookie 与服务器 // 端 session 数据对应 setcookie($session_cfg['cookie_name'],$session_id,'',$session_cfg['cookie_path'], $session_cfg['cookie_domain']); mysql_query("insert into session values('".$session_id."','".$client_ip. "',now(),now(),'')",$s_link); //初始化数据库中 Session //↓为方便用户获取 Session ID,将 Session ID、Client IP、开始时间和最后活动时间 // 放入 session 数组 $session['id']=$session_id; $session['client_ip']=$HTTP_SERVER_VARS['REMOTE_ADDR']; 也放进去 $session['last_active_time']=$session['start_time']=date('Y-m-d H:i:s'); if(function_exists('session_onstart')){ //假若用户定义了session_onstart,那么调用它! session_onstart(); } return $session; //返回 session 数组 } //↓此函数在本程序最后注册为 shutdown function,即在页面执行完后调用, // 将 Session 数据保存至数据库 function save_data(){ global $session,$s_link,$HTTP_SERVER_VARS; $session_id=$session['id']; unset($session['id']); //↙不要的保存前都删掉:) unset($session['client_ip']); unset($session['last_active_time']); unset($session['start_time']); $sql="update session set client_ip='".$HTTP_SERVER_VARS['REMOTE_ADDR']. "',session_data='".addslashes(serialize($session)). "',last_active_time=now() where session_id='".$session_id."'"; //↗将 session 数组 用函数 serialize() 后会将所有数据变成一个string, // 可用 unserialize() 将其恢复。 mysql_query($sql,$s_link); } function unload_session(){ //相当于 session_destroy() ,销毁当前的 Session 数据 global $session,$s_link; if(function_exists('session_onend')) session_onend(); mysql_query("delete from session where session_id='".$session['id']."'",$s_link); } function read_application_data(){ //读取 Application 共享数据 global $s_link; $tmpstr=mysql_result(mysql_query("select * from application",$s_link),0,0); $application=unserialize($tmpstr); return $application; } to : fzjw(清风) "我的二级域名怎么设置信任域呀?我的session是在文件中存放的,我的主机域名是wwcec.net,设置www,search,reg等多个二级域名,现在session在www.wwcec.net中完全正常,但是在search.wwcec.net、reg.wwcec.net、service.wwcec.net中不能正常使用。我用session进行登录验证,在www.wwcec.net中登录后,跳转search.wwcec.net或者service.wwcec.net中都不能显示登录后的信息,这该怎么办呀?我不想用Cookie来解决问题,请教高手有没有好的办法?"在页面中加入:<script>document.domain = "wwcec.net"</script>设置php.ini的session.cookie_domain="wwcec.net"应该也是可以的,试试? 好的,去试试。谢谢先刚才那个函数没有贴完,出处在这里:用 PHP + MySQL 实现跨域名 Session 功能(一) http://bbs.iwebhome.net/index.php?showtopic=332&hl=跨域用 PHP + MySQL 实现跨域名 Session 功能(二) http://bbs.iwebhome.net/index.php?showtopic=333&hl=跨域用 PHP + MySQL 实现跨域名 Session 功能(源码) http://bbs.iwebhome.net/index.php?showtopic=334&hl=跨域继续贴出后半部分:function application_lock(){ //锁定 Application ,准备更新 global $application,$s_link; mysql_query('lock tables application write',$s_link); $application=read_application_data(); //重新读取 Application 数据 } function application_unlock(){ //解锁并更新 Application 数据 global $application,$s_link; mysql_query("update application set data='".addslashes(serialize($application))."'",$s_link); mysql_query('unlock tables',$s_link); } //以下是主程序 //↓根据 session_cfg 的设定判断用不用 持续连接 $db_connect=$session_cfg['pconnect'] ? 'mysql_pconnect' : 'mysql_connect'; //↓连接数据库 $s_link=@$db_connect($session_cfg['host'].':'.$session_cfg['port'],$session_cfg['user'], $session_cfg['user_passwd']); @mysql_select_db($session_cfg['db'],$s_link); if(@mysql_error()) die('错误:MySQL 数据库连接失败!'); //↓读取 cookie 中 Session ID $session_id=isset($HTTP_COOKIE_VARS[$session_cfg['cookie_name']]) ? $HTTP_COOKIE_VARS[$session_cfg['cookie_name']] : ''; //↓调用 session_onend() (假若你在 global.php 中定义了的话)处理 Session 的结束工作 if(function_exists('session_onend')){ $s_sql="select * from session where last_active_time<date_add(now(),interval -".$session_cfg['expires']." minute)"; $s_res=mysql_query($s_sql,$s_link); if(mysql_num_rows($s_res)!=0){ while($s_row=mysql_fetch_array($s_res)){ $session=unserialize($s_row['session_data']); $session['id']=$s_row['session_id']; $session['client_ip']=$s_row['client_ip']; $session['last_active_time']=$s_row['last_active_time']; $session['start_time']=$s_row['start_time']; session_onend(); } unset($session); } } //↓将超时的 Session 踢出! mysql_query("delete from session where last_active_time<date_add(now(),interval -". $session_cfg['expires']." minute)",$s_link); if($session_id==''){ //怎么?第一次来?初始一个! $session=session_init(); }else{ $s_res=mysql_query("select * from session where session_id='".$session_id."'"); if(mysql_num_rows($s_res)==0){ //用户已离开超过 session_cfg 中设定的生存周期 $session_is_timeout=true; //注意一下,可通过此变量判断用户是否为timeout! $session=session_init(); }else{ //↓读取 Session 数据 $s_row=mysql_fetch_array($s_res); $session=unserialize($s_row['session_data']); $session['id']=$session_id; $session['client_ip']=$s_row['client_ip']; $session['last_active_time']=$s_row['last_active_time']; $session['start_time']=$s_row['start_time']; } } $application=read_application_data(); //←读取 Application 数据 //↓当本页结束时,执行 save_data() 保存 Session 数据 register_shutdown_function('save_data'); ?> 小弟非常感谢“唠叨”大哥,你的办法真好,都怪我自己不动脑筋,在设置了session_cookie_domain后就完全好了,只有reg.wwcec.net不行,我的注册系统是运行在SSL上的,也许和SSL有关,不过反正注册不需要登录,搞定了,再次谢谢唠叨大哥。^-^ 问题的根源是浏览器的session id的传递。一般情况下是通过cookie来传递session id的。如果禁用cookie php会重写a=href,area=href,frame=src,input=src,form=fakeentry 等链接或表单,并把id通过get方式来传递。 用数据库保存session,通过sessionid找到相对应的session value 2、可通过显式的传递sessionid来解决,条件是两站在同一机器上,或两站使用同一数据库存放session支持! 在一台电脑上iis Apache 公用php可以吗?怎样配置 关于ajax缓存 大家帮帮忙 有没有谁做过paypal接口的开发 如取得 指定日期内的 交易的数据 怎么一次把数据插入不同的两个表呢? php监控服务器怎么实现比较好? PHP 问题 怎麼把 $_POST[] 中的內容全部輸出來檢查? 在线等:怎么才能把cookie值保存?我的系统总是跳出“你的机子的cookie功能关闭......” 有关session的问题 请问在php中写js是如何写的?? PHP中如何取得一个目录下的所有的文件和目录 上传缩略图出错,请大家看一下
2、可通过显式的传递sessionid来解决,条件是两站在同一机器上,或两站使用同一数据库存放session
用cookie 好了,不用考虑服务器的问题
<?
//config 开始 $session_cfg['host']='localhost'; // ← MySQL 服务器的 host
$session_cfg['port']='3306'; // ← MySQL 服务器的端口号,默认为 3306
$session_cfg['user']='session_user'; // ← MySQL 登录用户名
$session_cfg['user_passwd']='12345'; // ← MySQL 登录用户的密码
$session_cfg['db']='sessiondb'; // ← MySQL 中存放session数据的数据库名
$session_cfg['pconnect']=true; // ← 是否使用 持续连接 连接 MySQL,建议设为
// 持续连接
$session_cfg['expires']=20; // ← Session 生存周期,即用户离开本站后
// 多长时间算其已经 timeout
$session_cfg['cookie_name']='SESSION_ID'; // ← Session 所使用的 cookie 名称
$session_cfg['cookie_path']='/'; // ← Session 所使用的 cookie 的路径
$session_cfg['cookie_domain']=''; // ← Session 所使用的 cookie 域名,例如设为
// 'test.com',那么用户在访问任何以
// test.com 结尾的主机时此 Session
// 都有效,如 aa.test.com 、 bb.test.com //config 结束
//↓假若需要,请在此文件中写 session_onstart() 和 session_onend() 处理函数
require('global.php');
//↓以下是所有函数定义 function session_init(){ //此函数初始化一个 Session ,并调用 session_onstart() 函数
global $session_cfg,$s_link,$HTTP_SERVER_VARS;
$session_id=md5(uniqid(rand()));
//↑生成唯一的 Session ID,并发送 cookie ,使 client 的 cookie 与服务器
// 端 session 数据对应
setcookie($session_cfg['cookie_name'],$session_id,'',$session_cfg['cookie_path'],
$session_cfg['cookie_domain']);
mysql_query("insert into session values('".$session_id."','".$client_ip.
"',now(),now(),'')",$s_link); //初始化数据库中 Session
//↓为方便用户获取 Session ID,将 Session ID、Client IP、开始时间和最后活动时间
// 放入 session 数组
$session['id']=$session_id;
$session['client_ip']=$HTTP_SERVER_VARS['REMOTE_ADDR']; 也放进去
$session['last_active_time']=$session['start_time']=date('Y-m-d H:i:s');
if(function_exists('session_onstart')){ //假若用户定义了session_onstart,那么调用它!
session_onstart();
}
return $session; //返回 session 数组
}
//↓此函数在本程序最后注册为 shutdown function,即在页面执行完后调用,
// 将 Session 数据保存至数据库
function save_data(){
global $session,$s_link,$HTTP_SERVER_VARS;
$session_id=$session['id'];
unset($session['id']); //↙不要的保存前都删掉:)
unset($session['client_ip']);
unset($session['last_active_time']);
unset($session['start_time']);
$sql="update session set client_ip='".$HTTP_SERVER_VARS['REMOTE_ADDR'].
"',session_data='".addslashes(serialize($session)).
"',last_active_time=now() where session_id='".$session_id."'";
//↗将 session 数组 用函数 serialize() 后会将所有数据变成一个string,
// 可用 unserialize() 将其恢复。
mysql_query($sql,$s_link);
} function unload_session(){ //相当于 session_destroy() ,销毁当前的 Session 数据
global $session,$s_link;
if(function_exists('session_onend')) session_onend();
mysql_query("delete from session where session_id='".$session['id']."'",$s_link);
} function read_application_data(){ //读取 Application 共享数据
global $s_link;
$tmpstr=mysql_result(mysql_query("select * from application",$s_link),0,0);
$application=unserialize($tmpstr);
return $application;
}
"我的二级域名怎么设置信任域呀?我的session是在文件中存放的,我的主机域名是wwcec.net,设置www,search,reg等多个二级域名,现在session在www.wwcec.net中完全正常,但是在search.wwcec.net、reg.wwcec.net、service.wwcec.net中不能正常使用。我用session进行登录验证,在www.wwcec.net中登录后,跳转search.wwcec.net或者service.wwcec.net中都不能显示登录后的信息,这该怎么办呀?我不想用Cookie来解决问题,请教高手有没有好的办法?"在页面中加入:
<script>
document.domain = "wwcec.net"
</script>设置php.ini的
session.cookie_domain="wwcec.net"
应该也是可以的,试试?
http://bbs.iwebhome.net/index.php?showtopic=332&hl=跨域用 PHP + MySQL 实现跨域名 Session 功能(二)
http://bbs.iwebhome.net/index.php?showtopic=333&hl=跨域用 PHP + MySQL 实现跨域名 Session 功能(源码)
http://bbs.iwebhome.net/index.php?showtopic=334&hl=跨域继续贴出后半部分:function application_lock(){ //锁定 Application ,准备更新
global $application,$s_link;
mysql_query('lock tables application write',$s_link);
$application=read_application_data(); //重新读取 Application 数据
} function application_unlock(){ //解锁并更新 Application 数据
global $application,$s_link;
mysql_query("update application set data='".addslashes(serialize($application))."'",$s_link);
mysql_query('unlock tables',$s_link);
} //以下是主程序 //↓根据 session_cfg 的设定判断用不用 持续连接
$db_connect=$session_cfg['pconnect'] ? 'mysql_pconnect' : 'mysql_connect'; //↓连接数据库
$s_link=@$db_connect($session_cfg['host'].':'.$session_cfg['port'],$session_cfg['user'],
$session_cfg['user_passwd']); @mysql_select_db($session_cfg['db'],$s_link);
if(@mysql_error()) die('错误:MySQL 数据库连接失败!'); //↓读取 cookie 中 Session ID
$session_id=isset($HTTP_COOKIE_VARS[$session_cfg['cookie_name']]) ?
$HTTP_COOKIE_VARS[$session_cfg['cookie_name']] : '';
//↓调用 session_onend() (假若你在 global.php 中定义了的话)处理 Session 的结束工作
if(function_exists('session_onend')){
$s_sql="select * from session where last_active_time<date_add(now(),interval -".$session_cfg['expires']." minute)";
$s_res=mysql_query($s_sql,$s_link);
if(mysql_num_rows($s_res)!=0){
while($s_row=mysql_fetch_array($s_res)){
$session=unserialize($s_row['session_data']);
$session['id']=$s_row['session_id'];
$session['client_ip']=$s_row['client_ip'];
$session['last_active_time']=$s_row['last_active_time'];
$session['start_time']=$s_row['start_time'];
session_onend();
}
unset($session);
}
} //↓将超时的 Session 踢出!
mysql_query("delete from session where last_active_time<date_add(now(),interval -".
$session_cfg['expires']." minute)",$s_link); if($session_id==''){ //怎么?第一次来?初始一个!
$session=session_init();
}else{
$s_res=mysql_query("select * from session where session_id='".$session_id."'");
if(mysql_num_rows($s_res)==0){ //用户已离开超过 session_cfg 中设定的生存周期
$session_is_timeout=true; //注意一下,可通过此变量判断用户是否为timeout!
$session=session_init();
}else{
//↓读取 Session 数据
$s_row=mysql_fetch_array($s_res);
$session=unserialize($s_row['session_data']);
$session['id']=$session_id;
$session['client_ip']=$s_row['client_ip'];
$session['last_active_time']=$s_row['last_active_time'];
$session['start_time']=$s_row['start_time'];
}
} $application=read_application_data(); //←读取 Application 数据 //↓当本页结束时,执行 save_data() 保存 Session 数据
register_shutdown_function('save_data'); ?>