PHP session 跨子域问题

今天,做项目时候遇到个问题。之前做东西的时候session一般就直接存在数据库中这样就能解决跨域

不仅仅是跨子域,但是今天遇到这个问题是,自己要在别人现有的东西上面做修改。由于仅仅是子域

当时就行肯定有简单的解决方法,度娘了10多分钟搞定:

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()之前)的地方进行以下设置
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‘);

我的解决方法是在入口出添加如下代码:

ini_set(‘session.cookie_path‘, ‘/‘);

ini_set(‘session.cookie_domain‘, ‘.domain.com‘); //注意domain.com换成你自己的域名

ini_set(‘session.cookie_lifetime‘, ‘1800‘);

如图:

站点一

站点二

可以看到两个站点的PHPSESSID是一样的,当然也解决了跨子域名的问题了

时间: 2024-10-08 22:14:47

PHP session 跨子域问题的相关文章

PHP session 跨子域问题总结

Session主要分两部分:一个是Session数据,该数据默认情况下是存放在服务器的tmp文件下的,是以文件形式存在另一个是标志着Session数据的Session Id,Session ID,就是那个 Session 文件的文件名,Session ID 是随机生成的,因此能保证唯一性和随机性,确保 Session 的安全.一般如果没有设置 Session 的生存周期,则 Session ID 存储在内存中,关闭浏览器后该 ID 自动注销,重新请求该页面后,重新注册一个 session ID.

PHP session如何实现跨子域?

跨域问题在cooike及session中我们经常会使用到了,不过php对于子域处理是比较简单的了,我们有许多的一些办法,下面来整理一下,希望对大家的php学习有帮助吧. Session主要分两部分: 一个是Session数据,该数据默认情况下是存放在服务器的tmp文件下的,是以文件形式存在. 另一个是标志着Session数据的Session Id,Session ID,就是那个 Session 文件的文件名,Session ID 是随机生成的,因此能保证唯一性和随机性,确保 Session 的安

php 跨域、跨子域,跨服务器读取session

1.跨子域和跨服务器解决方式 Session主要分两部分:   一个是Session数据,该数据默认情况下是存放在服务器的tmp文件下的,是以文件形式存在    另一个是标志着Session数据的Session Id,Session ID,就是那个 Session 文件的文件名,Session ID 是随机生成的,因此能保证唯一性和随机性,确保 Session 的安全.一般如果没有设置 Session 的生存周期,则 Session ID 存储在内存中,关闭浏览器后该 ID 自动注销,重新请求该

关于云主机Thinkphp框架Session跨页失效的问题

在网站部署到云主机之后,前台一直能够正常显示,后台确登录不上去,验证码也无法显示,研究半天,才确定是Session跨页传递失效的问题.找网上各种解决方法,都是关于Php.ini文件的设置,可又解决不了问题,于是狠下心来研究,最后确定是Session路径的问题.由于Thinkphp的Session默认不是保存在网站目录下,导致Session无效的问题,最后更改Session的保存路径,成功解决了问题. 具体解决办法: 1.在index.php中定义session保存路径: define('ROOT

聊一聊实现Session跨域的问题

本文来自有着丰富经验的大神和一个小白的对话! 为了阅读方便,小白代号Q, 大神代号W Q: 怎么实现session跨域? W: 别用系统session即可 Q: 那用什么session ?自己存session? W: 自己有啥不行吗 系统的方案是改配置,允许一些域. 不过没用直接自己处理会话来的干脆实际 会话信息就是你说的session 默认系统是跟域名绑定的.但是跨域的本质是后端多系统共享,所以在后端处理数据存取最为直接 路人甲: 现在不是流行 token吗 ? 这不就是一个另类的sessio

session跨域共享解决方案

要让session跨域共享,需要解决三个问题: 1.通过什么方法来传递session_id? 2.通过什么方法来保存session信息? 3.通过什么方法来进行跨域 一.传递session_id有4种方法 1. 通过cookie 2. 设置php.ini中的session.use_trans_sid=1,让PHP自动跨页传递session id 3. 手动通过url或隐藏表单传值 4. 用文件或数据库方式传递,在通过其他key对应取值 二.保存session信息有3种方法 1.数据库 2.mem

跨子域的iframe高度自适应

一.跨子域的iframe高度自适应 比如 'a.jd.com/3.html' 嵌入了 'b.jd.com/4.html',这种跨子域的页面 3.html 1 2 3 4 5 6 7 8 9 10 11 12 13 <!DOCTYPE html> <html>   <head>     <meta charset='utf-8' />     <title>1.html</title>     <script type="

java:sso(单点登录(single sign on),jsp文件动静态导入方式,session跨域)

1.jsp文件导入: 2.session跨域: 3.sso(单点登录(single sign on): sso Maven Webapp: LoginController.java: package com.sso.demo.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.beans

Cookie跨子域、虚拟目录, 实现通行证登录

Cookie跨子域.虚拟目录, 实现通行证登录 Cookie有三个属性需要注意一下:1. Domain 域2. Path       路径3. Expires 过期时间 跨域操作需要设置域属性:Response.Cookies("MyCookie").Domain = "cnblogs.com"; (这里指的是泛域名)这样在其它二级域名下就都可以访问到了, ASP 和 ASP.NET 测试通过 虚拟目录下访问:我在ASP端做了下测试,.NET的没试, 如果不指定Pa