国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

session和cookie機制及laravel框架下相關應用

NicolasHe / 3008人閱讀

摘要:服務器檢查該,以此來辨認用戶狀態。五下的相關應用應用在中配置如下配置項用于設置存儲方式,默認是,即存儲在文件中,該文件位于配置項配置的路徑,即。配置項用于設置有效期,默認為分鐘。配置項用于配置數據是否加密。

一、cookie的由來

??當用戶訪問某網站時,web服務器會將部分信息保存到本地計算機上,當用戶再次關顧該網站時,服務器會去查看用戶是否登錄過該網站,如果登錄過,就會將這些記錄在本地的信息發送到網頁上展示出來,這就是cookie存在的意義。

??那么服務器如何識別用戶呢?眾所周知,http協議是無狀態連接,所謂無狀態連接是指瀏覽器每次向服務器發起請求的時候,不是通過一個連接,而是每次都建立一個新的連接。如果是一個連接的話,服務器進程中就能保持住這個連接并且在內存中記住一些信息狀態。而每次請求結束后,連接就關閉,相關的內容就釋放了,所以記不住任何狀態,成為無狀態連接。基于http協議的服務器,針對于不同的連接,服務器無法識別這些連接都出自同一個用戶只手,于是cookie應運而生。

??當第一次訪問服務器時,http報文中是沒有cookie的,這時服務器在響應(response)下行HTTP報文中,命令瀏覽器攜帶cookie信息;瀏覽器再訪問同一個域的時候,將把cookie信息攜帶到請求(request)上行HTTP請求中,從而實現了HTTP模擬有了狀態。

??總結一下,cookie實際上是一小段的文本信息。客戶端請求服務器,如果服務器需要記錄該用戶狀態,就使用response向客戶端瀏覽器頒發一個Cookie。客戶端會把Cookie保存起來。當瀏覽器再請求該網站時,瀏覽器把請求的網址連同該Cookie一同提交給服務器。服務器檢查該Cookie,以此來辨認用戶狀態。服務器還可以根據需要修改Cookie的內容。

二、cookie的內容及特點

??cookie主要內容:名字、值、域、路徑和過期時間

Name和Value屬性由程序設定,默認值都是空引用

Domain屬性的默認值為當前URL的域名部分,不管發出這個cookie的頁面在哪個目錄下的

Path屬性的默認值是根目錄,即 ”/” ,不管發出這個cookie的頁面在哪個目錄下的。可以由程序設置為一定的路徑來進一步限制此cookie的作用范圍

Expires屬性,這個屬性設置此Cookie 的過期日期和時間

??當Expires屬性未設置時,瀏覽器網頁關閉后,cookie自動消失,稱之為會話cookie,會話cookie存在于內存中,而非本地的硬盤里;若設置了過期時間,瀏覽器就會把cookie保存到硬盤上,關閉后再次打開瀏覽器,這些cookie仍然有效直到超過設定的過期時間。存儲在硬盤上的cookie可以在瀏覽器的不同進程間共享。

cookie特點:

cookie不加密,可以隨意篡改,因此很不安全

不同域之間不能共享cookie

cookie大小受到限制,如下圖所示

三、session的出世

??為了彌補cookie不安全性這一致命缺點,session的機制產生了,session是另一種記錄客戶狀態的機制,不同的是cookie保存在客戶端瀏覽器中,而session保存在服務器上。客戶端瀏覽器訪問服務器的時候,服務器把客戶端信息以某種形式記錄在服務器上,這就是session。

??當用戶連接服務器時,服務器都會建立一個session,服務器通過session_id來識別是哪個用戶訪問。當用戶建立一次會話(session)時,可以在用戶授權成功時給他一個唯一的cookie,當一個用戶提交了表單時,瀏覽器會將用戶的SessionId自動附加在HTTP頭信息中,當服務器處理完這個表單后,將結果返回給SessionId所對應的用戶。

??總結一下,session是經過加密的,比cookie更安全,session的創建流程如下:當為客戶端請求創建session時,服務器首先檢查請求中是否含有session_id,如果有,則服務器會在將session_id檢索出來,如果服務器沒有存儲session_id,則創建一個session_id;如果沒有,則為此客戶端創建一個session并且生成一個與此session相關聯的sessionId,sessionId的值是一個既不會重復,又不容易被找到規律以仿造的字符串,這個sessionId將被在本次響應中返回給客戶端保存。

四、cookie與session的異同

??很多人說cookie和session就是一回事兒,區別在于用戶是否可見。我也比較認同此觀點,作為session的載體,cookie保存于本地瀏覽器中,易操作,易存儲,可有效的提高服務器性能(不占內存),但cookie有明文不安全,大小受限制等缺點; session保存于服務器緩存中,加密,session_id大小不受限制,但影響服務器性能。

??說到cookie和session的聯系,就不得不提到禁用cookie了,在客戶端瀏覽器設置里,用戶是可以禁用cookie的,因為cookie是session_id的載體,所以一旦cookie被禁用,那么session也就無法使用。但是有兩種方法可以解決依賴問題,其一是URL重寫,簡單的說就是在url地址中加入session_id參數,其二是表單隱藏字段,服務器會自動修改表單,添加一個隱藏字段,以便在表單提交時能夠把session_id傳遞回服務器,如下所示:

??另一個聯系是session共享,對于多網站(同一父域不同子域)單服務器,我們需要解決的就是來自不同網站之間session_id的共享。由于域名不同(aaa.test.com和bbb.test.com),而session_id又分別儲存在各自的cookie中,因此服務器會認為對于兩個子站的訪問,是來自不同的會話。解決的方法是通過修改cookies的域名為父域名達到cookie共享的目的,從而實現session_id的共享。帶來的弊端就是,子站間的cookie信息也同時被共享了。

五、laravel下的相關應用 session應用

??在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配置項用于設置Session存儲方式,默認是file,即存儲在文件中,該文件位于files配置項配置的路徑,即storage/framework/sessions。此外Laravel還支持其它存儲方式:

database:將Session數據存放到指定數據表中,該數據表由配置項table設置

memcached:將Session數據存放到Memcached中

redis:將Session數據存放到Redis中

array:將Session數據存放到數組中,該配置僅用于測試環境要修改driver配置,需要去項目根目錄下.env文件修改其中的SESSION_DRIVER選項。

lifetime配置項用于設置Session有效期,默認為120分鐘。
expire_on_close配置項用于設置是否在瀏覽器關閉時立即讓Session失效。
encrypt配置項用于配置Session數據是否加密。
lottery配置項用于配置回收Session存放位置。
cookie配置項用于配置存放Session ID的Cookie名稱,默認是laravel_session。
path配置項用于配置存放Session ID的Cookie存放路徑,默認為項目根目錄。
domain配置項用于配置存放Session ID的Cookie存放域名。
secure配置項用于配置是否只有在HTTPS協議下發送Session ID到服務器。

使用session函數
session(["site.xxx"=>"LaravelAcademy.org"]);
$site = session("site");
dd($site);

使用request請求

我們可以以這種方式獲取所有Session數據:

$sessions = $request->session()->all();

我們可以像這樣存取Session數據:

$request->session()->put("site", "http://LaravelAcademy.org");
if($request->session()->has("site")){
    $site = $request->session()->get("site");
    dd($site);
}

此外還可以這樣獲取Session數據(如果對應Session不存在,返回默認值):

$sitename = $request->session()->get("sitename","Laravel學院");
dd($sitename);

此外還可以使用push方法推送多個數據到Session數組:

$request->session()->push("site.xxx", "http://LaravelAcademy.org");
$request->session()->push("site.xxx", "Laravel學院");
if($request->session()->has("site")){
    $site = $request->session()->get("site");
    dd($site);
}

使用pull方法,獲取數據后刪除
使用flush方法,一次性刪除所有session數據
使用forget方法,刪除某個session數據

一次性session

如果想保證一次性Session數據有效,可以定義TestController@sessionx代碼如下:

public function sessionx(Request $request){
    $request->session()->reflash();
    $message = session("message");
    echo $message;
}

這樣不管怎么刷新Session數據始終有效。此外還可以指定哪些Session數據有效:

$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); // 啟動session
            $request->setSession($session);
        }
        $response = $this->app->handle($request, $type, $catch); // 調用controller的method
        if ($this->sessionConfigured()) {
            $this->closeSession($session);         //關閉session
            $this->addCookieToResponse($response, $session);
        }
        return $response;
    }
    ...
 
    protected function closeSession(SessionInterface $session)
    {
        $session->save();    // 保存session
        $this->collectGarbage($session);
    }
}
cookie應用 添加Cookie

例如,我們需要在控制器中設置一個"Hello, Laravel"的cookie值,并設置有效期為10分鐘。這里推薦使用cookie的隊列方法Cookie::queue(),因為這樣Cookie會自動添加到響應:


獲取Cookie

Cookie的使用離不開Response和Request。獲取Cookie的值有兩個層面,一個是服務端,另一個是客戶端。如果要服務端獲取到Cookie的值,就需要從Request中獲得:

public function index(Request $request)
{
    $cookie = $request->cookie("younger");
    dump($cookie);
}

如果想獲得所有Cookie的值,可以使用不傳參數的方法:

public function index(Request $request)
{
    $cookies = $request->cookie();
    dump($cookies);
}
清除Cookie

清除Cookie的方法比較簡單,原理和設置Cookie一樣的,只是將過期時間設置成了過去。這里也需要將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...

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30639.html

相關文章

  • Laravel Sessionid 處理機制

    摘要:在的配置文件中可以設置,比如這個項目中設置名稱為我們可以看到刷新頁面,查看,會發現一個名稱為的,名字就是我們自定義的。而這種加密方式是每次加密的結果都不同,所以表現為的值每次都發生了變化,而實際上并沒有改變。 在 Laravel 的配置文件 config/session.php 中可以設置 Session Cookie Name,比如這個項目中設置名稱為sns_session: /* ...

    BWrong 評論0 收藏0
  • Lumen 初體驗(二)

    摘要:的現狀目前是版本,是基于開發。入口文件啟動文件和配置文件框架的入口文件是。在路由中指定控制器類必須寫全命名空間,不然會提示找不到類。目前支持四種數據庫系統以及。使用時發生錯誤,因為在文件中,的默認驅動是。 最近使用 Lumen 做了 2 個業余項目,特此記錄和分享一下。 Lumen 的介紹 在使用一項新的技術時,了解其應用場景是首要的事情。 Lumen 的口號:為速度而生的 La...

    Cheriselalala 評論0 收藏0
  • php面試總結

    摘要:由一層函數調用進入下一層函數調用的遞推。此時,中的一個稱為孤兒的類就會收留這個對象。禁止訪問服務器拒絕請求服務器找不到請求的頁面服務器內部錯誤壞的網關一般是網關服務器請求后端服務時,后端服務沒有按照協議正確返回結果。 持續更新。。。。 php 1. 簡述 php 中的 autoload Autoload 的加載機制,當通過 new 來實例化一個類時,PHP 會通過定義的 autol...

    greatwhole 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<