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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...