亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

direktori cari
閱讀前篇 簡(jiǎn)介 Yii 是什么 從 Yii 1.1 升級(jí) 入門(mén) 安裝 Yii 運(yùn)行應(yīng)用 第一次問(wèn)候 使用Forms 數(shù)據(jù)庫(kù)應(yīng)用 使用 Gii 生成代碼 進(jìn)階 應(yīng)用結(jié)構(gòu) 概述 入口腳本 應(yīng)用(Applications) 應(yīng)用組件(Application Components) 控制器(Controllers) 模型(Models) 視圖(views) 模塊(Modules) 過(guò)濾器(Filters) 小部件(Widgets) 前端資源(Assets) 擴(kuò)展(Extensions) 請(qǐng)求處理 運(yùn)行概述 啟動(dòng)引導(dǎo)(Bootstrapping) 路由和創(chuàng)建URL 請(qǐng)求(Requests) 響應(yīng)(Responses) Sessions 和 Cookies 錯(cuò)誤處理(Handling Errors) 日志(Logging) 關(guān)鍵概念 組件(Component) 屬性(Property) 事件(Events) 行為(Behaviors) 配置(Configurations) 別名(Aliases) 類自動(dòng)加載(Autoloading) 服務(wù)定位器(Service Locator) 依賴注入容器(Dependency Injection Container) 配合數(shù)據(jù)庫(kù)工作 數(shù)據(jù)庫(kù)訪問(wèn) (Data Access Objects) 查詢生成器(Query Builder) 活動(dòng)記錄(Active Record) 數(shù)據(jù)庫(kù)遷移(Migrations) Sphinx Redis MongoDB Elasticsearch 接收用戶數(shù)據(jù) 創(chuàng)建表單(Creating Forms) 輸入驗(yàn)證(Validating Input) 文件上傳(Uploading Files) 收集列表輸入(Collecting Tabular Input) 多模型的復(fù)合表單(Getting Data for Multiple Models) 顯示數(shù)據(jù) 格式化輸出數(shù)據(jù)(Data Formatting) 分頁(yè)(Pagination) 排序(Sorting) 數(shù)據(jù)提供器(Data Providers) 數(shù)據(jù)小部件(Data Widgets) 客戶端腳本使用(Working with Client Scripts) 主題(Theming) 安全 認(rèn)證(Authentication) 授權(quán)(Authorization) 處理密碼(Working with Passwords) 客戶端認(rèn)證(Auth Clients) 最佳安全實(shí)踐(Best Practices) 緩存 概述 數(shù)據(jù)緩存 片段緩存 頁(yè)面緩存 HTTP 緩存 RESTfull Web服務(wù) 快速入門(mén)(Quick Start) 資源(Resources) 控制器(Controllers) 路由(Routing) 格式化響應(yīng)(Response Formatting) 授權(quán)認(rèn)證(Authentication) 速率限制(Rate Limiting) 版本(Versioning) 錯(cuò)誤處理(Error Handling) 開(kāi)發(fā)工具 調(diào)試工具欄和調(diào)試器 使用Gii生成代碼 生成API文檔 測(cè)試 概述(Overview) 配置測(cè)試環(huán)境(Testing environment setup) 單元測(cè)試(Unit Tests) 功能測(cè)試(Function Tests) 驗(yàn)收測(cè)試(Acceptance Tests) 測(cè)試夾具(Fixtures) 高級(jí)專題 高級(jí)應(yīng)用模板 創(chuàng)建自定義應(yīng)用程序結(jié)構(gòu) 控制臺(tái)命令 核心驗(yàn)證器(Core Validators) 國(guó)際化 收發(fā)郵件 性能優(yōu)化 共享主機(jī)環(huán)境 模板引擎 集成第三方代碼 小部件 Bootstrap 小部件 Jquery UI 助手類 概述 Array 助手(ArrayHelper) Html 助手(Html) Url 助手(Url)
watak

Sessions 和 Cookies

Sessions 和 Cookies

[譯注:Session中文翻譯為會(huì)話,Cookie有些翻譯成小甜餅,不貼切,兩個(gè)單詞保留英文] Sessions 和 cookies 允許數(shù)據(jù)在多次請(qǐng)求中保持, 在純PHP中,可以分別使用全局變量$_SESSION?和$_COOKIE?來(lái)訪問(wèn),Yii將session和cookie封裝成對(duì)象并增加一些功能, 可通過(guò)面向?qū)ο蠓绞皆L問(wèn)它們。

Sessions

和?請(qǐng)求?和?響應(yīng)類似, 默認(rèn)可通過(guò)為yii\web\Session 實(shí)例的session?應(yīng)用組件?來(lái)訪問(wèn)sessions。

開(kāi)啟和關(guān)閉 Sessions

可使用以下代碼來(lái)開(kāi)啟和關(guān)閉session。

$session = Yii::$app->session;

// 檢查session是否開(kāi)啟 if ($session->isActive) ...

// 開(kāi)啟session$session->open();

// 關(guān)閉session$session->close();

// 銷毀session中所有已注冊(cè)的數(shù)據(jù)$session->destroy();

多次調(diào)用yii\web\Session::open() 和yii\web\Session::close() 方法并不會(huì)產(chǎn)生錯(cuò)誤, 因?yàn)榉椒▋?nèi)部會(huì)先檢查session是否已經(jīng)開(kāi)啟。

訪問(wèn)Session數(shù)據(jù)

To access the data stored in session, you can do the following: 可使用如下方式訪問(wèn)session中的數(shù)據(jù):

$session = Yii::$app->session;

// 獲取session中的變量值,以下用法是相同的:$language = $session->get('language');
$language = $session['language'];
$language = isset($_SESSION['language']) ? $_SESSION['language'] : null;

// 設(shè)置一個(gè)session變量,以下用法是相同的:$session->set('language', 'en-US');
$session['language'] = 'en-US';
$_SESSION['language'] = 'en-US';

// 刪除一個(gè)session變量,以下用法是相同的:$session->remove('language');
unset($session['language']);
unset($_SESSION['language']);

// 檢查session變量是否已存在,以下用法是相同的:if ($session->has('language')) ...
if (isset($session['language'])) ...
if (isset($_SESSION['language'])) ...

// 遍歷所有session變量,以下用法是相同的:foreach ($session as $name => $value) ...
foreach ($_SESSION as $name => $value) ...

補(bǔ)充: 當(dāng)使用session組件訪問(wèn)session數(shù)據(jù)時(shí)候,如果session沒(méi)有開(kāi)啟會(huì)自動(dòng)開(kāi)啟, 這和通過(guò)$_SESSION不同,$_SESSION要求先執(zhí)行session_start()。

當(dāng)session數(shù)據(jù)為數(shù)組時(shí),session組件會(huì)限制你直接修改數(shù)據(jù)中的單元項(xiàng),例如:

$session = Yii::$app->session;

// 如下代碼不會(huì)生效$session['captcha']['number'] = 5;
$session['captcha']['lifetime'] = 3600;

// 如下代碼會(huì)生效:$session['captcha'] = [
    'number' => 5,
    'lifetime' => 3600,
];

// 如下代碼也會(huì)生效:echo $session['captcha']['lifetime'];

可使用以下任意一個(gè)變通方法來(lái)解決這個(gè)問(wèn)題:

$session = Yii::$app->session;

// 直接使用$_SESSION (確保Yii::$app->session->open() 已經(jīng)調(diào)用)$_SESSION['captcha']['number'] = 5;
$_SESSION['captcha']['lifetime'] = 3600;

// 先獲取session數(shù)據(jù)到一個(gè)數(shù)組,修改數(shù)組的值,然后保存數(shù)組到session中$captcha = $session['captcha'];
$captcha['number'] = 5;
$captcha['lifetime'] = 3600;
$session['captcha'] = $captcha;

// 使用ArrayObject 數(shù)組對(duì)象代替數(shù)組$session['captcha'] = new \ArrayObject;
...
$session['captcha']['number'] = 5;
$session['captcha']['lifetime'] = 3600;

// 使用帶通用前綴的鍵來(lái)存儲(chǔ)數(shù)組$session['captcha.number'] = 5;
$session['captcha.lifetime'] = 3600;

為更好的性能和可讀性,推薦最后一種方案,也就是不用存儲(chǔ)session變量為數(shù)組, 而是將每個(gè)數(shù)組項(xiàng)變成有相同鍵前綴的session變量。

自定義Session存儲(chǔ)

yii\web\Session 類默認(rèn)存儲(chǔ)session數(shù)據(jù)為文件到服務(wù)器上,Yii提供以下session類實(shí)現(xiàn)不同的session存儲(chǔ)方式:

  • yii\web\DbSession: 存儲(chǔ)session數(shù)據(jù)在數(shù)據(jù)表中
  • yii\web\CacheSession: 存儲(chǔ)session數(shù)據(jù)到緩存中,緩存和配置中的緩存組件相關(guān)
  • yii\redis\Session: 存儲(chǔ)session數(shù)據(jù)到以redis?作為存儲(chǔ)媒介中
  • yii\mongodb\Session: 存儲(chǔ)session數(shù)據(jù)到MongoDB.

所有這些session類支持相同的API方法集,因此,切換到不同的session存儲(chǔ)介質(zhì)不需要修改項(xiàng)目使用session的代碼。

注意: 如果通過(guò)$_SESSION訪問(wèn)使用自定義存儲(chǔ)介質(zhì)的session,需要確保session已經(jīng)用yii\web\Session::open() 開(kāi)啟, 這是因?yàn)樵谠摲椒ㄖ凶?cè)自定義session存儲(chǔ)處理器。

學(xué)習(xí)如何配置和使用這些組件類請(qǐng)參考它們的API文檔,如下為一個(gè)示例 顯示如何在應(yīng)用配置中配置yii\web\DbSession將數(shù)據(jù)表作為session存儲(chǔ)介質(zhì)。

return [
    'components' => [
        'session' => [
            'class' => 'yii\web\DbSession',
            // 'db' => 'mydb',  // 數(shù)據(jù)庫(kù)連接的應(yīng)用組件ID,默認(rèn)為'db'.
            // 'sessionTable' => 'my_session', // session 數(shù)據(jù)表名,默認(rèn)為'session'.
        ],
    ],
];

也需要?jiǎng)?chuàng)建如下數(shù)據(jù)庫(kù)表來(lái)存儲(chǔ)session數(shù)據(jù):

CREATE TABLE session
(
    id CHAR(40) NOT NULL PRIMARY KEY,
    expire INTEGER,
    data BLOB
)

其中'BLOB' 對(duì)應(yīng)你選擇的數(shù)據(jù)庫(kù)管理系統(tǒng)的BLOB-type類型,以下一些常用數(shù)據(jù)庫(kù)管理系統(tǒng)的BLOB類型:

  • MySQL: LONGBLOB
  • PostgreSQL: BYTEA
  • MSSQL: BLOB

注意: 根據(jù)php.ini 設(shè)置的?session.hash_function,你需要調(diào)整id列的長(zhǎng)度, 例如,如果?session.hash_function=sha256?,應(yīng)使用長(zhǎng)度為64而不是40的char類型。

Flash 數(shù)據(jù)

Flash數(shù)據(jù)是一種特別的session數(shù)據(jù),它一旦在某個(gè)請(qǐng)求中設(shè)置后,只會(huì)在下次請(qǐng)求中有效,然后該數(shù)據(jù)就會(huì)自動(dòng)被刪除。 常用于實(shí)現(xiàn)只需顯示給終端用戶一次的信息,如用戶提交一個(gè)表單后顯示確認(rèn)信息。

可通過(guò)session應(yīng)用組件設(shè)置或訪問(wèn)session,例如:

$session = Yii::$app->session;

// 請(qǐng)求 #1// 設(shè)置一個(gè)名為"postDeleted" flash 信息$session->setFlash('postDeleted', 'You have successfully deleted your post.');

// 請(qǐng)求 #2// 顯示名為"postDeleted" flash 信息echo $session->getFlash('postDeleted');

// 請(qǐng)求 #3// $result 為 false,因?yàn)閒lash信息已被自動(dòng)刪除$result = $session->hasFlash('postDeleted');

和普通session數(shù)據(jù)類似,可將任意數(shù)據(jù)存儲(chǔ)為flash數(shù)據(jù)。

當(dāng)調(diào)用yii\web\Session::setFlash()時(shí), 會(huì)自動(dòng)覆蓋相同名的已存在的任何數(shù)據(jù), 為將數(shù)據(jù)追加到已存在的相同名flash中,可改為調(diào)用yii\web\Session::addFlash()。 例如:

$session = Yii::$app->session;

// 請(qǐng)求 #1// 在名稱為"alerts"的flash信息增加數(shù)據(jù)$session->addFlash('alerts', 'You have successfully deleted your post.');
$session->addFlash('alerts', 'You have successfully added a new friend.');
$session->addFlash('alerts', 'You are promoted.');

// 請(qǐng)求 #2// $alerts 為名為'alerts'的flash信息,為數(shù)組格式$alerts = $session->getFlash('alerts');

注意: 不要在相同名稱的flash數(shù)據(jù)中使用yii\web\Session::setFlash() 的同時(shí)也使用yii\web\Session::addFlash(), 因?yàn)楹笠粋€(gè)防范會(huì)自動(dòng)將flash信息轉(zhuǎn)換為數(shù)組以使新的flash數(shù)據(jù)可追加進(jìn)來(lái),因此, 當(dāng)你調(diào)用yii\web\Session::getFlash()時(shí),會(huì)發(fā)現(xiàn)有時(shí)獲取到一個(gè)數(shù)組,有時(shí)獲取到一個(gè)字符串, 取決于你調(diào)用這兩個(gè)方法的順序。

Cookies

Yii使用 yii\web\Cookie對(duì)象來(lái)代表每個(gè)cookie,yii\web\Request 和 yii\web\Response 通過(guò)名為'cookies'的屬性維護(hù)一個(gè)cookie集合,前者的cookie 集合代表請(qǐng)求提交的cookies, 后者的cookie集合表示發(fā)送給用戶的cookies。

讀取 Cookies

當(dāng)前請(qǐng)求的cookie信息可通過(guò)如下代碼獲?。?/p>

// 從 "request"組件中獲取cookie集合(yii\web\CookieCollection)$cookies = Yii::$app->request->cookies;

// 獲取名為 "language" cookie 的值,如果不存在,返回默認(rèn)值"en"$language = $cookies->getValue('language', 'en');

// 另一種方式獲取名為 "language" cookie 的值if (($cookie = $cookies->get('language')) !== null) {
    $language = $cookie->value;
}

// 可將 $cookies當(dāng)作數(shù)組使用if (isset($cookies['language'])) {
    $language = $cookies['language']->value;
}

// 判斷是否存在名為"language" 的 cookieif ($cookies->has('language')) ...
if (isset($cookies['language'])) ...

發(fā)送 Cookies

You can send cookies to end users using the following code: 可使用如下代碼發(fā)送cookie到終端用戶:

// 從"response"組件中獲取cookie 集合(yii\web\CookieCollection)$cookies = Yii::$app->response->cookies;

// 在要發(fā)送的響應(yīng)中添加一個(gè)新的cookie$cookies->add(new \yii\web\Cookie([
    'name' => 'language',
    'value' => 'zh-CN',
]));

// 刪除一個(gè)cookie$cookies->remove('language');
// 等同于以下刪除代碼unset($cookies['language']);

除了上述例子定義的 yii\web\Cookie::name 和 yii\web\Cookie::value 屬性 yii\web\Cookie 類也定義了其他屬性來(lái)實(shí)現(xiàn)cookie的各種信息,如 yii\web\Cookie::domain, yii\web\Cookie::expire 可配置這些屬性到cookie中并添加到響應(yīng)的cookie集合中。

注意: 為安全起見(jiàn)yii\web\Cookie::httpOnly 被設(shè)置為true,這可減少客戶端腳本訪問(wèn)受保護(hù)cookie(如果瀏覽器支持)的風(fēng)險(xiǎn), 更多詳情可閱讀?httpOnly wiki article?for more details.

Cookie驗(yàn)證

在上兩節(jié)中,當(dāng)通過(guò)request?和?response?組件讀取和發(fā)送cookie時(shí),你會(huì)喜歡擴(kuò)展的cookie驗(yàn)證的保障安全功能,它能 使cookie不被客戶端修改。該功能通過(guò)給每個(gè)cookie簽發(fā)一個(gè)哈希字符串來(lái)告知服務(wù)端cookie是否在客戶端被修改, 如果被修改,通過(guò)request組件的yii\web\Request::cookiescookie集合訪問(wèn)不到該cookie。

注意: Cookie驗(yàn)證只保護(hù)cookie值被修改,如果一個(gè)cookie驗(yàn)證失敗,仍然可以通過(guò)$_COOKIE來(lái)訪問(wèn)該cookie, 因?yàn)檫@是第三方庫(kù)對(duì)未通過(guò)cookie驗(yàn)證自定義的操作方式。

Cookie驗(yàn)證默認(rèn)啟用,可以設(shè)置yii\web\Request::enableCookieValidation屬性為false來(lái)禁用它,盡管如此,我們強(qiáng)烈建議啟用它。

注意: 直接通過(guò)$_COOKIE?和?setcookie()?讀取和發(fā)送的Cookie不會(huì)被驗(yàn)證。

當(dāng)使用cookie驗(yàn)證,必須指定yii\web\Request::cookieValidationKey,它是用來(lái)生成s上述的哈希值, 可通過(guò)在應(yīng)用配置中配置request組件。

return [
    'components' => [
        'request' => [
            'cookieValidationKey' => 'fill in a secret key here',
        ],
    ],
];
補(bǔ)充: yii\web\Request::cookieValidationKey 對(duì)你的應(yīng)用安全很重要, 應(yīng)只被你信任的人知曉,請(qǐng)不要將它放入版本控制中。
Artikel sebelumnya: Artikel seterusnya: