PHP中單點登入的會話控制

來源:互聯網
上載者:User
這篇文章主要介紹了關於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!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.