這篇文章主要介紹了關於PHP中單點登入的會話控制,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
1、簡單使用下session
在使用session之前需要session_start()開啟session
寫一個Demo來實現下
建立一個session.php
<?php session_start();//使用時必須開啟,如果你在php.ini裡頭修改了配置那麼就無需在開啟session了 $_SESSION['username'] = 'admin';//儲存session資訊為鍵為username值為admin的一對資料?>
再建立一個getsession.php我們來取一下值
<?phpsession_start();//使用時必須開啟,如果你在php.ini裡頭修改了配置那麼就無需在開啟session了echo $_SESSION['username'];//取出在session裡存的username的值?>
不同瀏覽器取到的值是不同的,原因是因為它們的sessionid不同,舉個栗子:
我用Google瀏覽器訪問session.php然後產生了一個session,那麼我用同一瀏覽器訪問getsession.php的話是可以取到值的,當我用Firefox瀏覽器再次訪問session.php的時候又重建了一個session,再次訪問getsession.php也是可以取到值的,但是你會發現取到的不是同一個值,因為它們是兩個瀏覽器有不同的sessionID,如果你把Firefox的sessionID拿過來把Google的sessionID進行修改,那麼你會發現它們兩個的值是一樣的,因為session取值只認sessionID。
童鞋們可以試著操作一下,看是不是這個樣子的。
2、跨域
如果我們在自己的Apache/nginx伺服器上配置自己的虛擬機器主機。
我的是Apache伺服器,nginx也是修改設定檔----vhost.conf。
<VirtualHost *:80> DocumentRoot "H:\myphp_www\PHPTutorial\WWW\sessoin" ServerName www.test.com ServerAlias <Directory "H:\myphp_www\PHPTutorial\WWW\sessoin"> Options FollowSymLinks ExecCGI AllowOverride All Order allow,deny Allow from all Require all granted </Directory></VirtualHost>
一個虛擬網域名稱為www.test.com的虛擬機器主機就搭建好了,切記一定要重啟Apache/nginx,否則配置不生效。
我們現在要做的就是要把兩個網域名稱下的sessionID保持一致,例如:www.test.com和localhost,前提是在一伺服器下。
下面我們來寫一個Demo實現一下(先不考慮安全和效能)
建立一個user.php我們要把當前localhost下的sessionID傳到www.test.com
<?phpsession_start();//一定要先開啟session$sid = session_id();//擷取到當前的sessionID?><a href="http://www.test.com/getsession.php?sid= <?php echo $sid;?> ">跳轉</a>
直接頁面上的跳轉的話是會出錯的,因為我們只傳輸了,getsession.php並沒有接收,所以我們要修改getsession.php檔案
<?phpif (isset($_GET['sid'])){//setcookie('名字','值','有效期間','網域名稱');$sid = $_GET['sid'];//setcookie('PHPSESSID' , $sid);//設定sessionID//或者我們還可以用另一種方式session_id($sid);//開啟session之前 指定一個sessionid}session_start();echo $_SESSION['username'];?>
這樣我們就根據sessionID的一致性解決了兩個網域名稱之間的跨域問題
3、實現單點登入----意為在localhost下登入後在www.test.com下同步登陸-----跨域請求
使用ajax的話是不能實現跨域請求的,需要使用Jsonp來進行跨域
在session檔案夾同級目錄下建立一個local檔案來更好的區分兩個域
我們現在要實現的就是讓localhost和www.test.com進行互連-----前提是在一個伺服器上
在session下建立一個api.php
<?php?>
在local下建立一個index.html
<script src="www.test.com/api.php"></script> <!-- JS代碼在瀏覽器端執行 -->
在訪問local下index.html的時候它會發起兩個請求因為裡頭的js代碼請求了一下www.test.com/api.php
修改session下的getsession.php檔案為以下內容:
<?phpsession_start();if(isset($_SESSION['uid'])){echo "使用者已登入,id是".$_SESSION['uid'];} else {echo "沒有登入";}?>
複製一份session下的getsession.php到local下
在local下建立一個login.php檔案
<?phpsession_start();$_SESSION['uid'] = 18;//儲存session資料鍵為uid值為18的一對資料?>
當我們訪問login.php後在訪問目前的目錄下的getsession.php檔案,結果為:使用者已登入,id是18.
那麼我們現在要做到的就是在localhost下訪問login.php進行登入的時候悄悄的也讓www.test.com進行登入
修改local下login.php檔案為以下代碼:
<?phpsession_start();$_SESSION['uid'] = 18;//儲存session資料鍵為uid值為18的一對資料$uid = $_SESSION['uid'];?><script src="www.test.com/api.php?uid=<?php echo $uid;?>" ></script>
訪問localhost/local/login.php來進行同步登陸,然後在訪問localhost/local/getsession.php已經是登入狀態了
現在直接存取www.test.com/getsession.php檔案是不會發生任何改變的,因為我們並沒有接收session,所以要修改session下api.php檔案為以下代碼:
<?phpsession_start();$uid = $_GET['uid'];$_SESSION['uid'] = $uid;?>
這樣的話在訪問www.test.com/getsession.php的時候也會同樣提示已登入
這樣我們就使用了Jsonp實現了跨域請求,在登入一個網站的情況下另一個網站同步登陸
以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!