Session的原理,大型網站中Session方面應注意什么?

一、Session和Cookie的區別

Session是在服務器端保持會話數據的一種方法(通常用于pc端網站保持登錄狀態,手機端通常會使用token方式實現),存儲在服務端。

Cookie是在客戶端保持用戶數據,存儲位置是客戶端(瀏覽器或者手機端)。

?

二、原理

1、當代碼session_start(); 運行的時候,就在服務器上產生了一個session文件,隨之也產生了與之唯一對應的一個session_id。

2、定義的Session變量以一定形式存儲在剛才產生的session文件中。客戶端將session_id傳遞給服務端,服務端根據session_id找到對應的文件,讀取的時候,對文件內容進行反序列化就能得到session的值,保存的時候先序列化再寫入。由此通過session_id可以取出之前定義的變量。

3、也就是說,Session_id是取得存儲在服務器端Session變量的身份證。

注:PHP中的Session在默認的情況下,是使用客戶端的Cookie來保存session_id的(session_start();之后,會自動將session_id存儲在cookie中),但是必須注意,Session不一定必須依賴Cookie,這也就是Session相比于Cookie的高明之處。當客戶端的Cookie被禁用或出現問題時,PHP會自動把session_id附著在URL中,這樣再通過session_id就能實現跨頁使用session變量了。但是這種附著也是有一定條件的,即php.ini文件中的“session.use_trans_sid=1”或者編譯時打開了--enable-trans-sid選項。

?

三、實驗cookie禁用后,session的傳遞

1、cookie未禁用時的結果

(1)php文件

c.php

<?php
session_start();
$_SESSION['name'] = "xiaobudiu";
echo $_SESSION['name'];
echo "<hr>";
var_dump($_COOKIE);
echo "<hr>";
$url = "<a href = 'b.php'>下一頁</a>";
echo $url;
?>

b.php

<?php
session_start();
echo $_SESSION['name'];
echo "<hr>";
var_dump($_COOKIE);
die;
?>

(2)此時,運行c.php代碼在瀏覽器會得到類似下面結果:

(3)此時點擊“下一頁”,跳轉到b.php

2、禁用掉cookie之后,重新運行代碼

注:禁用cookie位置:chrome://settings/content

得到的結果:

也就是說,在不更改php.ini配置文件的前提下,禁用掉cookie之后,默認session是無法跨頁傳輸的

?

?

3、解決禁用掉cookie之后,讓session仍然可以正常傳輸

(1)關閉php.ini配置文件中?session.use_only_cookies,打開php.ini配置文件中session.use_trans_sid,如下:

session.use_trans_sid = 1
session.use_only_cookies = 0

(2)重新運次c.php

點擊下一頁進入b.php

可以看到,在瀏覽器禁用cookie之后,session仍然是可以繼續傳輸的,只不過需要進行配置而已。

但事實上,并不太建議,也不需要這么做。畢竟是存在安全風險的。而且目前瀏覽器基本也不會主動禁用cookie。

?

四、Session在大型網站應用中需要注意的問題

?

1、如何解決Session文件過多,消耗IO性能

建議:可以更改php.ini的 session.save_handler 參數為redis或memcache等內存緩存數據庫。

?

2、解決Session的同步問題

我們前端可能有很多臺服務器,用戶在A服務器上登錄了,種下了session信息,然后訪問網站的某些頁面沒準跳到B服務器上去了,如果這個時候B服務器上沒有session信息又沒有做特殊處理,可能就會出問題了。

解決方案:

(1)更改php.ini的 session.save_handler 參數為redis或memcache等內存緩存數據庫

(2)還有一種方式是通過加密的cookie來實現,用戶在A服務器上登錄成功,在用戶的瀏覽器上種上一個加密的cookie,當用戶訪問B服務器時,檢查有無 session,如果有當然沒問題,如果沒有,就去檢驗cookie是否有效,cookie有效的話就在B服務器上重建session。這種方法其實很有 用,如果網站有很多個子頻道,服務器也不在一個機房,session沒辦法同步又想做統一登錄那就太有用了。
(3)當然還有一種方法就是在負載均衡那一層保持會話,把訪問者綁定在某個服務器上,他的所有訪問都在那個服務器上就不需要session同步了(比如負載均衡中的ip_hash)。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282253.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282253.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282253.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL5.5讀寫分離之mysql-proxy

通常一個網站在初期訪問量都比較小&#xff0c;所以一般的小架構足以支撐。但是&#xff0c;當網站逐漸發展起來后&#xff0c;隨之而來的是大量的訪問&#xff0c;這時候最先出現的瓶頸就是數據庫了。因為數據的寫入讀取操作&#xff08;I/O&#xff09;是集群中響應速度最慢的…

兩圓相交求面積 hdu5120

轉載 兩圓相交分如下集中情況&#xff1a;相離、相切、相交、包含。 設兩圓圓心分別是O1和O2&#xff0c;半徑分別是r1和r2&#xff0c;設d為兩圓心距離。又因為兩圓有大有小&#xff0c;我們設較小的圓是O1。 相離相切的面積為零&#xff0c;代碼如下&#xff1a; [cpp] view …

Python_list部分功能介紹

x.append():在列表尾部添加一個元素 x.clear():把列表清空 x.count():判斷某個元素出現的次數 x.extend():合并兩個列表&#xff0c;或者一個元組 x.index():獲取元素下標 x.insert():指定下標添加元素 x.pop():移除某一元素&#xff0c;移除的元素可獲取 x.remove():移除指定的…

一招解決開發環境問題 —— 遠程容器開發指南

前言使用C作為主要開發語言的程序猿們應該會認同搭建開發環境是一件煩人的事情。為了編譯一個程序不僅需要下載各種依賴包&#xff0c;還可能面臨本地系統不兼容、編譯器版本不一致、包版本沖突等各種問題。筆者在運營iLogtail開源社區的過程中發現開發和調試環境問題也是成員問…

php中常用的加密方式

一、md5 要說php中的最常用的加密方式&#xff0c;md5可以說是當仁不讓。 使用起來也很簡單便捷。 注&#xff1a;使用方式請看 六、md5加密方式的漏洞及解決方案 二、password_hash 作為php5.5以上版本專門用于加密的方式&#xff0c;自然有其獨到之處。 使用方式鏈接&a…

解決問題的策略-分而治之

一個宏偉的目標看上去遙不可及&#xff0c;這怎么可能做成呢&#xff1f;但是你把這些目標分解成一個一個的小目標&#xff0c;小目標再往下分解&#xff0c;分解到最后&#xff0c;分解成細枝末節時你會發現&#xff0c;這事其實是可以做的。這個做成了再往下走一步&#xff0…

UITabBarController的基本原理及使用(一)

前言 UITabBarController在iOS開發中是一個高頻使用的控制器&#xff0c;典型的案例如QQ、微信均使用UITabBarController布局。本文將從一個新建工程&#xff0c;和大家一起了解UITabBarController的基本原理和使用方法。 基本概念 UITabBarController能夠方便地管理多個控制器…

word-vba-microsoft(中英文)

中文 https://msdn.microsoft.com/zh-cn/vba/word-vba/articles/view-displaypageboundaries-property-word 英文 https://msdn.microsoft.com/en-us/vba/word-vba/articles/view-displaypageboundaries-property-word轉載于:https://www.cnblogs.com/itzxy/p/7625915.html

C# 多線程ThreadPool用法舉例

概述ThreadPool是.Net Framework 2.0版本中出現的。自從Task出來以后&#xff0c;ThreadPool已經很少用了&#xff0c;但是一些老的代碼或者一些古老的程序猿還是會用到他&#xff0c;所以我們可以不用它&#xff0c;但是還是有必須學習和了解他.ThreadPool用法舉例static void…

Mysql實現主從復制(一主雙從)

一、環境介紹 LNMP&#xff08;centos7&#xff0c;mysql5.6&#xff09; vmware workstation pro配置了3個虛擬機&#xff0c;均安裝了LNMP環境&#xff1a; master&#xff1a; 192.168.0.105 slave&#xff1a; 192.168.0.106 、192.168.0.107 二、原理 &a…

Elasticsearch學習筆記-04.3批處理

除了創建、更新和刪除個別文檔&#xff0c;Elasticsearch還提供了使用_bulk API的上述操作的批量操作方法。這個功能很重要&#xff0c;因為他提供了一種有效的機制來在盡可能少的網絡傳輸過程中執行多次操作。 作為一個快速示例&#xff0c;下面的命令在一次批量操作中索引了兩…

接口文檔神器Swagger(下篇)

本文來自網易云社區作者&#xff1a;李哲二、Swagger-springmvc原理解析上面介紹了如何將springmvc和springboot與swagger結合&#xff0c;通過簡單配置生成接口文檔&#xff0c;以及介紹了swagger提供的一些注解。下面將介紹swagger是如何做到與springmvc結合&#xff0c;自動…

php實現mysql分表

一、場景說明 1、為什么要進行分表 隨著數據量的不斷增大&#xff0c;一張表中的數據肯定也會越來越多&#xff0c;甚至達到百萬甚至千萬級。我們通常會通過搭建mysql集群&#xff08;主從同步&#xff09;&#xff0c;讀寫分離來實現優化數據庫查詢執行效率。 但是由于數據…

利用python進行數據分析D1——ch02引言

基礎的課程還沒學完&#xff0c;就來這本了&#xff0c;因為我平時的研究還是以數據的處理為主。把自己的事做好做細致讀了一下介紹部分&#xff0c;下載書里用到的數據&#xff0c;下載地址&#xff1a;https://github.com/wesm/pydata-book 如果你需要完成以下幾大類任務&…

記一次Memory Leak分析

起因&#xff1a;最近公司的一個web產品遇到了內存溢出&#xff0c;于是開始著手調查。調查&#xff1a;首先當務之急是找到那個或那些API導致Memory Leak&#xff0c;這個應該不難&#xff0c;根據監控分析&#xff0c;在內存上升時間段內有哪些API被訪問&#xff0c;再就是根…

【t057】任務分配

Time Limit: 1 second Memory Limit: 128 MB 【問題描述】 現有n個任務,要交給A和B完成。每個任務給A或給B完成&#xff0c;所需的時間分別為ai和bi。問他們完成所有的任務至少要多少時間。 【輸入格式】 第一行一個正整數n&#xff0c;表示有n個任務。 接下來有n行&#xf…

LeetCode 366. Find Leaves of Binary Tree

實質就是求每個節點的最大深度。用一個hash表記錄&#xff0c;最后輸出。 class Solution { public:unordered_map<TreeNode *,int> hash; // record the level from bottomvector<vector<int>> findLeaves(TreeNode* root) {vector<vector<int>>…

C#比較對象的相等性

對于相等的機制全部不同&#xff0c;這取決于比較的是引用類型還是值類型。以下分別介紹引用類型和值類型的相等性。1.比較引用類型的相等性 System.Object定義了三種不同的方法&#xff0c;來比較對象的相等性&#xff1a;ReferenceEquals()和兩個版本號的Equals()。再加上比較…

WebSocket教程

一、為什么需要 WebSocket&#xff1f; 初次接觸 WebSocket 的人&#xff0c;都會問同樣的問題&#xff1a;我們已經有了 HTTP 協議&#xff0c;為什么還需要另一個協議&#xff1f;它能帶來什么好處&#xff1f; 答案很簡單&#xff0c;因為 HTTP 協議有一個缺陷&#xff1a…

C# WPF十個美觀的界面設計展示

概述很多時候&#xff0c;我們設計的界面總是感覺缺乏美感&#xff0c;不是我們不會開發好看的界面&#xff0c;而是不知道怎么才算美觀&#xff0c;這時候我們不妨看看別人好的頁面是怎么做的.下面展示一些我覺得做的比較好的cs界面&#xff0c;希望能給大家在平時做界面設計時…