摘要:服務(wù)器檢查該,以此來(lái)辨認(rèn)用戶狀態(tài)。五下的相關(guān)應(yīng)用應(yīng)用在中配置如下配置項(xiàng)用于設(shè)置存儲(chǔ)方式,默認(rèn)是,即存儲(chǔ)在文件中,該文件位于配置項(xiàng)配置的路徑,即。配置項(xiàng)用于設(shè)置有效期,默認(rèn)為分鐘。配置項(xiàng)用于配置數(shù)據(jù)是否加密。
一、cookie的由來(lái)
??當(dāng)用戶訪問(wèn)某網(wǎng)站時(shí),web服務(wù)器會(huì)將部分信息保存到本地計(jì)算機(jī)上,當(dāng)用戶再次關(guān)顧該網(wǎng)站時(shí),服務(wù)器會(huì)去查看用戶是否登錄過(guò)該網(wǎng)站,如果登錄過(guò),就會(huì)將這些記錄在本地的信息發(fā)送到網(wǎng)頁(yè)上展示出來(lái),這就是cookie存在的意義。
??那么服務(wù)器如何識(shí)別用戶呢?眾所周知,http協(xié)議是無(wú)狀態(tài)連接,所謂無(wú)狀態(tài)連接是指瀏覽器每次向服務(wù)器發(fā)起請(qǐng)求的時(shí)候,不是通過(guò)一個(gè)連接,而是每次都建立一個(gè)新的連接。如果是一個(gè)連接的話,服務(wù)器進(jìn)程中就能保持住這個(gè)連接并且在內(nèi)存中記住一些信息狀態(tài)。而每次請(qǐng)求結(jié)束后,連接就關(guān)閉,相關(guān)的內(nèi)容就釋放了,所以記不住任何狀態(tài),成為無(wú)狀態(tài)連接。基于http協(xié)議的服務(wù)器,針對(duì)于不同的連接,服務(wù)器無(wú)法識(shí)別這些連接都出自同一個(gè)用戶只手,于是cookie應(yīng)運(yùn)而生。
??當(dāng)?shù)谝淮卧L問(wèn)服務(wù)器時(shí),http報(bào)文中是沒(méi)有cookie的,這時(shí)服務(wù)器在響應(yīng)(response)下行HTTP報(bào)文中,命令瀏覽器攜帶cookie信息;瀏覽器再訪問(wèn)同一個(gè)域的時(shí)候,將把cookie信息攜帶到請(qǐng)求(request)上行HTTP請(qǐng)求中,從而實(shí)現(xiàn)了HTTP模擬有了狀態(tài)。
??總結(jié)一下,cookie實(shí)際上是一小段的文本信息。客戶端請(qǐng)求服務(wù)器,如果服務(wù)器需要記錄該用戶狀態(tài),就使用response向客戶端瀏覽器頒發(fā)一個(gè)Cookie。客戶端會(huì)把Cookie保存起來(lái)。當(dāng)瀏覽器再請(qǐng)求該網(wǎng)站時(shí),瀏覽器把請(qǐng)求的網(wǎng)址連同該Cookie一同提交給服務(wù)器。服務(wù)器檢查該Cookie,以此來(lái)辨認(rèn)用戶狀態(tài)。服務(wù)器還可以根據(jù)需要修改Cookie的內(nèi)容。
二、cookie的內(nèi)容及特點(diǎn)??cookie主要內(nèi)容:名字、值、域、路徑和過(guò)期時(shí)間
Name和Value屬性由程序設(shè)定,默認(rèn)值都是空引用
Domain屬性的默認(rèn)值為當(dāng)前URL的域名部分,不管發(fā)出這個(gè)cookie的頁(yè)面在哪個(gè)目錄下的
Path屬性的默認(rèn)值是根目錄,即 ”/” ,不管發(fā)出這個(gè)cookie的頁(yè)面在哪個(gè)目錄下的。可以由程序設(shè)置為一定的路徑來(lái)進(jìn)一步限制此cookie的作用范圍
Expires屬性,這個(gè)屬性設(shè)置此Cookie 的過(guò)期日期和時(shí)間
??當(dāng)Expires屬性未設(shè)置時(shí),瀏覽器網(wǎng)頁(yè)關(guān)閉后,cookie自動(dòng)消失,稱之為會(huì)話cookie,會(huì)話cookie存在于內(nèi)存中,而非本地的硬盤里;若設(shè)置了過(guò)期時(shí)間,瀏覽器就會(huì)把cookie保存到硬盤上,關(guān)閉后再次打開(kāi)瀏覽器,這些cookie仍然有效直到超過(guò)設(shè)定的過(guò)期時(shí)間。存儲(chǔ)在硬盤上的cookie可以在瀏覽器的不同進(jìn)程間共享。
cookie特點(diǎn):
cookie不加密,可以隨意篡改,因此很不安全
不同域之間不能共享cookie
cookie大小受到限制,如下圖所示
三、session的出世??為了彌補(bǔ)cookie不安全性這一致命缺點(diǎn),session的機(jī)制產(chǎn)生了,session是另一種記錄客戶狀態(tài)的機(jī)制,不同的是cookie保存在客戶端瀏覽器中,而session保存在服務(wù)器上。客戶端瀏覽器訪問(wèn)服務(wù)器的時(shí)候,服務(wù)器把客戶端信息以某種形式記錄在服務(wù)器上,這就是session。
??當(dāng)用戶連接服務(wù)器時(shí),服務(wù)器都會(huì)建立一個(gè)session,服務(wù)器通過(guò)session_id來(lái)識(shí)別是哪個(gè)用戶訪問(wèn)。當(dāng)用戶建立一次會(huì)話(session)時(shí),可以在用戶授權(quán)成功時(shí)給他一個(gè)唯一的cookie,當(dāng)一個(gè)用戶提交了表單時(shí),瀏覽器會(huì)將用戶的SessionId自動(dòng)附加在HTTP頭信息中,當(dāng)服務(wù)器處理完這個(gè)表單后,將結(jié)果返回給SessionId所對(duì)應(yīng)的用戶。
??總結(jié)一下,session是經(jīng)過(guò)加密的,比cookie更安全,session的創(chuàng)建流程如下:當(dāng)為客戶端請(qǐng)求創(chuàng)建session時(shí),服務(wù)器首先檢查請(qǐng)求中是否含有session_id,如果有,則服務(wù)器會(huì)在將session_id檢索出來(lái),如果服務(wù)器沒(méi)有存儲(chǔ)session_id,則創(chuàng)建一個(gè)session_id;如果沒(méi)有,則為此客戶端創(chuàng)建一個(gè)session并且生成一個(gè)與此session相關(guān)聯(lián)的sessionId,sessionId的值是一個(gè)既不會(huì)重復(fù),又不容易被找到規(guī)律以仿造的字符串,這個(gè)sessionId將被在本次響應(yīng)中返回給客戶端保存。
四、cookie與session的異同??很多人說(shuō)cookie和session就是一回事兒,區(qū)別在于用戶是否可見(jiàn)。我也比較認(rèn)同此觀點(diǎn),作為session的載體,cookie保存于本地瀏覽器中,易操作,易存儲(chǔ),可有效的提高服務(wù)器性能(不占內(nèi)存),但cookie有明文不安全,大小受限制等缺點(diǎn); session保存于服務(wù)器緩存中,加密,session_id大小不受限制,但影響服務(wù)器性能。
??說(shuō)到cookie和session的聯(lián)系,就不得不提到禁用cookie了,在客戶端瀏覽器設(shè)置里,用戶是可以禁用cookie的,因?yàn)閏ookie是session_id的載體,所以一旦cookie被禁用,那么session也就無(wú)法使用。但是有兩種方法可以解決依賴問(wèn)題,其一是URL重寫(xiě),簡(jiǎn)單的說(shuō)就是在url地址中加入session_id參數(shù),其二是表單隱藏字段,服務(wù)器會(huì)自動(dòng)修改表單,添加一個(gè)隱藏字段,以便在表單提交時(shí)能夠把session_id傳遞回服務(wù)器,如下所示:
??另一個(gè)聯(lián)系是session共享,對(duì)于多網(wǎng)站(同一父域不同子域)單服務(wù)器,我們需要解決的就是來(lái)自不同網(wǎng)站之間session_id的共享。由于域名不同(aaa.test.com和bbb.test.com),而session_id又分別儲(chǔ)存在各自的cookie中,因此服務(wù)器會(huì)認(rèn)為對(duì)于兩個(gè)子站的訪問(wèn),是來(lái)自不同的會(huì)話。解決的方法是通過(guò)修改cookies的域名為父域名達(dá)到cookie共享的目的,從而實(shí)現(xiàn)session_id的共享。帶來(lái)的弊端就是,子站間的cookie信息也同時(shí)被共享了。
五、laravel下的相關(guān)應(yīng)用 session應(yīng)用??在config/session.php中配置如下:
"driver" => env("SESSION_DRIVER", "file"), "lifetime" => 120, "expire_on_close" => false, "encrypt" => false, "files" => storage_path("framework/sessions"), "connection" => null, "table" => "sessions", "lottery" => [2, 100], "cookie" => "laravel_session", "path" => "/", "domain" => null, "secure" => false, ];
??driver配置項(xiàng)用于設(shè)置Session存儲(chǔ)方式,默認(rèn)是file,即存儲(chǔ)在文件中,該文件位于files配置項(xiàng)配置的路徑,即storage/framework/sessions。此外Laravel還支持其它存儲(chǔ)方式:
database:將Session數(shù)據(jù)存放到指定數(shù)據(jù)表中,該數(shù)據(jù)表由配置項(xiàng)table設(shè)置
memcached:將Session數(shù)據(jù)存放到Memcached中
redis:將Session數(shù)據(jù)存放到Redis中
array:將Session數(shù)據(jù)存放到數(shù)組中,該配置僅用于測(cè)試環(huán)境要修改driver配置,需要去項(xiàng)目根目錄下.env文件修改其中的SESSION_DRIVER選項(xiàng)。
lifetime配置項(xiàng)用于設(shè)置Session有效期,默認(rèn)為120分鐘。
expire_on_close配置項(xiàng)用于設(shè)置是否在瀏覽器關(guān)閉時(shí)立即讓Session失效。
encrypt配置項(xiàng)用于配置Session數(shù)據(jù)是否加密。
lottery配置項(xiàng)用于配置回收Session存放位置。
cookie配置項(xiàng)用于配置存放Session ID的Cookie名稱,默認(rèn)是laravel_session。
path配置項(xiàng)用于配置存放Session ID的Cookie存放路徑,默認(rèn)為項(xiàng)目根目錄。
domain配置項(xiàng)用于配置存放Session ID的Cookie存放域名。
secure配置項(xiàng)用于配置是否只有在HTTPS協(xié)議下發(fā)送Session ID到服務(wù)器。
session(["site.xxx"=>"LaravelAcademy.org"]); $site = session("site"); dd($site);使用request請(qǐng)求
我們可以以這種方式獲取所有Session數(shù)據(jù):
$sessions = $request->session()->all();
我們可以像這樣存取Session數(shù)據(jù):
$request->session()->put("site", "http://LaravelAcademy.org"); if($request->session()->has("site")){ $site = $request->session()->get("site"); dd($site); }
此外還可以這樣獲取Session數(shù)據(jù)(如果對(duì)應(yīng)Session不存在,返回默認(rèn)值):
$sitename = $request->session()->get("sitename","Laravel學(xué)院"); dd($sitename);
此外還可以使用push方法推送多個(gè)數(shù)據(jù)到Session數(shù)組:
$request->session()->push("site.xxx", "http://LaravelAcademy.org"); $request->session()->push("site.xxx", "Laravel學(xué)院"); if($request->session()->has("site")){ $site = $request->session()->get("site"); dd($site); }
使用pull方法,獲取數(shù)據(jù)后刪除
使用flush方法,一次性刪除所有session數(shù)據(jù)
使用forget方法,刪除某個(gè)session數(shù)據(jù)
如果想保證一次性Session數(shù)據(jù)有效,可以定義TestController@sessionx代碼如下:
public function sessionx(Request $request){ $request->session()->reflash(); $message = session("message"); echo $message; }
這樣不管怎么刷新Session數(shù)據(jù)始終有效。此外還可以指定哪些Session數(shù)據(jù)有效:
$request->session()->keep(["message"]);
大家也可以自行編譯laravel代碼:
class Middleware implements HttpKernelInterface { ... public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true) { $this->checkRequestForArraySessions($request); if ($this->sessionConfigured()) { $session = $this->startSession($request); // 啟動(dòng)session $request->setSession($session); } $response = $this->app->handle($request, $type, $catch); // 調(diào)用controller的method if ($this->sessionConfigured()) { $this->closeSession($session); //關(guān)閉session $this->addCookieToResponse($response, $session); } return $response; } ... protected function closeSession(SessionInterface $session) { $session->save(); // 保存session $this->collectGarbage($session); } }cookie應(yīng)用 添加Cookie
例如,我們需要在控制器中設(shè)置一個(gè)"Hello, Laravel"的cookie值,并設(shè)置有效期為10分鐘。這里推薦使用cookie的隊(duì)列方法Cookie::queue(),因?yàn)檫@樣Cookie會(huì)自動(dòng)添加到響應(yīng):
獲取CookieCookie的使用離不開(kāi)Response和Request。獲取Cookie的值有兩個(gè)層面,一個(gè)是服務(wù)端,另一個(gè)是客戶端。如果要服務(wù)端獲取到Cookie的值,就需要從Request中獲得:
public function index(Request $request) { $cookie = $request->cookie("younger"); dump($cookie); }如果想獲得所有Cookie的值,可以使用不傳參數(shù)的方法:
public function index(Request $request) { $cookies = $request->cookie(); dump($cookies); }清除Cookie清除Cookie的方法比較簡(jiǎn)單,原理和設(shè)置Cookie一樣的,只是將過(guò)期時(shí)間設(shè)置成了過(guò)去。這里也需要將Cookie加入到HTTP的Response中,使用make()或者forget()方法均可:
方式一: Cookie::queue(Cookie::forget("younger")); 或 setcookie("younger", "", -1, "/"); 方式二: $cookie = Cookie::forget("younger"); //return Redirect::route("index")->withCookie($cookie);參考博文https://segmentfault.com/a/11...
http://www.cnblogs.com/endles...
http://blog.csdn.net/sundache...
http://blog.csdn.net/proglove...
https://www.zhihu.com/questio...
http://laravelacademy.org/pos...
http://www.cnblogs.com/phpper...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/30639.html
摘要:在的配置文件中可以設(shè)置,比如這個(gè)項(xiàng)目中設(shè)置名稱為我們可以看到刷新頁(yè)面,查看,會(huì)發(fā)現(xiàn)一個(gè)名稱為的,名字就是我們自定義的。而這種加密方式是每次加密的結(jié)果都不同,所以表現(xiàn)為的值每次都發(fā)生了變化,而實(shí)際上并沒(méi)有改變。 在 Laravel 的配置文件 config/session.php 中可以設(shè)置 Session Cookie Name,比如這個(gè)項(xiàng)目中設(shè)置名稱為sns_session: /* ...
摘要:的現(xiàn)狀目前是版本,是基于開(kāi)發(fā)。入口文件啟動(dòng)文件和配置文件框架的入口文件是。在路由中指定控制器類必須寫(xiě)全命名空間,不然會(huì)提示找不到類。目前支持四種數(shù)據(jù)庫(kù)系統(tǒng)以及。使用時(shí)發(fā)生錯(cuò)誤,因?yàn)樵谖募校哪J(rèn)驅(qū)動(dòng)是。 最近使用 Lumen 做了 2 個(gè)業(yè)余項(xiàng)目,特此記錄和分享一下。 Lumen 的介紹 在使用一項(xiàng)新的技術(shù)時(shí),了解其應(yīng)用場(chǎng)景是首要的事情。 Lumen 的口號(hào):為速度而生的 La...
摘要:由一層函數(shù)調(diào)用進(jìn)入下一層函數(shù)調(diào)用的遞推。此時(shí),中的一個(gè)稱為孤兒的類就會(huì)收留這個(gè)對(duì)象。禁止訪問(wèn)服務(wù)器拒絕請(qǐng)求服務(wù)器找不到請(qǐng)求的頁(yè)面服務(wù)器內(nèi)部錯(cuò)誤壞的網(wǎng)關(guān)一般是網(wǎng)關(guān)服務(wù)器請(qǐng)求后端服務(wù)時(shí),后端服務(wù)沒(méi)有按照協(xié)議正確返回結(jié)果。 持續(xù)更新。。。。 php 1. 簡(jiǎn)述 php 中的 autoload Autoload 的加載機(jī)制,當(dāng)通過(guò) new 來(lái)實(shí)例化一個(gè)類時(shí),PHP 會(huì)通過(guò)定義的 autol...
閱讀 4956·2023-04-25 18:47
閱讀 2687·2021-11-19 11:33
閱讀 3456·2021-11-11 16:54
閱讀 3111·2021-10-26 09:50
閱讀 2558·2021-10-14 09:43
閱讀 679·2021-09-03 10:47
閱讀 685·2019-08-30 15:54
閱讀 1512·2019-08-30 15:44