欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

php session跨域跨服务器的解决方法分享

程序员文章站 2022-05-05 13:47:54
...
为大家介绍下php中session如何实现跨域与跨服务器共享的解决方法,有需要的朋友,可以参考下。

除了asp.net外,所有session的保留都必须借助session id。 Session的保存位置主要有:共享文件、数据库、memcache。

Session id的传递主要有四种方法: 1、通过cookie。 2、设置php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项,让PHP自动跨页传递session id。 3、手动通过url或隐藏表单传值。 4、用文件或数据库方式传递,在通过其他key对应取值。 以上的2和3其实使用的是同样的方法,只是途径不一样。 从以上的分析可得看出,通过cookie传递session id,将session存储于memcache服务器中是为一个比较合理的选择。 当出现跨域的情况是,可以使用p3p跨域设置cookie。 而当客户端禁用cookie的情况下,可以设置php.ini,通过url自动传递session id。

以通行证为例,探讨其逻辑实现过程(视需求而定,而如果要保证接口的一致性,同时对其他服务器屏蔽session服务器,所有的登陆和获取session信息可以都通过登录服务器进行中转,不过这自然会有时间的延误和登录服务器宕机引起的全站瘫痪风险): 包含服务和应用:登陆服务器,保存session的memcache服务器,应用服务器,公钥,密钥 1)、对于可信任服务器: 可以通过登陆公钥加密用户提交的用户名、密码等信息,,直接从客户端提交登录服务器,或通过rpc调用提交登陆服务器,进行用户登陆。

登录服务器将获取登陆用户的相关信息,以session的方式存于session服务器,并以p3p方式在客户端cookie中设置所有域名下的session id,session id以session加密公钥方式进行加密。如果使用的是rpc调用,则由本台服务器设置客户端cookie。如果没有将所有的域名都进行设置,可能出现的情况是,没有设置的域名下的模块需要单独重新登录。(cookie不可用的情况将全部使用url传递使用session加密公钥加密过的session id,也不存在跨域问题。)

登录之后,客户端通过session解密公钥,解密通过cookie或url传递的session id,并通过此id从session服务器获取对应session信息,在各模块间漫游。(也可以统一通过登录服务器读取session信息。Session服务器可以使用多机定时备份,防止宕机或改服务重启引起的用户登陆session丢失问题。)

2)、对于非可信任的合作用户: 可以通过api接口传递用户名,密码或/和验证码等相关参数。验证码可以是双方确认的某一key,或用户资料等信息。 登录服务器验证确认来源之后,产生一个一次性使用的密钥,返回调用端。 密钥由请求端和登录服务器共同保存和维持,其他相关需要保存和维持的信息由请求端完成。 后面实现同(1)与(1)的主要不同在于: 1).必须先确认请求身份; 2).使用密钥而不使用公钥; 3).读取session必须通过登录服务器。

希望以上的讲述,对大家有所启发,在解决session跨域跨服务器的问题上能带来点滴的帮助。