> 백엔드 개발 > PHP 튜토리얼 > PHP의 Yii Framework_php 기술에서 쿠키 및 세션 기능의 관련 작업을 분석합니다.

PHP의 Yii Framework_php 기술에서 쿠키 및 세션 기능의 관련 작업을 분석합니다.

WBOY
풀어 주다: 2016-05-16 19:56:36
원래의
1090명이 탐색했습니다.

세션

요청 및 응답과 유사하게 세션은 기본적으로 yiiwebSession 인스턴스의 세션 애플리케이션 구성 요소를 통해 액세스할 수 있습니다.

세션 열기 및 닫기

다음 코드를 사용하여 세션을 열고 닫을 수 있습니다.

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

// 检查session是否开启 
if ($session->isActive) ...

// 开启session
$session->open();

// 关闭session
$session->close();

// 销毁session中所有已注册的数据
$session->destroy();

로그인 후 복사

yiiwebSession::open() 및 yiiwebSession::close() 메소드를 여러 번 호출해도 오류가 발생하지 않습니다. 이 메소드는 먼저 세션이 열려 있는지 확인하기 때문입니다.

세션 데이터 액세스

세션에 저장된 데이터에 액세스하려면 다음을 수행할 수 있습니다.

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

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

// 设置一个session变量,以下用法是相同的:
$session->set('language', 'en-US');
$session['language'] = 'en-US';
$_SESSION['language'] = 'en-US';

// 删除一个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) ...

로그인 후 복사
보충: 세션 구성 요소를 사용하여 세션 데이터에 액세스할 때 세션이 열리지 않으면 자동으로 열립니다. 이는 session_start()를 먼저 실행해야 하는 $_SESSION과 다릅니다.

세션 데이터가 배열인 경우 세션 구성 요소는 데이터의 단위 항목을 직접 수정하는 것을 제한합니다. 예:

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

// 如下代码不会生效
$session['captcha']['number'] = 5;
$session['captcha']['lifetime'] = 3600;

// 如下代码会生效:
$session['captcha'] = [
  'number' => 5,
  'lifetime' => 3600,
];

// 如下代码也会生效:
echo $session['captcha']['lifetime'];

로그인 후 복사
이 문제를 해결하려면 다음 해결 방법 중 하나를 사용하십시오.

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

// 直接使用$_SESSION (确保Yii::$app->session->open() 已经调用)
$_SESSION['captcha']['number'] = 5;
$_SESSION['captcha']['lifetime'] = 3600;

// 先获取session数据到一个数组,修改数组的值,然后保存数组到session中
$captcha = $session['captcha'];
$captcha['number'] = 5;
$captcha['lifetime'] = 3600;
$session['captcha'] = $captcha;

// 使用ArrayObject 数组对象代替数组
$session['captcha'] = new \ArrayObject;
...
$session['captcha']['number'] = 5;
$session['captcha']['lifetime'] = 3600;

// 使用带通用前缀的键来存储数组
$session['captcha.number'] = 5;
$session['captcha.lifetime'] = 3600;

로그인 후 복사
더 나은 성능과 가독성을 위해 세션 변수를 배열로 저장하지 않고 각 배열 항목을 동일한 키 접두사를 가진 세션 변수로 변환하는 마지막 솔루션을 권장합니다.

맞춤형 세션 저장

yiiwebSession 클래스는 기본적으로 세션 데이터를 서버에 파일로 저장합니다. Yii는 다양한 세션 저장 방법을 구현하기 위해 다음 세션 클래스를 제공합니다.

    yiiwebDbSession: 세션 데이터를 데이터 테이블에 저장
  • yiiwebCacheSession: 캐시에 세션 데이터를 저장합니다. 캐시는 구성의 캐시 구성 요소와 관련됩니다.
  • yiiredisSession: Redis에 세션 데이터를 저장 매체로 저장
  • yiimongodbSession: MongoDB에 세션 데이터를 저장합니다.
이러한 모든 세션 클래스는 동일한 API 메서드 세트를 지원하므로 다른 세션 저장 매체로 전환해도 해당 세션을 사용하는 프로젝트 코드를 수정할 필요가 없습니다.

참고: $_SESSION을 통해 사용자 정의 저장 매체를 사용하여 세션에 액세스하는 경우 yiiwebSession::open()을 사용하여 세션이 열렸는지 확인해야 합니다. 이는 사용자 정의 세션 저장 프로세서가 이 메소드에 등록되어 있기 때문입니다. .

이러한 구성 요소 클래스를 구성하고 사용하는 방법을 알아보려면 해당 API 설명서를 참조하세요. 다음은 데이터 테이블을 세션 저장 매체로 사용하도록 애플리케이션 구성에서 yiiwebDbSession을 구성하는 방법을 보여주는 예입니다.

return [
  'components' => [
    'session' => [
      'class' => 'yii\web\DbSession',
      // 'db' => 'mydb', // 数据库连接的应用组件ID,默认为'db'.
      // 'sessionTable' => 'my_session', // session 数据表名,默认为'session'.
    ],
  ],
];
로그인 후 복사
세션 데이터를 저장하려면 다음 데이터베이스 테이블도 생성해야 합니다.

CREATE TABLE session
(
  id CHAR(40) NOT NULL PRIMARY KEY,
  expire INTEGER,
  data BLOB
)
로그인 후 복사
여기서 'BLOB'은 선택한 데이터베이스 관리 시스템의 BLOB 유형에 해당합니다. 다음은 일반적으로 사용되는 일부 데이터베이스 관리 시스템의 BLOB 유형입니다.

    MySQL: LONGBLOB
  • PostgreSQL: BYTEA
  • MSSQL: BLOB
참고: php.ini에 설정된 session.hash_function에 따라 id 열의 길이를 조정해야 합니다. 예를 들어 session.hash_function=sha256인 경우 길이가 40이 아닌 64인 char 유형을 사용해야 합니다. 사용됩니다.

플래시 데이터

플래시 데이터는 특별한 종류의 세션 데이터입니다. 요청에 한 번 설정하면 다음 요청에서만 유효하며 이후 데이터는 자동으로 삭제됩니다. 사용자가 양식을 제출한 후 확인 정보를 표시하는 등 최종 사용자에게 한 번만 표시하면 되는 정보를 구현하는 데 자주 사용됩니다.

세션은 세션 애플리케이션 구성 요소를 통해 설정하거나 액세스할 수 있습니다. 예:

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

// 请求 #1
// 设置一个名为"postDeleted" flash 信息
$session->setFlash('postDeleted', 'You have successfully deleted your post.');

// 请求 #2
// 显示名为"postDeleted" flash 信息
echo $session->getFlash('postDeleted');

// 请求 #3
// $result 为 false,因为flash信息已被自动删除
$result = $session->hasFlash('postDeleted');

로그인 후 복사
일반 세션 데이터와 마찬가지로 어떤 데이터든 플래시 데이터로 저장할 수 있습니다.

yiiwebSession::setFlash()를 호출하면 동일한 이름의 기존 데이터가 자동으로 덮어쓰여집니다. 동일한 이름의 기존 플래시에 데이터를 추가하려면 대신 yiiwebSession::addFlash()를 호출하면 됩니다. 예:

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

// 请求 #1
// 在名称为"alerts"的flash信息增加数据
$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.');

// 请求 #2
// $alerts 为名为'alerts'的flash信息,为数组格式
$alerts = $session->getFlash('alerts');

로그인 후 복사
참고: 동일한 이름을 가진 플래시 데이터에 yiiwebSession::setFlash() 및 yiiwebSession::addFlash()를 사용하지 마십시오. 후자의 예방 조치는 플래시 정보를 배열로 자동 변환하여 추가된 새 플래시 데이터를 사용할 수 있도록 하기 때문입니다. 따라서 yiiwebSession::getFlash()를 호출하면 이 두 메소드를 호출하는 순서에 따라 배열을 얻을 때도 있고 문자열을 얻을 때도 있습니다.


쿠키

Yii는 yiiwebCookie 개체를 사용하여 각 쿠키를 나타냅니다. yiiwebRequest 및 yiiwebResponse는 'cookies'라는 속성을 통해 쿠키 컬렉션을 유지하며, 전자의 쿠키 컬렉션은 요청에 의해 제출된 쿠키를 나타냅니다. 사용자.

쿠키 읽기

현재 요청된 쿠키 정보는 다음 코드를 통해 얻을 수 있습니다.

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

// 获取名为 "language" cookie 的值,如果不存在,返回默认值"en"
$language = $cookies->getValue('language', 'en');

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

// 可将 $cookies当作数组使用
if (isset($cookies['language'])) {
  $language = $cookies['language']->value;
}

// 判断是否存在名为"language" 的 cookie
if ($cookies->has('language')) ...
if (isset($cookies['language'])) ...

로그인 후 복사

쿠키 보내기

다음 코드를 사용하여 최종 사용자에게 쿠키를 보낼 수 있습니다. 다음 코드를 사용하여 최종 사용자에게 쿠키를 보낼 수 있습니다.

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

// 在要发送的响应中添加一个新的cookie
$cookies->add(new \yii\web\Cookie([
  'name' => 'language',
  'value' => 'zh-CN',
]));

// 删除一个cookie
$cookies->remove('language');
// 等同于以下删除代码
unset($cookies['language']);

로그인 후 복사

除了上述例子定义的 yii\web\Cookie::name 和 yii\web\Cookie::value 属性 yii\web\Cookie 类也定义了其他属性来实现cookie的各种信息,如 yii\web\Cookie::domain, yii\web\Cookie::expire 可配置这些属性到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 对你的应用安全很重要, 应只被你信任的人知晓,请不要将它放入版本控制中。

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿