文档章节

处理session跨域几种的方案

mickelfeng
 mickelfeng
发布于 2015/12/23 20:56
字数 1215
阅读 159
收藏 14
点赞 0
评论 0

常用跨域共用session的是登录模块,我相信很多开发的朋友的都遇到过,只需要一个地方登录,相关联的网站也是处于登录状态。两种情况:一种9streets.cn和a.9streets.cn之间,另一种是a.com b.com之间,这几天总结了一下处理方法。

方式一

在一,二级域名下调用如下代码:    

<?php    
    include("DBsession.php");    
    $_SESSION['usssser_oke'] = 'xxssssss';    
    $_SESSION['user_oke'] = 'xxsss';      
?>

DBsession.php

<?php    
    /**  
      
    /**  直接引用api QQ登录的session写法,配置相关配置才行哈
     * 设置session配置   
     */    
        
    /**  
     * CREATE TABLE `tbl_session` (  
     *     `session_id` varchar(255) binary NOT NULL default '',  
     *     `session_expires` int(10) unsigned NOT NULL default '0',  
     *     `session_data` text,  
     *     PRIMARY KEY  (`session_id`)  
     *    ) ENGINE=MyISAM;  
     */    
        
    class Session     
    {    
        //mysql的主机地址    
        const db_host = "localhost"; //需要第三方指定ip地址     
        
        //数据库用户名    
        const db_user = "root";   //需要第三方指定自己的用户名    
        
        //数据库密码    
        const db_pwd = ""; //需要第三方指定自己的库据库密码    
        
        //数据库    
        const db_name = "thinkphp";      //需要第三方指定数据库    
        
        //数据库表    
        const db_table = "tbl_session"; //需要第三方指定数据表    
        
        //mysql-handle    
        private $db_handle;    
        
        //session-lifetime    
        private $lifeTime;    
        
        function open($savePath, $sessName)     
        {    
            // get session-lifetime    
            $this->lifeTime = get_cfg_var("session.gc_maxlifetime");    
        
            // open database-connection    
            $db_handle = @mysql_connect(self::db_host, self::db_user, self::db_pwd);    
        
            $dbSel = @mysql_select_db(self::db_name, $db_handle);    
        
            // return success    
            if(!$db_handle || !$dbSel)    
                return false;    
        
            $this->db_handle = $db_handle;    
            return true;    
        }    
        
        function close()     
        {    
            $this->gc(ini_get('session.gc_maxlifetime'));    
            // close database-connection    
            return @mysql_close($this->db_handle);    
        }    
        
        function read($sessID)     
        {    
            // fetch session-data    
            $res = @mysql_query("SELECT session_data AS d FROM ".self::db_table."   
                WHERE session_id = '$sessID'  
                AND session_expires > ".time(), $this->db_handle);    
        
            // return data or an empty string at failure    
            if($row = @mysql_fetch_assoc($res))    
                return $row['d'];    
        
            return "";    
        }    
        
        function write($sessID, $sessData)     
        {    
            // new session-expire-time    
            $newExp = time() + $this->lifeTime;    
        
            // is a session with this id in the database?    
            $res = @mysql_query("SELECT * FROM ".self::db_table."   
                WHERE session_id = '$sessID'", $this->db_handle);    
        
            // if yes,    
            if(@mysql_num_rows($res))     
            {    
                // ...update session-data    
                @mysql_query("UPDATE ".self::db_table."   
                    SET session_expires = '$newExp',  
                    session_data = '$sessData'  
                    WHERE session_id = '$sessID'", $this->db_handle);    
        
                // if something happened, return true    
                if(@mysql_affected_rows($this->db_handle))    
                    return true;    
            }    
            else // if no session-data was found,    
            {    
                // create a new row    
                @mysql_query("INSERT INTO ".self::db_table." (  
                    session_id,  
                    session_expires,  
                    session_data)  
                    VALUES(  
                        '$sessID',  
                        '$newExp',  
                        '$sessData')", $this->db_handle);    
                // if row was created, return true    
                if(@mysql_affected_rows($this->db_handle))    
                    return true;    
            }    
        
            // an unknown error occured    
            return false;    
        }    
        
        function destroy($sessID)     
        {    
            // delete session-data    
            @mysql_query("DELETE FROM ".self::db_table." WHERE session_id = '$sessID'", $this->db_handle);    
        
            // if session was deleted, return true,    
            if(@mysql_affected_rows($this->db_handle))    
                return true;    
        
            // ...else return false    
            return false;    
        }    
        
        function gc($sessMaxLifeTime)     
        {    
            // delete old sessions    
            @mysql_query("DELETE FROM ".self::db_table." WHERE session_expires < ".time(), $this->db_handle);    
        
            // return affected rows    
            return @mysql_affected_rows($this->db_handle);    
        }    
    }    
        
    /**  
     * 指定session有效的域名  
     * ini_set("session.cookie_domain", ".domain.com");  
     * .domain.com是站点的主域名,请注意前面个有一个'.'  
     */    
    define("MAIN_DOMAIN", ".ichezone.com");   //设置主域名    
        
    /**  
     * 不同子域名下共享session信息  
     * COOKIE_DOMAIN = false 禁止该功能  
     * COOKIE_DOMAIN = true  启用该功能  
     * 默认禁止  
     * 开启前提需要定义MAIN_DOMAIN常量  
     */    
    define("COOKIE_DOMAIN", true);     
    if (defined("COOKIE_DOMAIN") && COOKIE_DOMAIN)    
    {    
        if (defined("MAIN_DOMAIN"))    
            @ini_set("session.cookie_domain", MAIN_DOMAIN);    
    }    
        
    /**  
     * 同一个主域名,不同服务器之间共享session信息  
     * USER_SESSION = false 禁用该功能  
     * USER_SESSION = true  启用该功能  
     * 默认禁止  
     * 开启前提需要建立mysql数据表  
     */    
     ini_set('session.name', 'phpsessid');//设置色session id的名字    
    define("USER_SESSION", true);    
    if (defined("USER_SESSION") && USER_SESSION)    
    {    
        @ini_set("session.save_handler", "user");    
        $session = new Session;    
        @session_module_name("user");    
        @session_set_save_handler(    
            array(&$session, "open"),    
            array(&$session, "close"),    
            array(&$session, "read"),    
            array(&$session, "write"),    
            array(&$session, "destroy"),    
            array(&$session, "gc"));    
    }    
    //@ini_set("session.save_path", dirname(__file__)."/tmp");    
    //@session_id("demo");    
    //ini_set("session.save_path",dirname(__file__)."/tmp");    
    session_start();
    include("DBsession.php");    
    $_SESSION['usssser_oke'] = 'xxssssss';    
    $_SESSION['user_oke'] = 'xxsss';     
    ?>

方式二

PHP Code复制内容到剪贴板

<?php   
    ini_set('session.name', 'sid');//设置色session id的名字   
    ini_set('session.use_trans_sid', 0);//不使用 GET/POST 变量方式   
    ini_set('session.use_cookies', 1);//使用 COOKIE 保存 SESSION ID 的方式   
    ini_set('session.cookie_path', '/');   
    ini_set('session.cookie_domain', '.ichezone.com');//多主机共享保存 SESSION ID 的 COOKIE,注意此处域名为一级域名   
    session_start();   
    $_SESSION['usssser_oke'] = 'xxssssss';   
    $_SESSION['user_oke'] = 'xxsss';     
    ?>

第三种方式
PHP Code复制内容到剪贴板
  一级域名:  
    session_start();  
    setcookie("session_id",session_id(),time()+3600*24*365*10,"/",".ichezone.com");  
     $_SESSION['user_name'] = '梁山良民';  
二级域名:  
    session_id($_COOKIE['session_id']);  
    session_start();  
    $_SESSION['user_sssme'] = 222222;  


第四种方式

一级域名:  
    ini_set("session.cookie_domain",'.ichezone.com');//注:该参数必须在sesson_start()之上,否则将不会生效  
    session_start();  
    $_SESSION['user_name'] = '梁山www良民';  
   

二级域名:  
    ini_set("session.cookie_domain",'.ichezone.com');//注:该参数必须在sesson_start()之上,否则将不会生效  
    session_start();  
    $_SESSION['user_nassse'] = '梁山www良民';   


第五种方式

采用的p3p技术,实现原理,在访问网站x.com的时候,y.com程序触发y.com文件的写入sessionid值,sessionid值便可以获取,然后把seesion值存入数据库,取相同的sessionid值便可。这就要求y.com里面的程序文件必需能跨域访问,默认情况下,浏览器是不能跨域设置cookie的,加上p3p头后才行。在对应php文件加上:
 
    header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');   

这里直接引用网上的一篇博文了:

    127.0.0.1        www.a.com  
    127.0.0.1        www.b.com  
      
    首先:创建 a_setcookie.php 文件,内容如下:  
      
    <?php  
    header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');  
    setcookie("test", $_GET['id'], time()+3600, "/", ".a.com");  
    ?>  
      
    然后:创建 a_getcookie.php 文件,内容如下:  
      
    <?php  
    var_dump($_COOKIE);  
    ?>  
      
    最后:创建 b_setcookie.php 文件,内容如下:  
      
    <script src="http://www.a.com/a_setcookie.php?id=www.b.com"></script>  
      
    ----------------------------  
      
    三个文件创建完毕后,我们通过浏览器依次访问:  
      
    http://www.b.com/b_setcookie.php  
    http://www.a.com/a_getcookie.php  
      
    我们会发现,在访问b.com域的时候,我们并没有在a.com域设置上cookie值。去掉重新访问两文件设置成功 
 

本文转载自:http://tw5566.iteye.com/blog/1945825

共有 人打赏支持
mickelfeng

mickelfeng

粉丝 226
博文 964
码字总数 548669
作品 0
成都
高级程序员
AJAX是什么? AJAX的交互模型(流程)?同步和异步的区别? AJAX跨域的解决办法?

ajax是异步的 JavaScript 和 XML。通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。 交互流程: 1-...

wangwenya ⋅ 2014/09/07 ⋅ 1

CSRF/XSRF 跨站请求伪造

CSRF(Cross Site Request Forgery, 跨站域请求伪造)也称 XSRF, 是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一。其他安全隐患,比如 SQL 脚本注入,跨站域脚本攻击...

给你添麻烦了 ⋅ 01/13 ⋅ 0

跨域GET、POST的几种方法

首先,你要明白:jsonp无法支持跨域POST,浏览器的安全策略就是这么设计的, 跨域GET jQuery-JSONP 或者: 跨域POST: 修改前台的方案: 1. 如果两则属于同域名下的不同子域名, 比如:a.qq....

会员 ⋅ 2014/08/26 ⋅ 0

Nginx负载均衡多个Tomcat,如何实现Cookie跨大域??

1. 最近使用 memcached-session 方案实现了多个tomcat共享session; 2. 使用Nginx 实现了多个tomcat部署一套系统进行负载均衡; 但是发现一个问题:Tomcat A 部署在 10.0.125.1 下, Tomcat...

山哥 ⋅ 2012/07/19 ⋅ 4

微信H5提交,后台收到两次请求

微信H5form表单提交,后台偶尔会收到两次请求,需要过滤一次请求,如何来实现: 1、加同步锁,但是加锁会大大影响效率,锁是基于对象的锁,很明显在多用户的情况下锁会大大影响效率 2、用mem...

一气化三清 ⋅ 2016/08/26 ⋅ 4

简单的四种方式单点登录实现(SSO)

单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 在做单点登录...

王念博客 ⋅ 2016/04/17 ⋅ 0

javaweb中ajax跨域访问实例

AJAX跨域解决方法 跨域,简单地理解就是因为浏览器基于安全的同源策略限制不同域名和协议之间的互相访问。 而AJAX的跨域请求,其实浏览器并没有限制不同域的网络请求,只是浏览器会基于请求返...

hello菜bird ⋅ 2016/01/13 ⋅ 2

web跨域解决方案

阅读目录 什么是跨域 常用的几种跨域处理方法: 跨域的原理解析及实现方法 总结 摘要:跨域问题,无论是面试还是平时的工作中,都会遇到,本文总结处理跨域问题的几种方法以及其原理,也让自...

幕三少 ⋅ 2016/09/01 ⋅ 0

完全跨域单点登录解决方案[php+redis+p3p协议]

技术要点:COOKIE跨域 + SESSION共享 cookie跨域:让不同域下的session cookie有着同样的session id session共享:同一会话系统,客户端不同域下的session id相同故可访问相同的会话状态 完全...

big_cat ⋅ 2015/11/11 ⋅ 0

spring session+redis实现的session共享问题

是这样,公司在做一个项目,其中涉及到了跨域问题,按照平常的套路就是,用户登录完成,保存session中,每次调用接口时检查session中的用户登录状态,但是跨域会导致session丢失,无法通过检...

一个大苹果 ⋅ 2017/12/11 ⋅ 4

没有更多内容

加载失败,请刷新页面

加载更多

下一页

005. 深入JVM学习—Java堆内存参数调整

1. JVM整体内存调整图解(调优关键) 实际上每一块子内存区域都会存在一部分可变伸缩区域,其基本流程:如果内存空间不足,则在可变的范围之内扩大内存空间,当一段时间之后,内存空间不紧张...

影狼 ⋅ 32分钟前 ⋅ 0

内存障碍: 软件黑客的硬件视图

此文为笔者近日有幸看到的一则关于计算机底层内存障碍的学术论文,并翻译(机译)而来[自认为翻译的还行],若读者想要英文原版的论文话,给我留言,我发给你。 内存障碍: 软件黑客的硬件视图...

Romane ⋅ 今天 ⋅ 0

SpringCloud 微服务 (七) 服务通信 Feign

壹 继续第(六)篇RestTemplate篇 做到现在,本机上已经有注册中心: eureka, 服务:client、order、product 继续在order中实现通信向product服务,使用Feign方式 下面记录学习和遇到的问题 贰 or...

___大侠 ⋅ 今天 ⋅ 0

gitee、github上issue标签方案

目录 [TOC] issue生命周期 st=>start: 开始e=>end: 结束op0=>operation: 新建issueop1=>operation: 评审issueop2=>operation: 任务负责人执行任务cond1=>condition: 是否通过?op3=>o......

lovewinner ⋅ 今天 ⋅ 0

浅谈mysql的索引设计原则以及常见索引的区别

索引定义:是一个单独的,存储在磁盘上的数据库结构,其包含着对数据表里所有记录的引用指针. 数据库索引的设计原则: 为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索...

屌丝男神 ⋅ 今天 ⋅ 0

String,StringBuilder,StringBuffer三者的区别

这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。 首先说运行速度,或者说是, 1.执行速度 在这方面运行速度快慢为:StringBuilder(线程不安全,可变) > StringBuffer...

时刻在奔跑 ⋅ 今天 ⋅ 0

java以太坊开发 - web3j使用钱包进行转账

首先载入钱包,然后利用账户凭证操作受控交易Transfer进行转账: Web3j web3 = Web3j.build(new HttpService()); // defaults to http://localhost:8545/Credentials credentials = Wallet......

以太坊教程 ⋅ 今天 ⋅ 0

Oracle全文检索配置与实践

Oracle全文检索配置与实践

微小宝 ⋅ 今天 ⋅ 0

mysql的分区和分表

1,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一...

梦梦阁 ⋅ 今天 ⋅ 0

exception.ZuulException: Forwarding error

错误日志 com.netflix.zuul.exception.ZuulException: Forwarding error Caused by: com.netflix.hystrix.exception.HystrixRuntimeException: xxx timed-out and no fallback available. Ca......

jack_peng ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部