- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章PHP中session跨子域的三种实现方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
在之前做东西的时候session一般就直接存在数据库中这样就能解决跨域不仅仅是跨子域,但是今天遇到这个问题是,自己要在别人现有的东西上面做修改。由于仅仅是子域当时就想肯定有简单的解决方法,度娘了找到了三种解决办法:
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 服务器生成的则是222222。另外,php 的 session数据都是分别保存在本服务器的文件系统中。想要共享 session 数据,那就必须实现两个目标:
一个是各个服务器对同一个客户端产生的session id 必须相同,并且可通过同一个 cookie 进行传递,也就是说各个服务器必须可以读取同一个名为 phpsessid 的cookie; 。
另一个是 session 数据的存储方式/位置必须保证各个服务器都能够访问到。这两个目标简单地说就是多服务器(a、b服务器)共享客户端的 session id,同时还必须共享服务器端的 session 数据.
有三种解决方法:
1.只要在php页面的最开始(要在任何输出之前,并且在session_start()之前)的地方进行以下设置 。
1
2
3
|
ini_set
(
'session.cookie_path'
,
'/'
);
ini_set
(
'session.cookie_domain'
,
'.mydomain.com'
);
ini_set
(
'session.cookie_lifetime'
,
'1800'
);
|
2.在php.ini里设置 。
1
2
3
|
session.cookie_path = /
session.cookie_domain = .mydomain.com
session.cookie_lifetime = 1800
|
3.在php页面最开始的地方(条件同1)调用函数 。
1
|
session_set_cookie_params(1800 ,
'/'
,
'.mydomain.com'
);
|
session 有个session_id 作为session的惟一标志.
要实现session子域,实际上是在同一个浏览器中在访问两个a 和b子域时,其session是相同的.
由于session都是保存在服务器端,如何让两台服务器识别这两个请求是由一个浏览器发出的呢?
cookie是保存在客户端的,服务器通常通过cookie来识别不同的客户端,因此,可以使用cookie来保存session_id, 并将该cookie设置为父域.
例如,当访问a.sso.com 时,就将session_id 保存在cookie中。当访问b.sso.com时,则将session_id 从cookie中取出来, 。
并通过session_id 去某个持久化容器中获取session.
例如,当访问a.sso.com 时,就将session_id 保存在cookie中。当访问b.sso.com时,则将session_id 从cookie中取出来, 。
并通过session_id 去某个持久化容器中获取session.
在本实验中,使用php来作为实验语言.
当访问a.sso.com时,则将通过 。
1
2
3
4
|
session_start();
$_session
[
'person'
] =
"sbsbsbs"
;
$session_id
= session_id();
setcookie(
'name'
,
$session_id
,time()+3600*24,
'/'
,
'sso.com'
);
|
将session_id 保存在cookie中.
由于在php中,session是一个数组,php有 serialize() 函数,将数组序列化 。
1
|
$session_value
= serialize(
$_session
);
|
然后将$session_value 保存在数据库中.
在访问b.sso.com时,则从cookie中获取到session_id,然后到数据库中根据session_id将 经过序列化过的session 获取出来 。
接着就可以对该session进行操作,实现session 跨子域.
由于将session保存在数据库中,存取都是比较费时的操作,因此可以将session保存在缓存中,例如memcached 或者redis中, 。
这样对session的存取操作就比较快速了.
使用缓存还有个好处就是,通常session有一定得存活时间,如果存在数据库中,还需要保存该session的存活时间,在取出session时,还需要判断其是否失效.
使用缓存存放session就可以在存放的时候设置其存活时间,减少了取出后的失效判断这一个过程.
我的解决方法是在入口出添加如下代码:
1
2
3
4
5
|
ini_set
(
'session.cookie_path'
,
'/'
);
ini_set
(
'session.cookie_domain'
,
'.jb51.net'
);
//注意jb51.net换成你自己的域名
ini_set
(
'session.cookie_lifetime'
,
'1800'
);
|
如图:
站点一 。
站点二 。
。
可以看到两个站点的phpsessid是一样的,当然也解决了跨子域名的问题了 。
以上就是在php中session实现跨子域的几种解决方案,希望能帮助到有需要的大家.
最后此篇关于PHP中session跨子域的三种实现方法的文章就讲到这里了,如果你想了解更多关于PHP中session跨子域的三种实现方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!