session

https://blog.csdn.net/hjc1984117/article/details/53995816
今天就來完全的學一些session是個啥東西,我羅列了幾個須要知道的要點:php

1.session 是啥?
2.怎麼保存的?
3.如何運行?
4.有生命週期嗎?
5.關閉瀏覽器會過時嗎?
6.Redis代替文件存儲session
7.分佈式session的同步問題html

session是啥?面試

首先,我大體的知道,session是一次瀏覽器和服務器的交互的會話,會話是啥呢?就是我問候你好嗎?你回恩很好。就是一次會話,那麼對話完成後,此次會話就結束了,還有我也知道,咱們能夠將一個變量存入所有的$_SESSION['name']中,這樣php的各個頁面和邏輯都能訪問到,因此很輕鬆的用來判斷是否登錄。數據庫

這是我以前理解的session,固然也是對的,只是解釋的太膚淺,理解的太表面了,面試官若是聽到這樣的答案實際上是不太滿意的。我參考了其餘的不少資料,完全理解清楚session。瀏覽器

在說session是啥以前,咱們先來講說爲何會出現session會話,它出現的機理是什麼?咱們知道,咱們用瀏覽器打開一個網頁,用到的是HTTP協議,學過計算機的應該都知道這個協議,它是無狀態的,什麼是無狀態呢?就是說這一次請求和上一次請求是沒有任何關係的,互不認識的,沒有關聯的。可是這種無狀態的的好處是快速。安全

因此就會帶來一個問題就是,我但願幾個請求的頁面要有關聯,好比:我在www.a.com/login.php裏面登錄了,我在www.a.com/index.php 也但願是登錄狀態,可是,這是2個不一樣的頁面,也就是2個不一樣的HTTP請求,這2個HTTP請求是無狀態的,也就是無關聯的,因此沒法單純的在index.php中讀取到它在login.php中已經登錄了!服務器

那咋搞呢?我不可能這2個頁面我都去登錄一遍吧。或者用笨方法這2個頁面都去查詢數據庫,若是有登錄狀態,就判斷是登錄的了。這種查詢數據庫的方案雖然可行,可是每次都要去查詢數據庫不是個事,會形成數據庫的壓力。cookie

因此正是這種訴求,這個時候,一個新的客戶端存儲數據方式出現了:cookie。cookie是把少許的信息存儲在用戶本身的電腦上,它在一個域名下是一個全局的,只要設置它的存儲路徑在域名www.a.com下 ,那麼當用戶用瀏覽器訪問時,php就能夠從這個域名的任意頁面讀取cookie中的信息。因此就很好的解決了我在www.a.com/login.php頁面登錄了,我也能夠在www.a.com/index.php獲取到這個登錄信息了。同時又不用反覆去查詢數據庫。session

雖然這種方案很不錯,也很快速方便,可是因爲cookie 是存在用戶端,並且它自己存儲的尺寸大小也有限,最關鍵是用戶能夠是可見的,並能夠隨意的修改,很不安全。那如何又要安全,又能夠方便的全局讀取信息呢?因而,這個時候,一種新的存儲會話機制:session 誕生了。分佈式

我擦,終於把session是怎麼誕生的給圓清楚了,不容易啊!!!

好,session 誕生了,從上面的描述來說,它就是在一次會話中解決2次HTTP的請求的關聯,讓它們產生聯繫,讓2兩個頁面都能讀取到找個這個全局的session信息。session信息存在於服務器端,因此也就很好的解決了安全問題。

session的運行機制和是怎麼保存的?

既然,它也是一種服務區存儲數據的方式,確定也是存在服務器的某個地方了。確實,它存在服務器的/tmp 目錄下,這一點咱們接下來慢慢講。

咱們先說下它的運行機制,是怎麼分配的。咱們主要用PHP中session的機制,其實各類語言都差很少。

若是這個時候,咱們須要用到session,那咱們第一步怎麼辦呢?第一步是開啓session:

session_start();
這是個無任何返回值的函數,既不會報錯,也不會成功。它的做用是開啓session,並隨機生成一個惟一的32位的session_id,相似於這樣:

4c83638b3b0dbf65583181c2f89168ec
session的所有機制也是基於這個session_id,它用來區分哪幾回請求是一我的發出的。爲何要這樣呢?由於HTTP是無狀態無關聯的,一個頁面可能會被成百上千人訪問,並且每一個人的用戶名是不同的,那麼服務器如何區分此次是小王訪問的,那次是小名訪問的呢?因此就有了找個惟一的session_id 來綁定一個用戶。一個用戶在一次會話上就是一個session_id,這樣成千上萬的人訪問,服務器也能區分究竟是誰在訪問了。
https://www.cnblogs.com/-ROCKS/p/6108556.html
什麼是Session
對Tomcat而言,Session是一塊在服務器開闢的內存空間,其存儲結構爲ConcurrentHashMap;
Session的目的
Http協議是一種無狀態協議,即每次服務端接收到客戶端的請求時,都是一個全新的請求,服務器並不知道客戶端的歷史請求記錄;
Session的主要目的就是爲了彌補Http的無狀態特性。簡單的說,就是服務器能夠利用session存儲客戶端在同一個會話期間的一些操做記錄;
實現機制
先看兩個問題,以下:
一、服務器如何判斷客戶端發送過來的請求是屬於同一個會話?
答:用Session id區分,Session id相同的即認爲是同一個會話,在Tomcat中Session id用JSESSIONID表示;二、服務器、客戶端如何獲取Session id?Session id在其之間是如何傳輸的呢?答:服務器第一次接收到請求時,開闢了一塊Session空間(建立了Session對象),同時生成一個Session id,並經過響應頭的Set-Cookie:「JSESSIONID=XXXXXXX」命令,向客戶端發送要求設置cookie的響應;客戶端收到響應後,在本機客戶端設置了一個JSESSIONID=XXXXXXX的cookie信息,該cookie的過時時間爲瀏覽器會話結束;接下來客戶端每次向同一個網站發送請求時,請求頭都會帶上該cookie信息(包含Session id);而後,服務器經過讀取請求頭中的Cookie信息,獲取名稱爲JSESSIONID的值,獲得這次請求的Session id;ps:服務器只會在客戶端第一次請求響應的時候,在響應頭上添加Set-Cookie:「JSESSIONID=XXXXXXX」信息,接下來在同一個會話的第二第三次響應頭裏,是不會添加Set-Cookie:「JSESSIONID=XXXXXXX」信息的;而客戶端是會在每次請求頭的cookie中帶上JSESSIONID信息;

相關文章
相關標籤/搜索