PHP中的會話控制

来源:http://www.cnblogs.com/gulei/archive/2017/12/22/8086691.html
-Advertisement-
Play Games

瞭解HTTP(超文本傳輸協議)可以知道,它採用請求與響應的模式,最大的特點就是無連接無狀態。 無連接:每次連接僅處理一個客戶端的請求,得到伺服器響應後,連接就結束了 無狀態:每個請求都是獨立的,伺服器無法識別和區分它們的身份 這就造成了一個問題,在不同網頁之間如何傳遞信息,會話控制的思想就是為瞭解決 ...


瞭解HTTP(超文本傳輸協議)可以知道,它採用請求與響應的模式,最大的特點就是無連接無狀態。

  • 無連接:每次連接僅處理一個客戶端的請求,得到伺服器響應後,連接就結束了
  • 無狀態:每個請求都是獨立的,伺服器無法識別和區分它們的身份

 

這就造成了一個問題,在不同網頁之間如何傳遞信息,會話控制的思想就是為瞭解決這個問題的,它的解決方案主要分為Cookie和Session。

 

一、Cookie

保存在客戶端中,又分為記憶體cookie和硬碟cookie。

  • 記憶體cookie:由瀏覽器維護,保存在記憶體中,瀏覽器關閉之後就消失了,存在時間短暫
  • 硬碟cookie:保存在硬碟中,有一個過期時間,僅手動刪除或過期才消失

Cookie的使用場景主要有記住登錄,購物車等,在PHP中操作cookie主要通過setcookie和setrawcookie兩個方法來設置。

setcookie(name,value,[expire],[path],[domain],[secure],[httponly])

  • name 必需。名稱。
  • value 必需。值。
  • expire 可選。有效期。
  • path 可選。伺服器有效路徑(預設當前路徑)。
  • domain 可選。作用域(預設本域)。
  • secure 可選。僅HTTPS可用(預設false)。
  • httponly可選。僅http可訪問(預設false),防止JS修改,減少XSS攻擊。
setcookie("abc","123",time()+3600)

讀取cookie使用$_COOKIE,更新和刪除均使用setcookie方法,註意保證path和domain與之前一致,刪除設置過期即可,如time()-1

還可以通過header設置cookie:

header("Set-Cookie:abc=123; expires=".gmstrftime("%A,%d-%b-%Y %H:%M:%S GMT",time()+3600));

通過JS操作cookie的值,下麵是一個封裝的實例:

var Cookie={
  set:function(key,val,expire){
    // 判斷是否設置了過期時間
    if(expire){
      var date=new Date();
      date.setTime(date.getTime()+expire*24*3600*1000);//格式化時間
      var expireStr="expires="+date.toGMTString()+';';
    }else{
      var expireStr='';
    }
    document.cookie=key+'='+escape(val)+';'+expireStr;
  },
  get:function(key){
    var getCookie=document.cookie.replace(/[ ]/g,'');//去空格
    var resArr=getCookie.split(';')
    var res;
    for(var i=0,l=resArr.length;i<l;i++){
      var arr=resArr.split('=');
      if(arr[0]===key){
        res=arr[1];break;
      }
    }
    return unescape(res);
  }
}

 

 cookie實現自動登錄,主要通過生成令牌存儲到本地,下次訪問時獲取令牌中的id,查詢資料庫得到用戶名和密碼,加上掩值重新生成令牌與之比對,如相同則直接登錄。

<?php
define('GAVIN', true);//許可權標示常量,申明後方可引入文件
include("../include/Gavin.class.php");

$username=$_POST['username'];
$password=md5($_POST['password']);
$autologin=$_POST['autologin'];

Gavin::connDb();
$res = Gavin::dbSelect("SELECT * FROM main WHERE name='$username' and password='$password'");
if(count($res)===1){
    if($autologin==="1"){
        setcookie("username",$username,strtotime('+7 days'));
        // 給用戶一個登錄憑證
        $salt='xiaoguge';//加密掩值
        $tokens=md5($username.$password.$salt).":".$res[0][0];//拼接令牌:加密(用戶名+密碼+掩值)拼接用戶id
        setcookie("tokens",$tokens,strtotime('+7 days'));
    }else{setcookie("username",$username);}echo Gavin::createJson(200,"登錄成功!");
}
else{echo Gavin::createJson(400,"登錄失敗,用戶名或密碼錯誤!");}
?>

 

cookie的缺點:不夠安全數據容易被截取;每個功能變數名稱下大小有限制,cookie中最大位元組數為4K;cookie每次都附著在http請求頭中。

為瞭解決cookie在存儲上的這些缺陷,HTML5提出了本地存儲方案localStorage和sessionStorage。

 

二、session

session的工作原理:

  1. 準備建立會話時,PHP首先查看請求的cookie中是否包含session_id,如果沒有則創建一條session信息(一般以文件形式存在伺服器上)。
  2. 伺服器將新創建session信息的session_id發送給瀏覽器,一般瀏覽器將其存放在cookie中。
  3. 當瀏覽器再次訪問伺服器時,會攜帶這個session_id,憑藉此到伺服器session認領對應信息。
  4. 取消會話,可以刪除伺服器中session的信息。

 

在PHP中使用會話,必須先使用session_start()開啟,再使用$_SESSION進行設置和讀取

session_start();
$_SESSION['account']=$account;

 

刪除session:

session_start();

//將session數據清空
$_SESSION=[];

//刪除會話cookie
if(ini_get('session.use_cookie')){
  $params=session_get_cookie_params();
  setcookie(session_name(),'',time()-1,$params['path'],$params['domain'],$params['secure'],$params['httponly'])    
}

//銷毀會話
session_destroy();

 

session預設是採用文件形式存儲,當然也可也修改PHP的設置,將其存儲到資料庫中(加快查詢速度)。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文秉承著 你看不懂是你sb,我寫的代碼就要牛逼 的理念來介紹一些js的裝逼技巧。 下麵的技巧,後三個,請謹慎用於團隊項目中(主要考慮到可讀性的問題),不然,leader 乾你沒商量。 [圖片上傳失敗...(image-922e98-1513315809572)] image.png Boolean ...
  • 在2017年末,Face++發了一篇論文[ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices ](https://arxiv.org/abs/1707.01083)討論了一個極有效率且可... ...
  • Java基礎 進程和線程的區別; Java的併發、多線程、線程模型; 什麼是線程池,如何使用? 數據一致性如何保證;Synchronized關鍵字,類鎖,方法鎖,重入鎖; Java中實現多態的機制是什麼; 如何將一個Java對象序列化到文件里; 說說你對Java反射的理解; 同步的方法;多進程開發以 ...
  • 0引言 隨著萬維網的發展和大數據時代的到來,每天都有大量的數字化信息在生產、存儲、傳遞和轉化,如何從大量的信息中以一定的方式找到滿足自己需求的信息,使之有序化並加以利用成為一大難題。全文檢索技術是現如今最普遍的信息查詢應用,生活中利用搜索引擎,在博客論壇中查找信息,這些搜索的核心原理就是本文要實現的 ...
  • 開始爬蟲之旅。 認識爬蟲 網路爬蟲(又被稱為網頁蜘蛛,網路機器人,spider),是一種按照一定的規則,自動地抓取互聯網信息的程式或者腳本。通俗的講就是通過程式自動去獲取web頁面上自己想要的數據。 主要就是模擬瀏覽器打開網頁,獲取網頁中我們想要的那部分數據。 簡單的說一下瀏覽器打開網頁的過程:在瀏 ...
  • mybatis generator-自動生成代碼 準備材料: 一個文件夾,一個資料庫的驅動包,mybatis-generator-core-1.3.5.jar,一條生成語句 如圖:(我用的是derby資料庫,使用其他資料庫需修改相應的jar驅動包) generatorConfig.xml文件 可以根 ...
  • 1.E:創建nodejs文件夾 2.先配置npm的全局模塊的存放路徑以及cache路徑: npm config set prefix "E:\nodejs\node_global" npm config set cache "D:\nodejs\node_cache" 3.安裝express模塊 n ...
  • DWZ的樹結構是按,的嵌套格式構成,最頂級的以class=”tree”標識。 treeFolder, treeCheck, expand|collapse則為可選的。 treeFolder:在所有樹節點前加上Icon圖標。 treeCheck:在所有樹節點前加上checkbox, expand表示樹... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...