Sessions
の Cookie とセッション関数の関連操作を分析します。リクエストやレスポンスと同様に、セッションにはデフォルトで yiiwebSession インスタンスのセッション アプリケーション コンポーネントを通じてアクセスできます。
セッションの開閉
次のコードを使用してセッションを開いたり閉じたりできます。
リーリーyiiwebSession::open() メソッドと yiiwebSession::close() メソッドを複数回呼び出しても、メソッドはセッションが開いているかどうかを最初にチェックするため、エラーは発生しません。
セッションデータにアクセスする
セッションに保存されたデータにアクセスするには、次の手順を実行できます:
リーリー補足: session コンポーネントを使用してセッションデータにアクセスする場合、セッションが開かれていない場合は、最初に session_start() を実行する必要がある $_SESSION とは異なります。
セッション データが配列の場合、セッション コンポーネントにより、データ内のユニット項目を直接変更することが制限されます。例:
この問題を解決するには、次のいずれかの回避策を使用してください:
リーリーパフォーマンスと可読性を向上させるために、最後の解決策をお勧めします。これは、セッション変数を配列として保存するのではなく、各配列項目を同じキー プレフィックスを持つセッション変数に変換することです。
カスタマイズされたセッションストレージ
yiiwebSession クラスは、デフォルトでセッション データをサーバー上にファイルとして保存します。Yii は、さまざまなセッション ストレージ メソッドを実装するために次のセッション クラスを提供します。
注: $_SESSION を通じてカスタム ストレージ メディアを使用してセッションにアクセスする場合は、yiiwebSession::open() を使用してセッションが開かれていることを確認する必要があります。これは、カスタム セッション ストレージ プロセッサがこのメソッドに登録されているためです。
これらのコンポーネント クラスの設定方法と使用方法については、API ドキュメントを参照してください。以下は、データ テーブルをセッション ストレージ メディアとして使用するようにアプリケーション設定で yiiwebDbSession を設定する方法を示す例です。
リーリー
セッション データを保存するには、次のデータベース テーブルを作成する必要もあります:
「BLOB」は、選択したデータベース管理システムの BLOB タイプに対応します。以下は、一般的に使用されるデータベース管理システムの BLOB タイプです。
MySQL: LONGBLOB
フラッシュデータ
フラッシュデータは特別な種類のセッションデータであり、一度リクエストに設定されると、次のリクエストでのみ有効になり、その後データは自動的に削除されます。 ユーザーがフォームを送信した後に確認情報を表示するなど、エンド ユーザーに 1 回だけ表示する必要がある情報を実装するためによく使用されます。
セッションは、セッション アプリケーション コンポーネントを通じて設定またはアクセスできます。例:リーリー
通常のセッションデータと同様に、任意のデータをフラッシュデータとして保存できます。yiiwebSession::setFlash() を呼び出すと、同じ名前の既存のデータは自動的に上書きされ、同じ名前の既存のフラッシュにデータを追加するには、代わりに yiiwebSession::addFlash() を呼び出すことができます。 例:
リーリー
注: yiiwebSession::setFlash() と yiiwebSession::addFlash() を同じ名前のフラッシュ データに使用しないでください。後者の予防策を使用すると、新しいフラッシュ データを追加できるようにフラッシュ情報が自動的に配列に変換されます。したがって、 yiiwebSession::getFlash() を呼び出すと、これら 2 つのメソッドを呼び出す順序に応じて、配列を取得する場合もあれば、文字列を取得する場合もあります。クッキー
Yii は、yiiwebCookie オブジェクトを使用して各 cookie を表します。yiiwebRequest と yiiwebResponse は、「cookies」という名前の属性を通じて cookie コレクションを維持し、前者の cookie コレクションはリクエストによって送信された cookie を表し、後者の cookie コレクションはユーザーに送信された cookie を表します。 。
クッキーを読む
現在要求されている Cookie 情報は、次のコードを通じて取得できます: リーリー
クッキーを送信
次のコードを使用してエンド ユーザーに Cookie を送信できます: 次のコードを使用してエンド ユーザーに Cookie を送信できます: リーリー
上記の例で定義された yiiwebCookie::name 属性と yiiwebCookie::value 属性に加えて、yiiwebCookie クラスは、yiiwebCookie::domain、yiiwebCookie::expire など、さまざまな Cookie 情報を実装するための他の属性も定義します。属性を Cookie に追加し、応答 Cookie コレクションに追加します。
注意: 为安全起见yii\web\Cookie::httpOnly 被设置为true,这可减少客户端脚本访问受保护cookie(如果浏览器支持)的风险, 更多详情可阅读 httpOnly wiki article for more details.
Cookie验证
在上两节中,当通过request 和 response 组件读取和发送cookie时,你会喜欢扩展的cookie验证的保障安全功能,它能 使cookie不被客户端修改。该功能通过给每个cookie签发一个哈希字符串来告知服务端cookie是否在客户端被修改, 如果被修改,通过request组件的yii\web\Request::cookiescookie集合访问不到该cookie。
注意: Cookie验证只保护cookie值被修改,如果一个cookie验证失败,仍然可以通过$_COOKIE来访问该cookie, 因为这是第三方库对未通过cookie验证自定义的操作方式。
Cookie验证默认启用,可以设置yii\web\Request::enableCookieValidation属性为false来禁用它,尽管如此,我们强烈建议启用它。
注意: 直接通过$_COOKIE 和 setcookie() 读取和发送的Cookie不会被验证。
当使用cookie验证,必须指定yii\web\Request::cookieValidationKey,它是用来生成s上述的哈希值, 可通过在应用配置中配置request 组件。
return [ 'components' => [ 'request' => [ 'cookieValidationKey' => 'fill in a secret key here', ], ], ];
补充: yii\web\Request::cookieValidationKey 对你的应用安全很重要, 应只被你信任的人知晓,请不要将它放入版本控制中。