深入解析Session是否必須依賴Cookie
php中的session可以默認(rèn)情況下是使用客戶端的cookie(以便和普通意義上的cookie區(qū)別,我稱之為session cookie,普通意義上的cookie為cookie)來保存session id的,但是php中的session是否只能使用session cookie呢?
當(dāng)然不是,否則何必還弄個(gè)session出來,不如直接用cookie算了.session的一大優(yōu)點(diǎn)就是當(dāng)客戶端的cookie被禁用時(shí)會(huì)自動(dòng)把session id附在url中,這樣再通過session id就能記住session變量了.
下面我寫兩個(gè)文件來證實(shí)一下,首先在瀏覽器中設(shè)置禁用cookie.
<?
//文件名為test1.php
session_start();
session_register("url");
$url="test2.php";
echo "<a href=$url>goto test2.php</a>";
?><SPAN style="FONT-FAMILY: Arial, Helvetica, sans-serif"> </SPAN>
<?//文件名為test2.php
session_start();
if (session_is_registered("url")) {
echo "congratulations.";
$url="test1.php";
echo "<a href=$url>goto test1.php</a>";
} else
echo "failed.";
?>
現(xiàn)在在瀏覽器中輸入"http://localhost/test1.php",把鼠標(biāo)移到鏈接上看看狀態(tài)欄上的地址,不是簡(jiǎn)單的"http://localhost/test2.php",而是這種形式:"http://localhost/test2.php?phpsessid=6e3610749f7ded3784bc4a4dd10f879b".
你還可以查看html的源文件,源文件是這種形式:
<a href="test2.php?phpsessid=6e3610749f7ded3784bc4a4dd10f879b">goto test2.php</a>
所以說這完全是php的功勞,和瀏覽器無關(guān),也就是說無論你用什么瀏覽器session都有效,而不是有的人認(rèn)為的只對(duì)ie有用.
但是,我們的超鏈接是語句是由echo語句輸出的,如果超鏈接不包含在php的標(biāo)簽<? ?>之內(nèi)會(huì)怎樣呢?還是寫個(gè)例子來驗(yàn)證一下,把test1.php稍作修改:
<?php
session_start();
session_register("url");
$url="test2.php";
echo "<a href=$url>goto test2.php</a>";?>
<a href="test2.php">(html形式)goto test2.php</a>
在瀏覽器中輸入"http://localhost/test1.php",分別把鼠標(biāo)移到兩個(gè)鏈接上看看有沒有不同?可以看到,兩個(gè)鏈接是完全相同的,后面都會(huì)自動(dòng)附帶session id.所以不必?fù)?dān)心沒被包含在php標(biāo)簽中的鏈接會(huì)失效,php不會(huì)這么笨的.
但是在使用時(shí)要注意必須先用session_start()函數(shù)告訴php開始用session,哪怕你在這個(gè)文件中只有html代碼,如:
<? session_start();?>
<html>
<head>
<body>
<a href=test2.php>gogogo</a>
…………
記得有人說過這個(gè)優(yōu)點(diǎn)只能在linux/unix下才能發(fā)揮出來,而我用的win2000p+apache1.3.17+php4.0.4pl1,php為apache模塊方式,卻照樣可以.恰恰相反,我轉(zhuǎn)到linux下去測(cè)試時(shí)反而不行了.其實(shí)是在編譯時(shí)的一個(gè)選項(xiàng)--enable-trans-sid控制了這項(xiàng)功能能否有用.而按照php默認(rèn)來編譯時(shí)是沒有打開這項(xiàng)功能的,只需重新編譯時(shí)加入它就可以了.我的配置為apache1.3.17+php4.0.4pl1,php為apache模塊方式,在linux重新編譯后用netscape navigator4.7測(cè)試可以通過(這更證明了和瀏覽器無關(guān)).
只靠session是不能跨窗口使用的,即使你啟用了cookie,當(dāng)你在一個(gè)窗口中有一個(gè)合法的session id(記錄在session cookie中,不是url中),再新開一個(gè)窗口進(jìn)入相同頁面時(shí),你會(huì)重新?lián)碛幸粋€(gè)新的session id,而與前一個(gè)窗口互不影響.
要想跨窗口使用同一個(gè)session id就只能在url后指定session id,也就是說如果你把帶有session id的的窗口的url復(fù)制,在新開的窗口中粘貼一下,還是照樣使用的.知道了session id的這個(gè)原理要實(shí)現(xiàn)跨窗口session還是不難的,可以把cookie與session結(jié)合起來,首先取得當(dāng)前合法的session id,然后把它記錄在cookie中,在其它窗口讀取cookie就可獲得當(dāng)前的session id了.
相關(guān)文章
PHP正則+Snoopy抓取框架實(shí)現(xiàn)的抓取淘寶店信譽(yù)功能實(shí)例
這篇文章主要介紹了PHP正則+Snoopy抓取框架實(shí)現(xiàn)的抓取淘寶店信譽(yù)功能,結(jié)合實(shí)例形式分析了Snoopy框架的使用及正則匹配相關(guān)操作技巧,需要的朋友可以參考下2017-05-05PHP設(shè)計(jì)模式之 策略模式Strategy詳解【對(duì)象行為型】
這篇文章主要介紹了PHP設(shè)計(jì)模式之 策略模式Strategy,結(jié)合實(shí)例形式詳細(xì)分析了PHP基于對(duì)象行為型的策略模式Strategy具體原理、實(shí)現(xiàn)技巧與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2020-05-05PHP項(xiàng)目在Docker(WSL2)中運(yùn)行緩慢的解決方法
最近在使用Docker容器運(yùn)行PHP項(xiàng)目的時(shí)候,發(fā)現(xiàn)特別緩慢,例如一個(gè)干凈的?ThinkPHP?5.1?框架,訪問首頁都需要1秒以上,如果再加上數(shù)據(jù)庫查詢、復(fù)雜的業(yè)務(wù)邏輯等代碼的話,那速度可想而知,所以本文就給大家介紹了解決方法,需要的朋友可以參考下2023-09-09PHP獲取一年中每個(gè)星期的開始和結(jié)束日期的方法
這篇文章主要介紹了PHP獲取一年中每個(gè)星期的開始和結(jié)束日期的方法,涉及php對(duì)日期操作的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02php自動(dòng)提交表單的方法(基于fsockopen與curl)
這篇文章主要介紹了php自動(dòng)提交表單的方法,結(jié)合實(shí)例形式分析了php基于fsockopen與curl兩種實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-05-05