세션
- 드라이버 전제 조건
- 데이터베이스
- 세션
- 을 사용하여 데이터
- 글로벌 보조 기능 세션
- 모든 세션 데이터 가져오기
file
- 将 Session 存储在storage/framework/sessions
中。cookie
- Sessions 被存储在安全加密的 cookie 中。database
- Sessions 被存储在关系型数据库中。memcached
/redis
- Sessions 被存储在基于高速缓存的存储系统中。array
- Sessions 存储在 PHP 数组中,但不会被持久化。
- Redis
HTTP 세션 메커니즘
소개
HTTP 기반이기 때문에 애플리케이션은 상태 비저장이고, 세션은 여러 요청에 걸쳐 사용자에 대한 정보를 저장하는 방법을 제공하며, Laravel은 읽기 가능한 동일한 API를 통해 다양한 기본 백엔드 드라이버를 처리합니다. Memcached, Redis 등 널리 사용되는 데이터베이스를 지원합니다.
Configuration
Session의 구성 파일은 config/session.php
파일에 저장됩니다. 이 파일에서 사용할 수 있는 옵션을 검토하세요. 기본적으로 Laravel은 대부분의 애플리케이션에 대한 세션 드라이버를 file
로 구성합니다. 프로덕션 환경에서는 세션 성능을 더욱 향상시키기 위해 memcached
또는 redis
드라이버 사용을 고려할 수 있습니다. config/session.php
文件中。请务必查看此文件中对于你而言可用的选项。默认情况下,Laravel 为绝大多数应用程序配置的 Session 驱动为 file
。在生产环境中,你可以考虑使用 memcached
或 redis
驱动,让 Session 的性能更加出色。
Session driver
的配置预设了每个请求存储 Session 数据的位置。Laravel 自带了几个不错而且开箱即用的驱动:
{tip} 数组驱动一般用于 测试 并且防止存储在 Session 中的数据被持久化。
驱动程序先决条件
数据库
使用 database
作为 Session 驱动时,你需要创建一张包含 Session 各项数据的表。以下是使用 Schema
建表的例子:
Schema::create('sessions', function ($table) { $table->string('id')->unique(); $table->unsignedInteger('user_id')->nullable(); $table->string('ip_address', 45)->nullable(); $table->text('user_agent')->nullable(); $table->text('payload'); $table->integer('last_activity'); });
你可以使用 Artisan 命令 session:table
드라이버
구성은 각 요청에 대해 세션 데이터가 저장되는 위치를 미리 설정합니다. Laravel에는 여러 가지 훌륭하고 즉시 사용 가능한 드라이버가 함께 제공됩니다: file
- storage/framework/sessions /에 세션 저장 코드>에. 🎜🎜쿠키
- 세션은 안전하고 암호화된 쿠키에 저장됩니다. 🎜🎜데이터베이스
- 세션은 관계형 데이터베이스에 저장됩니다. 🎜🎜memcached
/ redis
- 세션은 캐시 기반 저장소 시스템에 저장됩니다. 🎜🎜배열
- 세션은 PHP 배열에 저장되지만 지속되지는 않습니다. 🎜🎜🎜🎜{tip} 어레이 드라이버는 일반적으로 세션에 저장된 데이터가 지속되는 것을 방지하고 테스트하는 데 사용됩니다. 🎜
🎜🎜🎜🎜🎜드라이버 전제 조건🎜🎜데이터베이스
🎜 데이터베이스
를 세션 드라이버로 사용하는 경우 다양한 세션 데이터가 포함된 테이블을 생성해야 합니다. 다음은 테이블을 생성하기 위해 Schema
를 사용하는 예입니다: 🎜php artisan session:table
php artisan migrate
🎜 Artisan 명령 session:table
을 사용하여 이 마이그레이션을 생성할 수 있습니다: 🎜<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class UserController extends Controller{
/**
* 展示给定用户的配置文件。
*
* @param Request $request
* @param int $id
* @return Response
*/
public function show(Request $request, $id)
{
$value = $request->session()->get('key');
//
}
}
🎜🎜Redis
Laravel에서 Redis를 세션 드라이버로 사용하기 전에 Composer를 통해 predis/predis
확장 패키지(~1.0)를 설치해야 합니다. 그런 다음 database
구성 파일에서 Redis 연결 정보를 구성합니다. session
구성 파일에서 connection
옵션을 사용하여 세션이 사용하는 Redis 연결을 지정할 수 있습니다. predis/predis
扩展包 (~1.0)。然后在 database
配置文件中配置 Redis 连接信息。在 session
配置文件中,connection
选项可用于指定 Session 使用哪个 Redis 连接。
使用 Session
获取数据
Laravel 中处理 Session 数据有两种主要方法:全局辅助函数 session
和通过一个 Request
实例。首先,我们来看看通过控制器方法类型提示一个 Request
实例来访问 session。控制器方法依赖项会通过 Laravel 服务容器 实现自动注入:
$value = $request->session()->get('key', 'default');
$value = $request->session()->get('key', function () {
return 'default';
});
当你从 Session 获取值时,你还可以传递一个默认值作为 get
方法的第二个参数。如果 Session 中不存在指定的键,便会返回这个默认值。若传递一个闭包作为 get
方法的默认值,并且所请求的键并不存在时,get
方法将执行闭包并返回其结果:
Route::get('home', function () {
// 获取 session 中的一条数据...
$value = session('key');
// 指定一个默认值...
$value = session('key', 'default');
// 在 Session 中存储一条数据...
session(['key' => 'value']);
});
全局辅助函数 Session
你也可以使用全局的 PHP 辅助函数 session
来获取和存储 Session 数据。 使用单个字符串类型的值作为参数调用辅助函数 session
时,它会返回该字该符串对应的 Session 键的值。当使用一个键值对数组作为参数调用辅助函数 session
时,传入的键值将会存储在 Session 中:
$data = $request->session()->all();
{tip} 通过 HTTP 请求实例操作 Session 与使用全局辅助函数 session
两者之间并没有实质上的区别。这两种方法都可以通过所有测试用例中可用的 assertSessionHas
方法进行 测试 。
获取所有的 Session 数据
如果你想要获取所有的 Session 数据,可以使用 all
方法:
if ($request->session()->has('users')) {
//
}
判断 Session 中是否存在某个值
要确定 Session 中是否存在某个值,可以使用 has
方法。如果该值存在且不为 null
,那么 has
方法会返回 true
:
if ($request->session()->exists('users')) {
//
}
要确定 Session 中是否存在某个值,即使其值为 null
,也可以使用 exists
方法。如果值存在,则 exists
方法返回 true
세션 사용
🎜데이터 가져오기
🎜Laravel에서 세션 데이터를 처리하는 두 가지 주요 방법이 있습니다: 전역 도우미 함수 session< / code> Request
인스턴스를 전달합니다. 먼저 Request
인스턴스에 대한 컨트롤러 메서드 유형 힌트를 통해 세션에 액세스하는 방법을 살펴보겠습니다. 컨트롤러 메서드 종속성은 Laravel 서비스 컨테이너를 통해 자동으로 주입됩니다. 🎜// 通过请求实例...
$request->session()->put('key', 'value');
// 通过全局辅助函数...
session(['key' => 'value']);
🎜 세션에서 값을 가져올 때 기본값을 get
메서드의 두 번째 매개변수로 전달할 수도 있습니다. 지정된 키가 세션에 없으면 이 기본값이 반환됩니다. 클로저가 get
메소드에 기본값으로 전달되고 요청된 키가 존재하지 않는 경우, get
메소드는 클로저를 실행하고 그 결과를 반환합니다: 🎜$request->session()->push('user.teams', 'developers');
< div name="f44185" data-unique="f44185">🎜🎜전역 보조 함수 세션🎜🎜전역 PHP 보조 함수 session
을 사용하여 세션 데이터를 얻고 저장할 수도 있습니다. 단일 문자열 값을 인수로 사용하여 도우미 함수 session
을 호출하면 해당 문자열에 해당하는 세션 키 값을 반환합니다. 키-값 쌍의 배열을 매개변수로 사용하여 도우미 함수 session
을 호출하면 들어오는 키 값이 세션에 저장됩니다. 🎜$value = $request->session()->pull('key', 'default');
🎜{tip} 세션을 조작하고 전역 도우미 함수 session
사용하기 둘 사이에는 실제 차이가 없습니다. 두 메서드 모두 모든 테스트 사례에서 사용할 수 있는 assertSessionHas
메서드를 통해 테스트할 수 있습니다. 🎜
🎜🎜모든 세션 데이터 가져오기🎜🎜모든 세션 데이터를 가져오려면 all
메소드를 사용하세요. :🎜$request->session()->flash('status', 'Task was successful!');
🎜🎜특정 값이 세션에 존재하는지 확인🎜🎜특정 값이 세션에 존재하는지 확인하려면 has<를 사용하세요. /코드> 메소드. 값이 존재하고 null
이 아닌 경우 has
메소드는 true
를 반환합니다. 🎜$request->session()->reflash();
$request->session()->keep(['username', 'email']);
🎜값이 세션에 존재하는지 확인하려면 , exists
메소드는 값이 null
인 경우에도 사용할 수 있습니다. 값이 존재하는 경우 exists
메서드는 true
를 반환합니다. 🎜$request->session()->forget('key');
$request->session()->flush();
🎜🎜🎜🎜🎜🎜데이터 저장
세션에 데이터를 저장하려면 put
메서드를 사용하거나 보조 함수 session
을 사용할 수 있습니다. put
方法,或者使用辅助函数 session
。
$request->session()->regenerate();
在 Session 数组中保存数据
push
方法可以将一个新的值添加到 Session 数组内。例如,假设 user.teams
这个键是包括团队名称的数组,你可以这样将一个新的值加入到数组中:
<?php
namespace App\Extensions;
class MongoSessionHandler implements \SessionHandlerInterface{
public function open($savePath, $sessionName) {}
public function close() {}
public function read($sessionId) {}
public function write($sessionId, $data) {}
public function destroy($sessionId) {}
public function gc($lifetime) {}
}
检索 & 删除一条数据
pull
方法可以只使用一条语句就从 Session 中检索并删除一条语句:
<?php
namespace App\Providers;
use App\Extensions\MongoSessionHandler;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\ServiceProvider;
class SessionServiceProvider extends ServiceProvider{
/**
* 执行服务的注册后启动
*
* @return void
*/
public function boot()
{
Session::extend('mongo', function ($app) {
// 返回实现 SessionHandlerInterface 的对象
return new MongoSessionHandler;
});
}
/**
* 在容器中注册绑定关系
*
* @return void
*/
public function register()
{
//
}
}
闪存数据
有时候你可能想在 Session 中保存数据用于下一次请求,这时你可以使用 flash
方法。使用这个方法保存在 Session 中的数据,只会保留到下一个 HTTP 请求到来之前,然后就会被删除。闪存数据主要用于短期的状态消息:
rrreee如果你需要在更多的请求中使用到该一次性数据,你可以使用 reflash
方法,该方法会将所有一次性请求保留到下一次请求。如果你想保存一次性数据,你可以用 keep
方法:
rrreee删除数据
forget
方法会从 Session 中删除指定数据,如果想从 Session 中删除所有数据,可以使用 flush
方法:
rrreee重新生成 Session ID
重新生成 session ID 通常是为了防止恶意用户利用 session fixation 对你的应用进行攻击。
如果你使用了内置函数 LoginController
,Laravel 会自动重新生成身份认证中的 Session ID。否则,你需要手动使用 regenerate
rrreee
세션 배열에 데이터 저장
push
메소드는 배열 내 세션에 새 값을 추가할 수 있습니다. . 예를 들어, user.teams
키가 팀 이름을 포함하는 배열이라고 가정하면 다음과 같이 배열에 새 값을 추가할 수 있습니다. rrreee데이터 검색 및 삭제
pull
메소드는 단 하나의 문만 사용하여 세션에서 문을 검색하고 삭제할 수 있습니다: rrreee때때로 다음 요청을 위해 세션에 데이터를 저장하고 싶은 경우 flash<를 사용할 수 있습니다. /코드> 메소드. 이 방법을 사용하여 Session에 저장된 데이터는 다음 HTTP 요청이 도착할 때까지만 보관되며 이후 삭제됩니다. 플래시 데이터는 주로 단기 상태 메시지에 사용됩니다. rrreee이 일회성 데이터를 더 많은 요청에 사용해야 하는 경우 relash
방법을 사용하면 모든 일회성 메시지를 저장할 수 있습니다. 요청 다음 요청까지 예약되어 있습니다. 일회성 데이터를 저장하려면 keep
메소드를 사용하세요: 🎜rrreee🎜🎜🎜🎜🎜데이터 삭제🎜🎜 forget
메서드는 세션에서 지정된 데이터를 삭제합니다. 세션에서 모든 데이터를 삭제하려면 flush를 사용할 수 있습니다. code> 방법: 🎜rrreee🎜🎜🎜🎜🎜세션 ID 재생성🎜🎜세션 ID 재생성은 일반적으로 악의적인 사용자가 세션 고정을 악용하는 것을 방지하려면 애플리케이션을 공격하십시오. 🎜🎜내장된 LoginController
기능을 사용하면 Laravel은 인증 시 세션 ID를 자동으로 다시 생성합니다. 그렇지 않으면 regenerate
메서드를 사용하여 세션 ID를 수동으로 다시 생성해야 합니다. 🎜rrreee🎜🎜🎜🎜🎜🎜🎜사용자 정의 세션 드라이버 추가🎜🎜🎜🎜🎜🎜🎜드라이버 구현
맞춤형 세션 드라이버는 SessionHandlerInterface
인터페이스를 구현해야 합니다. 이 인터페이스에는 구현해야 하는 몇 가지 간단한 메서드가 포함되어 있습니다. 다음은 MongoDB 구현의 일반적인 프로세스에 대한 예입니다. SessionHandlerInterface
接口。这个接口包含了一些我们需要实现的简单方法。下面是 MongoDB 实现的大概流程示例:
rrreee{tip} Laravel 默认没有附带一个用于包扩展的目录,你可以把它放在你喜欢的目录内。在上面这个例子中,我们创建了一个 Extensions
目录用于存放 MongoSessionHandler
。
由于以上方法并不是很容易理解,所以我们接下来快速过一遍每一个方法:
open
方法通常用于基于文件的 Session 存储系统。因为 Laravel 已经附带了一个 file
Session 驱动。所以你不需要在该方法中放置任何代码。PHP 要求必须要有这个方法的实现(这只是一个糟糕的接口设计),你只需要把这个方法置空。close
方法跟 open
方法相似,通常也可以被忽略。对大多数的驱动而言,此方法不是必须的。read
方法应当返回与给定的 $sessionId
相匹配的 Session 数据的字符串格式。在你的自定义的驱动中获取或存储 Session 数据时,不需要进行任何序列化或者其他编码,因为 Laravel 会自动为你执行序列化。write
方法将与 $sessionId
关联的给定的 $data
字符串写入到一些持久化存储系统,如 MongoDB、 Dynamo 等。再次重申,你不需要进行任何序列化或其他编码,因为 Laravel 会自动为你处理这些事情。destroy
方法将会从持久化存储中与删除与 $sessionId
相关的数据。gc
方法能销毁给定的 $lifetime
(UNIX 的时间戳)之前的所有数据。对本身拥有过期机制的系统如 Memcached 和 Redis 而言,该方法可以置空。
注册驱动
当实现驱动后,需要在框架中注册它。在 Laravel
后端添加额外的驱动,需要使用 Session
facade 的 extend
方法。你应该在 服务提供者 中的 boot
方法中调用 extend
方法。你可以在已有的 AppServiceProvider
或者另外创建一个服务提供者执行此操作:
rrreee驱动完成注册时,你可以在使用在配置文件 config/session.php
中使用 mongo
rrreee
{tip} Laravel에는 기본적으로 패키지 확장을 위한 디렉터리가 제공되지 않으므로 원하는 디렉터리에 넣을 수 있습니다. 위의 예에서는 MongoSessionHandler
를 저장하기 위해 Extensions
디렉터리를 만들었습니다. 위 방법은 이해하기 쉽지 않으므로 각 방법을 빠르게 살펴보겠습니다. open
방법 일반적으로 파일 기반 세션 저장소 시스템에 사용됩니다. Laravel에는 이미 file
세션 드라이버가 함께 제공되기 때문입니다. 따라서 이 메서드에는 코드를 넣을 필요가 없습니다. PHP는 이 메소드의 구현을 요구합니다(이것은 단지 나쁜 인터페이스 디자인입니다). 이 메소드를 비워두기만 하면 됩니다. close
메소드는 open
메소드와 유사하며 일반적으로 무시할 수 있습니다. 대부분의 드라이버에는 이 방법이 필요하지 않습니다. read
메소드는 주어진 $sessionId
와 일치하는 세션 데이터의 문자열 형식을 반환해야 합니다. 사용자 정의 드라이버에서 세션 데이터를 검색하거나 저장할 때 직렬화나 기타 코딩을 수행할 필요가 없습니다. Laravel이 자동으로 직렬화를 수행하기 때문입니다. write
메소드는 $sessionId
와 연관된 주어진 $data
문자열을 MongoDB와 같은 일부 영구 저장 시스템에 씁니다. 다이나모 등 다시 말하지만, Laravel이 이를 자동으로 처리하므로 직렬화나 기타 코딩을 수행할 필요가 없습니다. destroy
메소드는 영구 저장소에서 $sessionId
와 관련된 데이터를 삭제합니다. gc
메서드는 지정된 $lifetime
(UNIX 타임스탬프) 이전의 모든 데이터를 삭제합니다. Memcached 및 Redis와 같은 자체 만료 메커니즘이 있는 시스템의 경우 이 방법을 비워 둘 수 있습니다.
🎜🎜🎜🎜드라이버 등록🎜🎜드라이버가 구현하려면 프레임워크에 등록해야 합니다. Laravel
백엔드에 추가 드라이버를 추가하려면 Session
파사드의 extend
메서드를 사용해야 합니다. 서비스 제공자의 boot
메소드에서 extend
메소드를 호출해야 합니다. 기존 AppServiceProvider
에서 이 작업을 수행하거나 다른 서비스 공급자를 만들 수 있습니다. 🎜rrreee🎜드라이버가 등록을 완료하면 config/session.php
에서 사용하는 구성 파일을 사용할 수 있습니다. mongo
드라이버. 🎜🎜이 글은 🎜LearnKu.com🎜 웹사이트에 처음 게시되었습니다. 🎜🎜