最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP實現(xiàn)cookie跨域session共享的方法分析

 更新時間:2019年08月23日 11:17:02   作者:cscsdvdsv  
這篇文章主要介紹了PHP實現(xiàn)cookie跨域session共享的方法,結(jié)合實例形式分析了php操作cookie的有效期、跨域、session存儲等相關(guān)操作技巧,需要的朋友可以參考下

本文實例講述了PHP實現(xiàn)cookie跨域session共享的方法。分享給大家供大家參考,具體如下:

做過web開發(fā)的小伙伴們都了解cookie和session,cookie是存儲在客戶端的,session是存儲在服務(wù)器的。

本篇主要通過一些實踐中的案例和大家分享一下踩到坑,重點說明了cookie跨域問題和session服務(wù)器共享問題,以php語言為使用語言進(jìn)行說明。

先聊聊cookie

設(shè)置cookie無效

setcookie("sso", "e589hR6VnO8K1CNQZ4PSP/LWGBhRKE5VckawQwl1TdE8d4Q5E7tW", 900);

這個問題很多剛?cè)腴Tphp的小伙們都會碰到。這個代碼的本意應(yīng)當(dāng)是想設(shè)置cookie sso的有效期為15分鐘,可是執(zhí)行這個代碼后發(fā)現(xiàn)沒有效果。為什么呢?因為第三個參數(shù)expire表示的是過期的時間節(jié)點,而不是有效時間,所以如果希望設(shè)置cookie為15分鐘,正確的做法應(yīng)當(dāng)是獲取當(dāng)前的時間戳加上15分鐘。

setcookie這個函數(shù)還有path、domain參數(shù)都比較常用,強(qiáng)烈建議剛學(xué)php的小伙們多翻閱手冊。php手冊地址: http://php.net/manual/zh/index.php

獲取cookie值獲取不到

先看這樣一段代碼

setcookie("sso", "e589hR6VnO8K1CNQZ4PSP/LWGBhRKE5VckawQwl1TdE8d4Q5E7tW", time() + 900);
var_dump($_COOKIE["sso"]);

要解決這個問題,要先了解一下setcookie后發(fā)生了什么?因為cookie是保存在客戶端的,php是服務(wù)端語言,實際上setcookie之后只是在返回的http頭增加一個cookie的頭信息,告訴客戶端需要設(shè)置一個醬紫的cookie,如下圖:

php中setcookie返回的http頭

而$_COOKIE這個數(shù)組里面保存客戶端傳遞上來的cookie。自然第一次刷新的時候因為客戶端沒有相應(yīng)的cookie值,所以$_COOKIE是沒有sso的信息的。第一次請求過后,因為服務(wù)器設(shè)置了cookie sso,所以第一次請求過來客戶端就有了cookie sso的信息,所以第二次請求的時候就會帶上sso的信息,服務(wù)端就能通過$_COOKIE取到值了。

cookie跨域問題

這個可以說是cookie中一個比較熱門的問題,面試的時候一般很愛聊這方面的問題。

跨域的業(yè)務(wù)需求大概是醬紫:用戶在a.com進(jìn)行了登錄,希望在b.com也同步進(jìn)行了登錄。如果是同一個主域比較簡單,可以通過setcookie中的domain參數(shù)進(jìn)行設(shè)定:例如有x.a.com和xx.a.com,可以通過設(shè)置domain為a.com,從而a.com的所有二級域名都可以共享這一個cookie?;诎踩矫娴脑颍赼.com下面設(shè)置domain為b.com是無效的。

那么是否真的沒有辦法可以實現(xiàn)這個了呢?這個還是有一些奇巧淫技的,這里介紹一種使用內(nèi)框iframe的方法。

具體思路:在a.com下設(shè)置cookie后,嵌入一個iframe框鏈接b.com的頁面,b.com設(shè)置好頁面cookie后,再嵌入一個a.com的頁面,然后通過parent.parent就可以調(diào)用最外層的a.com的js方法,從而進(jìn)行跳轉(zhuǎn)或者一些其它的操作。具體代碼示例如下:

假設(shè)a.com有頁面:login.php和callback.php,b.com有頁面synclogin.php

a.com的login.php代碼:

<?php
$sso = "e589hR6VnO8K1CNQZ4PSP/LWGBhRKE5VckawQwl1TdE8d4Q5E7tW";
setcookie("sso", $sso);
?>
login success...
<script type="text/javascript">
  function jumpTo() {
    location.;
  }
</script>
<iframe src="http://b.com/synclogin.php?sso=<?php echo $sso; ?>"></iframe>

b.com的synclogin.php頁面

<?php
setcookie("sso", $_GET["sso"]);
?>
<iframe src="http://a.com/callback.php"></iframe>

a.com的callback.php頁面

<script type="text/javascript">
  parent.parent.jumpTo();
</script>

代碼看起來也不難,值得一提的是這里嵌入了兩個iframe,因為如果只用一個iframe的話,即在b.com的synclogin.php內(nèi)直接調(diào)用父窗體的jumpTo方法,在有些瀏覽器下會提示沒有權(quán)限的錯誤:
Error: Permission denied to access property

這里只是演示了cookie跨域同步的思路,具體細(xì)節(jié)還有很多可以改進(jìn)的地方,比如iframe鏈接的頁面可以考慮改成靜態(tài)的頁面,這樣效率會比php動態(tài)頁面快很多,還有像參數(shù)校驗、多個主域(比如還有c.om)同時登錄等等,這里就不再累述。

cookie的總結(jié)到這里就結(jié)束,如果你感覺有一些收獲,可以在頁面底部掃碼給我打賞喲,感謝O(∩_∩)O~

session

$_SESSION沒有值

這個session使用和cookie有一點不太一樣,session使用前必須先調(diào)用session_start方法。否則會收到一個undefined的錯誤:
Notice: Undefined variable: _SESSION

session存儲在哪

session存儲在服務(wù)端,但是session究竟是存儲在哪呢?php.ini中關(guān)于session有一個save_path的選項可以設(shè)置存放的目錄,如果這個選項沒有設(shè)置值,那么就存儲在系統(tǒng)默認(rèn)的tmp目錄下。默認(rèn)的tmp目錄可以通過sys_get_temp_dir方法取到。

例如在mac下面,php的session一般會存儲在/var/tmp目錄下。

session_start();
echo session_id();//本例輸出ipkl446enhae25uq92c28u4lo3
$_SESSION['name'] = "tony”;
$_SESSION['users'] = array("tony", "andy");

通過session_id方法可以取到當(dāng)前的session編號,通過這個編號可查看一下該session文件。

$ sudo more /var/tmp/sess_ipkl446enhae25uq92c28u4lo3
name|s:4:"tony";users|a:2:{i:0;s:4:"tony";i:1;s:4:"andy";}

可以清楚的看到session存儲數(shù)據(jù)的結(jié)構(gòu),其中值是用序列化的方式進(jìn)行轉(zhuǎn)化存儲的。

session也用了cookie

session不是存儲在服務(wù)端嗎,怎么又和cookie扯上關(guān)系了?其實想想也簡單,因為客戶端再請求的時候,服務(wù)端怎么樣才能知道該客戶端的session存儲在哪個文件呢?其實也是通過cookie PHPSESSID來進(jìn)行標(biāo)識。

php中session的cookie標(biāo)識

php在進(jìn)行session操作的時候會生成一個session id,而后把這個值以cookie的形式保存在客戶端,就是圖示中的PHPSESSID了??蛻舳嗽谙麓握埱蟮臅r候就會帶上這個PHPSESSID,服務(wù)端就能知道當(dāng)前客戶端對應(yīng)的session文件了

session超時設(shè)置

cookie超時設(shè)置比較簡單,一個參數(shù)就搞定了。session這邊有點小麻煩,既不能單獨(dú)設(shè)置cookie PHPSESSID的超時時間,也不能單獨(dú)設(shè)置服務(wù)端文件的超時時間。具體的可以參考鳥哥這篇文章:如何設(shè)置一個嚴(yán)格30分鐘過期的Session,真的非常嚴(yán)謹(jǐn),贊一下。

session服務(wù)器共享

這個問題和cookie的跨域類似,面試的時候也很愛聊這個問題。

以前在做服務(wù)器集群的時候會碰到這樣的一樣問題,就是用戶一會訪問是處于正常登錄狀態(tài),一會訪問又沒有登錄了。這個問題偶爾才會出現(xiàn)。跟蹤代碼下去才發(fā)現(xiàn)session沒有取到相應(yīng)的值,想想也是醉了:原來服務(wù)器session沒有設(shè)置共享,session存在在本地文件目錄,當(dāng)用戶訪問另外一臺服務(wù)器的時候自然就取不到session了。

解決方法也不難,通過共享的存儲在進(jìn)行服務(wù)器之間的共享。這里使用redis的進(jìn)行session存儲。可以通過php.ini配置文件進(jìn)行調(diào)整,也可以在代碼中通過ini_set進(jìn)行調(diào)整

ini_set("session.save_handler", "redis");
ini_set("session.save_path", "tcp://127.0.0.1:6379”);

如果需要使用redis進(jìn)行存儲,需要session中的Registered save handlers支持redis

php中session是否支持redis

當(dāng)這樣設(shè)置之后,session就會保存在redis中了,不同的集群服務(wù)器之間就可以通過該redis服務(wù)器進(jìn)行共享了。

好吧,暫時就寫到這里了,以后會發(fā)現(xiàn)新的坑會繼續(xù)補(bǔ)充上來。

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP中cookie用法總結(jié)》、《php緩存技術(shù)總結(jié)》、《PHP數(shù)組(Array)操作技巧大全》、《PHP網(wǎng)絡(luò)編程技巧總結(jié)》及《php字符串(string)用法總結(jié)

希望本文所述對大家PHP程序設(shè)計有所幫助。

相關(guān)文章

  • ThinkPHP 模板引擎使用詳解

    ThinkPHP 模板引擎使用詳解

    thinkphp系統(tǒng)支持原生的PHP模板,而且本身內(nèi)置了一個基于XML的高效的編譯型模板引擎,系統(tǒng)默認(rèn)使用的模板引擎是內(nèi)置模板引擎,關(guān)于這個模板引擎的標(biāo)簽詳細(xì)使用可以參考模版引擎部分。
    2017-05-05
  • php 過濾器實現(xiàn)代碼

    php 過濾器實現(xiàn)代碼

    在以前,PHP需要驗證數(shù)據(jù),一般都是程序員自己通過正則表達(dá)式實現(xiàn),而從PHP從5.2開始把原本的PCEL中的filter函數(shù)移到了內(nèi)置庫中,并做了不少強(qiáng)化,可以用這些函數(shù)實現(xiàn)對數(shù)據(jù)的過濾和驗證。
    2010-08-08
  • PHP如何拋出和接收錯誤的詳細(xì)指南

    PHP如何拋出和接收錯誤的詳細(xì)指南

    在PHP中,拋出和接收錯誤通常涉及異常處理機(jī)制,以及錯誤和異常的處理函數(shù),以下是如何在PHP中拋出和接收錯誤的詳細(xì)指南,通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2024-10-10
  • PHP查找一列有序數(shù)組是否包含某值的方法

    PHP查找一列有序數(shù)組是否包含某值的方法

    在本篇文章里小編給大家整理了關(guān)于PHP查找一列有序數(shù)組是否包含某值的方法,有需要的朋友們可以參考下。
    2020-02-02
  • php中獲取主機(jī)名、協(xié)議及IP地址的方法

    php中獲取主機(jī)名、協(xié)議及IP地址的方法

    這篇文章主要介紹了php中獲取主機(jī)名、協(xié)議及IP地址的方法,其中涉及gethostbyaddr、gethostbynamel、getprotobyname、getprotobynumber等函數(shù)及$_SERVER變量的應(yīng)用,需要的朋友可以參考下
    2014-11-11
  • PHP實現(xiàn)的簡單日歷類

    PHP實現(xiàn)的簡單日歷類

    這篇文章主要介紹了PHP實現(xiàn)的簡單日歷類,可實現(xiàn)簡單的日期顯示功能,并高亮標(biāo)注當(dāng)前日期,具有一定的實用價值,需要的朋友可以參考下
    2014-11-11
  • Linux下PHP加速器APC的安裝與配置筆記

    Linux下PHP加速器APC的安裝與配置筆記

    這篇文章主要介紹了Linux下PHP加速器APC的安裝與配置筆記,本文同時給出了Windows下安裝apc的方法,需要的朋友可以參考下
    2014-10-10
  • WampServer下安裝多個版本的PHP、mysql、apache圖文教程

    WampServer下安裝多個版本的PHP、mysql、apache圖文教程

    這篇文章主要介紹了WampServer下安裝多個版本的PHP、mysql、apache圖文教程,需要的朋友可以參考下
    2015-01-01
  • php mysql Errcode: 28 終極解決方法

    php mysql Errcode: 28 終極解決方法

    php mysql Errcode: 28 終極解決方法,碰到這類問題的朋友可以參考下。
    2009-07-07
  • php運(yùn)行報錯Call to undefined function curl_init()的最新解決方法

    php運(yùn)行報錯Call to undefined function curl_init()的最新解決方法

    其實在網(wǎng)上很早之前就出現(xiàn)過這個問題,網(wǎng)上百度了下,答案千篇一律,最近又遇到這個問題,但是百度出來的問題不能解決這個問題了,所以只能翻墻找答案,現(xiàn)在將解決的方法分享給大家,有需要的朋友們可以參考借鑒,下面來一起學(xué)習(xí)學(xué)習(xí)吧。
    2016-11-11

最新評論

长子县| 屏山县| 义马市| 万山特区| 永吉县| 射洪县| 扶绥县| 阿拉善右旗| 景宁| 丹阳市| 波密县| 祁连县| 乾安县| 吉安县| 阳高县| 四平市| 阿图什市| 固阳县| 丽水市| 浙江省| 大兴区| 井陉县| 马边| 康定县| 鄂托克前旗| 淮阳县| 临泽县| 思茅市| 曲阜市| 福清市| 松潘县| 清流县| 思南县| 遂昌县| 康乐县| 顺平县| 日照市| 拜泉县| 泸水县| 哈巴河县| 蛟河市|