本帖最后由 zhuyuejianke 于 2012-01-11 00:54:28 编辑

解决方案 »

  1.   


    2。楼主搜索下jquery  jsonp   我以前也越到过此问题   就是用它解决的
      

  2.   

    1. document.domain   
      

  3.   

    问题一:
    稍微大一点的网站,通常都会有不只一个服务器,每个服务器运行着不同的功能模块或者不同的子系统,他们使用不同的二级域名,比如www.a.com、i.a.com、bbs.a.com。而一个整体性强的网站,用户系统是统一的,即一套用户名、密码在整个网站的各个子系统中都是可以登录使用的。各个服务器共享用户数据是比较容易实现的,只需要在后端放个数据库服务器,各个服务器通过统一接口对用户数据进行访问即可。但还存在一个问题,就是用户在i.a.com登录之后,进入www.a.com时,仍然需要重新登录,基本的通行证的问题,映射到技术上,其实就是各个服务器之间如何实现共享 SESSION 数据的问题。
    为了解决这个问题,我们采用将 SESSION 的数据保存数据库的方式。关于PHP SESSION的扫盲这里就不在累赘。在默认情况下,各个服务器会各自分别对同一个客户端产生 SESSION ID,如对于同一个用户浏览器,www.a.com系统产生的 SESSION ID 是a0211e9de3192ba6c22992d27a1b6a0a,而i.a.com生成的则是277003f262f0c366946a86a28ba431d8。另外,PHP 的 SESSION 数据都是分别保存在本服务器的文件系统中。
    想要共享 SESSION 数据,那就必须实现两个目标:www.a.com和i.a.com所产生的SESSION ID相同,并且可通过同一个 COOKIE 进行传递,也就是说各个服务器必须可以读取同一个名为 PHPSESSID 的 COOKIE;另一个是 SESSION 数据必须存放在一个各个系统都能访问到的地方。简单地说就是多服务器共享客户端的 SESSION ID,同时还必须共享服务器端的 SESSION 数据。
    第一个目标的实现其实很简单,只需要对 COOKIE 的域(domain)进行特殊地设置即可,默认情况下,COOKIE 的域是当前服务器的域名/IP 地址,而域不同的话,各个服务器所设置的 COOKIE 是不能相互访问的,如 www.a.com 的服务器是不能读写 www.b.com 服务器设置的 COOKIE 的。这里我们所说的同一网站的服务器有其特殊性,那就是他们同属于同一个一级域,如:www.a.com 和 i.a.com 都属于域 .a.com,那么我们就可以设置 COOKIE 的域为 .a.com,这样 www.a.com、i.aaa.com 等等都可以访问此 COOKIE。PHP 代码中的设置方法如下:
    1
    ini_set('session.cookie_domain', '.a.com');
    这样各个系统共享同一客户端 SESSION ID 的目的就达到了,下面就是共享SESSION数据,我们就将SESSION数据放在数据库中,首先建立数据库表:
    1
    CREATE TABLE sessions (
    2
     session_id varchar(32) NOT NULL,
    3
     session_last_access int(10) unsigned,
    4
     session_data text,
    5
     PRIMARY KEY (session_id)
    session_id为主键,保存SESSION ID ,session_last_access是SESSION最后更新时间,session_data是SESSION数据。
    PHP 提供了session_set_save_handle() 函数,可以用此函数自定义 SESSION 的处理过程,当然首先要先将 session.save_handler 改成 user,可在 PHP 中进行设置:
    接下来着重讲一下 session_set_save_handle() 函数,此函数有六个参数:
    session_set_save_handler ( string open, string close, string read, string write, string destroy, string gc )
    各个参数为各项操作的函数名,这些操作依次是:打开、关闭、读取、写入、销毁、垃圾回收。
      

  4.   

    问题二:
    静态页面不可避免的失去了交互性能,例如:无法统计信息的阅读次数,无法得到Session信息等等.但也并非没有解决的办法,思路是将整张静态页面分割成若干张小页面,小页面依旧可以是.html静态页面,也可以是.php动态页面.例如,可以嵌套某一零高度零宽度的.php文件专门用作统计信息的阅读次数。若信息量比较大,.html静态页面占用硬盘容量也会随之增大.将静态页面共有的部分组织成一张新的.html页面,再令所有静态页面嵌套这样一个文件有助于降低页面体积.(注意该体积只能降低页面的文件大小,无助于提高访问效率)
    问题三:
    在开始讨论 Cookie 的技术细节之前,我想先介绍一下 Cookie 应用的几条限制。大多数浏览器支持最多可达 4096 字节的 Cookie,如果要将为数不多的几个值保存到用户计算机上,这一空间已经足够大,但您不能用一个 Cookie 来保存数据集或其他大量数据。在实际应用中,用户可能并不希望在 Cookie 中保存大量的用户信息,而只希望保存用户编号或其他标识符。之后,当用户再次访问您的站点时,您就可以使用该用户ID 在数据库中查找用户的详细信息。(有关保存用户信息的说明,请参阅 Cookie 和安全性。)
      

  5.   

    问题四:
    如果修改PHP的session保存方式?PHP提供了session_set_save_handler用来改变默认的session保存方式 ,查看手册说明如下定义:
    bool session_set_save_handler ( callback $open, callback $close, callback $read, callback $write, callback $destroy, callback $gc )
    返回的是bool类型,参数全是一些回调函数,如果你还不知道什么是回调函数,请自己查阅相关的资料弄懂它;当你使用session时,会发生以下session事件:Open : 当你呼叫session_start() 时触发这个事件,在任何使用session前,必须得呼叫此函数;
    close : 当页面执行完毕时,触发这个事件;
    read , write当你呼叫session_start()后,先会激活read事件,随后,在页面结束前,会激活write事件,以便将session信息保存到媒介中;
    destroy : 执行unset($_SESSION[‘key’]) 时,将激活此事件
      

  6.   

    zy205817 说的我都懂,但是可能我问的问题没问清楚,没法解决我实际的问题,能加QQ聊吗?我给你发消息
      

  7.   

    只需设置 session.cookie_domain
    就可以使 session 生效于同一域的各个子域如果多个子域处于不同的服务器中,那么就需要将 session 数据记录于数据库中如何将 session 存储于数据库中,请认真阅读 session_set_save_handler 函数的说明和示例
      

  8.   


    您说的这种情况我了解了。我补充一种情况就是静态页,如何实现ajax登录退出。因为ajax调用的php不能使用session和cookie是吗?
      

  9.   

    静态页面是不可以的。除非你用模板进行一个替换,来显示session和cookies保存的值。